我目前有一个批处理脚本,我用它来将一个大型zip文件从网络文件夹复制到网络上的多台机器上。我需要并行执行这些副本,所以我有一个遍历地址的for循环并运行启动robocopy。这就是我所拥有的
for /F "tokens=*" %%A in (IPlist.txt) do (
start robocopy "\\networkfolder" \\%%A
)
问题是我需要在我刚刚复制到的所有机器上执行提取,但我需要等到机器人文件完成。我不能在for循环中使用start / wait,因为它会破坏并行副本。有没有办法可以强制脚本等到所有的机器人都完成了?或者可能是替代解决方案?
仅供参考:我不能首先在网络文件夹中提取,因为zip是很多小文件并且严重降低了传输速率。通过网络复制时,它需要是一个大文件。
答案 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