2

У меня есть несколько файлов, расположенных в нескольких каталогах / подпапках, которые мне нужно скопировать в несколько мест назначения. В настоящее время я делаю это с помощью 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] и так далее.

Любой совет будет принят во внимание.

Примечание. Использование подстановочного знака * .pdf не будет работать, так как в этих местах есть другие файлы pdf, и мне нужно скопировать только определенные файлы. Кроме того, каждый файл находится в другом месте по сравнению со следующим, и каждый пункт назначения копии для этого файла также отличается.

2 ответа2

0

Пакет + "массивы" (которые на самом деле не являются массивами) - это боль. :)

Я бы предложил вместо этого использовать 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
}
0

Поскольку вы ищете пакетное решение, еще один способ сделать это - создать цикл FOR с диапазоном индекса от 0 до x . Цикл FOR будет перебирать значения номера индекса и использовать команду CALL для вызова коррелированных имен подпрограмм.

Все имена меток подпрограмм будут одинаковыми, за исключением того, что значения номеров индексов (как в цикле FOR ) добавляются к именам меток (то есть :idx0 :idx1 :idx2 и т.д.).

Каждая подпрограмма должна иметь "одинаковые" имена переменных внутри, но значения каждой из них должны быть установлены соответствующим образом, но каждая подпрограмма должна заканчиваться GOTO :EOF . GOTO :EOF передаст управление вызывающей стороне и позволит ему завершить свою логику, поэтому в этом случае начнется цикл FOR /R.

Убедитесь, что после того, как ваша логика закончится, у вас будет EXIT или GOTO :EOF чтобы она не двигалась под логикой, такой как метки подпрограмм, предназначенные только для выполнения с командами CALL .

Пример скрипта

@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

Дополнительные ресурсы

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .