2013-06-20 7 views
4

В настоящее время у меня есть пакетный скрипт, который я использую для копирования одного большого zip-файла из сетевой папки на несколько компьютеров в сети. Мне нужно делать эти копии параллельно, поэтому у меня есть цикл for, который проходит через адреса и запускается с помощью robocopy. Вот что я получилКак дождаться завершения цикла for в пакете, прежде чем продолжить?

for /F "tokens=*" %%A in (IPlist.txt) do (

    start robocopy "\\networkfolder" \\%%A 
) 

Проблема заключается в том, что мне нужно выполнить выписку на всех машинах я просто скопированных на но мне нужно ждать, пока robocopies не закончили. Я не могу использовать start/wait в цикле for, так как это разрушает параллельную копию. Есть ли способ заставить сценарий ждать, пока все robocopies не закончатся? или альтернативное решение?

FYI: Я не могу извлечь в сетевой папке сначала, так как zip - это много маленьких файлов и сильно замедляет скорость передачи. При копировании по сети это должен быть один большой файл.

+2

Может быть, вы можете использовать 'tasklist' команду в цикле, чтобы проверить, есть ли Robocopy процессы еще бег, и если да, спите некоторое время и повторите попытку? –

ответ

0

Вот код, я валяюсь (синтаксис внутри пакетного файла):

SETLOCAL ENABLEDELAYEDEXPANSION 
set robocopycount=0 

:loop 
for /F "usebackq" %%e IN (`tasklist /FI "IMAGENAME eq robocopy.exe"`) do if %%e==robocopy.exe set /A robocopycount=!robocopycount!+1 

if %robocopycount% GEQ 1 goto continue 
rem goto loop 

:continue 

Это на самом деле подсчитывает количество исполняемых файлов, работающих сразу, но она может быть легко адаптирована просто проверить существование. (В случае этого кода была проверка, чтобы убедиться, что определенное число бежит.)

2
setlocal EnableDelayedExpansion 
set number=0 
for /F "tokens=*" %%A in (IPlist.txt) do (
    set /A number+=1 
    echo Flag > roboRunning.!number! 
    start robocopy "\\networkfolder" \\%%A ^& del roboRunning.!number! 
) 

:wait 
if exist roboRunning.* goto wait 

echo All robocopy processes have finished here 
0
SETLOCAL EnableDelayedExpansion 
SET num=0 
FOR /F "tokens=*" %%A in (IPlist.txt) do (
    SET /A num+=1 
    ECHO Flag > RoboRunNum.!num! 
    START robocopy "\\networkfolder" \\%%A ^& del RoboRunNum.!num! 
) 

:Check 
if exist RoboRunNum.* GOTO CHECK 

echo Robocopy Processes fave Finished 
Смежные вопросы