4

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

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

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

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

仅供参考:我无法先在网络文件夹中解压缩,因为 zip 包含很多小文件,并且严重降低了传输速度。通过网络复制时,它需要是一个大文件。

4

3 回答 3

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
于 2013-06-20T02:30:51.637 回答
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

这实际上计算了一次运行的可执行文件的数量,但它可以很容易地调整为仅检查是否存在。(在此代码的情况下,它正在检查以确保某个数字正在运行。)

于 2013-06-20T01:37:41.837 回答
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
于 2014-03-13T00:52:16.293 回答