在继续之前,如何等待for循环完成批处理?

时间:2013-06-20 01:03:01

标签: batch-file

我目前有一个批处理脚本,我用它来将一个大型zip文件从网络文件夹复制到网络上的多台机器上。我需要并行执行这些副本,所以我有一个遍历地址的for循环并运行启动robocopy。这就是我所拥有的

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

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

问题是我需要在我刚刚复制到的所有机器上执行提取,但我需要等到机器人文件完成。我不能在for循环中使用start / wait,因为它会破坏并行副本。有没有办法可以强制脚本等到所有的机器人都完成了?或者可能是替代解决方案?

仅供参考:我不能首先在网络文件夹中提取,因为zip是很多小文件并且严重降低了传输速率。通过网络复制时,它需要是一个大文件。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 :(得分: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