用于将每个第n个文件从folder1复制到folder2的批处理文件?

时间:2015-01-28 02:52:47

标签: windows file powershell batch-file copy

我正在尝试将每个第30个文件从一个文件夹复制到另一个文件夹,并自动执行其他文件夹的过程。我已经在这个线程中尝试了批处理脚本:windows batch file script to copy every tenth file from a folder to another folder并且只是得到"该命令中的语法不正确"当我运行该文件时(是的,我已尝试过两个版本)。

我的文件夹名称中有空格(不是我的选择,无法更改)。文件名为image00000X.jpg,是的,有超过100k的文件(这就是为什么我真的希望脚本能够工作)。

理想情况下,我想要一种设置脚本的方法,这样我就可以更改输入和输出路径,而不必在运行时在不同文件夹之间移动脚本,但我会解决因为我已经尝试了其他所有东西(包括robocopy,Xcopy,五个Powershell脚本和一些BASH脚本)。

谢谢!

4 个答案:

答案 0 :(得分:3)

这是一个简单的批处理文件:

:: 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

sampleUsage:

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

"%~f2.syntax that allows you to safely append a file (or file mask) to any provided path

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

答案 1 :(得分: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
}

SourceDestination是必需的参数,但如果您没有指定值,则Skip默认为30。要使用,请将其命名为move30th.ps1,并按以下方式运行:

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

答案 2 :(得分:0)

你可以做一个简单的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)

答案 3 :(得分: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")