скопировать массив в командный файл

726
Mike Van Dunk

У меня есть несколько файлов, расположенных в нескольких каталогах / подпапках, которые мне нужно скопировать в несколько мест назначения. В настоящее время я делаю это с помощью 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
Первое, что бросается в глаза, вы пропустили заключительную кавычку в строке 3; это опечатка здесь или в самом коде? Ƭᴇcʜιᴇ007 7 лет назад 1
Это опечатка здесь. Mike Van Dunk 7 лет назад 0

2 ответа на вопрос

0
Ƭᴇcʜιᴇ007

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

Я бы предложил вместо этого использовать 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 } 
Да, я думал об использовании PowerShell, но я бы предпочел использовать пакет для этой конкретной цели, если смогу. Mike Van Dunk 7 лет назад 0
0
Pimp Juice IT

Поскольку вы ищете пакетное решение, еще один способ сделать это - создать цикл FOR с диапазоном индекса 0thru 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 

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