在批处理文件中复制数组

在批处理文件中复制数组

我有多个文件位于多个目录/子文件夹中,需要将它们复制到多个目标。我目前使用 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 :EOFGOTO :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
}

相关内容