2013-06-20 112 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 
相關問題