我正在尝试将每个第30个文件从一个文件夹复制到另一个文件夹,并自动执行其他文件夹的过程。我已经在这个线程中尝试了批处理脚本:windows batch file script to copy every tenth file from a folder to another folder并且只是得到"该命令中的语法不正确"当我运行该文件时(是的,我已尝试过两个版本)。
我的文件夹名称中有空格(不是我的选择,无法更改)。文件名为image00000X.jpg,是的,有超过100k的文件(这就是为什么我真的希望脚本能够工作)。
理想情况下,我想要一种设置脚本的方法,这样我就可以更改输入和输出路径,而不必在运行时在不同文件夹之间移动脚本,但我会解决因为我已经尝试了其他所有东西(包括robocopy,Xcopy,五个Powershell脚本和一些BASH脚本)。
谢谢!
答案 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
}
Source
和Destination
是必需的参数,但如果您没有指定值,则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")