我有多个文件位于多个目录/子文件夹中,需要将它们复制到多个目标。我目前使用 xcopy 执行此操作,但我逐行执行,因此有几行代码。一位朋友建议我改用数组,这就是我现在正在尝试做的。
我尝试了几种不同的方法来实现这个功能。我最后一种方法是这样的:
@echo off
set "mansource=somelocation\location1\sourcefolder"
set "mandest=someloacation\location2\destfolder
set src[0]="%MANSOURCE%\folderA\number1.pdf"
set dest[0]="%MANDEST%\folderB\number\1"
set src[1]="%MANSOURCE%\folderC\number2.pdf"
set dest[1]="%MANDEST%\folderD\number\2"
set /a "x=0"
for /r "%mansource%" %%f in (!src!) do xcopy "%%f" "!dest!" /v/y
pause
所以我知道这是错的,因为它不起作用,但我尝试过的其他方法也没有起作用。到目前为止,我在网上找到的关于在批处理中使用数组的每个示例都只有一个“do (echo)”命令来列出正在索引的内容或将语句打印到 cmd 提示符。我找不到任何有关实际功能(如复制)的示例。我确实有上述代码的变体,但它只导致无限循环,永远重复“0 个文件已复制”。
这个想法是将 src[0] 中的文件复制到 dest[0] 中的位置,然后将 src[1] 中的文件复制到 dest[0] 中的位置,依此类推。
任何意见,将不胜感激。
注意:使用 *.pdf 通配符不起作用,因为这些位置还有其他 pdf,而我只需要复制特定的 pdf。此外,每个文件的位置都不同,并且该文件的每个复制目标也不同。
答案1
由于您正在寻找批处理解决方案,另一种方法是创建一个为了循环遍历0
索引x
范围。为了循环将迭代索引数值并使用称呼命令来调用相关的子程序名称。
子程序标签名称除了索引号值外都将相同(如为了循环)附加到标签名称之后(即:idx0
、:idx1
、:idx2
等等)。
每个子程序应该有“相同”的变量名,但每个变量的值应该根据需要进行设置,但每个子程序必须以 结尾GOTO :EOF
。GOTO :EOF
将把控制权交还给调用者,并允许它完成其逻辑,因此在这种情况下支持/R循环将开始。
确保一旦您的逻辑结束,您就拥有它,EXIT
或者GOTO :EOF
它不会移动到下面的逻辑,例如仅用于执行的子程序标签称呼命令。
示例脚本
@echo off
set "mansource=somelocation\location1\sourcefolder"
set "mandest=someloacation\location2\destfolder"
FOR %%A IN (0,1) DO CALL :idx%%A
for /r "%mansource%" %%f in (!src!) do xcopy "%%f" "!dest!" /v/y
pause
::GOTO :EOF
EXIT
:idx0
set src="%MANSOURCE%\folderA\number1.pdf"
set dest="%MANDEST%\folderB\number\1"
GOTO :EOF
:idx1
set src="%MANSOURCE%\folderC\number2.pdf"
set dest="%MANDEST%\folderD\number\2"
GOTO :EOF
更多资源
答案2
批处理 + “数组”(实际上不是数组)很麻烦。:)
我建议使用 PowerShell,因为它支持正确的数组。例如:
$mansource = "somelocation\location1\sourcefolder"
$mandest = "someloacation\location2\destfolder"
# Create empty arrays
$sources = @()
$destinations = @()
# Add values to arrays
$sources += Join-Path $mansource "\folderA\number1.pdf"
$sources += Join-Path $mansource "\folderC\number2.pdf"
$destinations += Join-Path $mandest "\folderB\number\1"
$destinations += Join-Path $mandest "\folderD\number\2"
# Iterate over the Sources array and copy to the matching Destination.
for ($i = 0; $i -le $sources.length; $i++) {
Copy-Item $sources[$i] $destinations[$i] -Force
}