从文件夹1复制每个第n个文件到文件夹2的批处理文件?

4
我正在尝试从一个文件夹复制每个第30个文件到另一个文件夹,并自动化地处理其他文件夹的过程。我已经尝试了这篇主题中的批处理脚本:windows batch file script to copy every tenth file from a folder to another folder,但是当我运行文件时,只会得到“该命令的语法不正确”的错误提示(是的,我已经尝试了两个版本)。
我的文件夹名称中包含空格(这不是我的选择,也无法更改)。文件名为image00000X.jpg,是超过10万个文件(这就是为什么我真的希望脚本可以工作的原因)。
理想情况下,我希望能找到一种方法来设置脚本,以便在运行脚本时,只需更改输入和输出路径,而不必在不同的文件夹之间移动脚本。但是现在我会接受任何可用的方案,因为我已经尝试了几乎所有其他方法(包括robocopy、Xcopy、五个PowerShell脚本和几个BASH脚本)。
谢谢!
4个回答

4
这是一个简单的批处理文件:
:: copyNth.bat  interval  sourcePath  destinationPath
@echo off
setlocal
set /a n=0
for %%F in ("%~f2.\*") do 2>nul set /a "1/(n=(n+1)%%%1)" || copy "%%F" %3

示例用法:

copyNth 30 "c:\someSourcePath" "d:\someDestinationPath"

""%~f2. 是一种语法,允许您安全地将文件(或文件掩码)附加到任何提供的路径。

获取每个第N个值的技巧是让 SET /A 故意引发除以0的错误。我将错误消息重定向到nul,并在只有出现错误时才有条件地复制文件。

"

2

您也可以使用标准的for循环。我添加了一些参数,因此您可以随时更改源、目标和跳过计数:

param(
    [string]$Source = $( throw "You Must Specify Source Directory" ),
    [string]$Destination = $( throw "You Must Specify Destination Directory" ),
    [int]$Skip = 30
)

$Files = Get-ChildItem -Path $Source -File

for( $idx = 0; $idx -lt $Files.count; $idx += $Skip ) {
    $Files[$idx] | Move-Item -Destination $Destination
}

目的地是必填参数,但如果您未指定值,则跳过默认为30。要使用它,请将其命名为类似于move30th.ps1的名称,并像下面这样运行:

.\move30th.ps1 -Source "C:\Path\To\Files" -Destination "C:\New\Path" -Skip 30

嗨,Hunter,按照您的指示操作后,文件只是在记事本中打开。我完全按照您的代码进行复制,按照您建议的方式命名文件,使用相同的命令运行它——仅更改路径值——但它只是弹出带有move30th.ps1文件代码的记事本。没有文件在两个指定目录之间复制或移动。至少这是与我一直遇到的其他错误不同的错误。谢谢! - GK Masterson
听起来你正在尝试从cmd.exe窗口运行它(PS1文件的默认操作是在记事本中打开)。请尝试从powershell.exe窗口运行它。 - Hunter Eidson
1
谢谢!那不是确切的问题,但它确实帮助我找到了真正的问题——几周前当我更新 PowerShell 时,我的策略全部被从 AllSigned/RemoteSigned 更改为 Undefined,这意味着每个脚本都失败了。现在将它们正确设置回来,你的脚本运行得非常好。非常感谢! - GK Masterson

1
您可以使用简单的Do/While循环,例如:

$Files = Get-ChildItem C:\Path\To\Files
$i = 0
Do{
    $files[$i]|Move-Item -Dest C:\New\Path
    $i=$i+30
}While($i -le $files.count)

0
如果你想使用Python,你可以像这样做。
    import glob
    import shutil

    files = glob.glob("data/set1/*.png")
    n = 30

    for file in files[0::n]:
        shutil.move(file, "data/set3")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接