2013-06-20 82 views
4

我目前有一个批处理脚本,用于将网络文件夹中的一个大型zip文件复制到网络上的多台机器上。我需要并行执行这些副本,所以我有一个循环遍历地址并运行启动robocopy。下面是我有如何在继续之前等待for循环完成批处理?

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

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

的问题是,我需要在所有我只是复制到机器上执行的摘录,但我需要等到robocopies已经完成。因为破坏了并行副本,所以我无法在for循环中使用start/wait。有什么方法可以强制脚本等到所有robocopies完成?或者可能是一个备用解决方案

仅供参考:我无法首先提取网络文件夹,因为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 
相关问题