我有这段代码:
Start "" robocopy F:\DATA1 D:\Backup\
Start "" robocopy G:\DATA2 D:\Backup\
Start "" robocopy H:\DATA3 D:\Backup\
Start "" D:\Backup\rename.bat
如何在执行前使rename.bat
等待所有进程?
答案 0 :(得分:1)
停止使用start
。你使用start不要让他们等待。请参阅start /?
。
答案 1 :(得分:1)
将start
与/w
或start /wait
选项一起使用。
Start "" /w robocopy F:\DATA1 D:\Backup\
Start "" /w robocopy G:\DATA2 D:\Backup\
Start "" /w robocopy H:\DATA3 D:\Backup\
Start "" D:\Backup\rename.bat
现在rename.bat
在前面的命令完成之前不会运行。
来源Start a program, command or batch script (opens in a new window.)
<强>语法强>
START "title" [/D path] [options] "command" [parameters]
选项:强>
/W
或/WAIT
启动应用程序并等待它终止。 (对于内部cmd命令或批处理文件,它运行CMD /K
)
答案 2 :(得分:0)
@ECHO OFF
SETLOCAL
:: first method - use flag files (qtest.bat substituted for robocopy)
:: make a tempfile
:maketemp
SET "tempfile=%temp%\%random%"
IF EXIST "%tempfile%*" (GOTO maketemp) ELSE (ECHO.>"%tempfile%a")
COPY NUL "%tempfile%b">nul&START "" qtestd "%tempfile%b" f:\data1 d:\backup\
COPY NUL "%tempfile%c">nul&START "" qtestd "%tempfile%c" g:\data2 d:\backup\
COPY NUL "%tempfile%d">nul&START "" qtestd "%tempfile%d" h:\data3 d:\backup\
del "%tempfile%a"
:wait
timeout /t 1 >nul
FOR %%a IN (b c d) DO IF EXIST "%tempfile%%%a" GOTO wait
ECHO Start "" D:\Backup\rename.bat
GOTO :EOF
这是一个使用标记文件的过程,应该允许您并行执行副本。
首先,通过使用随机数生成器选择名称,在临时目录中设置一个标志文件,并创建一个带后缀的文件&#34; a&#34;作为一名管理员。
接下来,启动您需要并行运行的每个流程,但是按以下格式将流程放入自己的批处理中:
@ECHO OFF
SETLOCAL
ECHO robocopy %2 %3 %4 %5 %6 %7 %8 %9
PAUSE
DEL %1
EXIT
也就是说,第一个参数是标志文件的名称。在这种情况下,您正在使用其余参数执行 robocopy 。 pause
只是模拟robocopy
操作。
退出前的最后一个操作是删除标记文件。
提交了所有必需的工作后,删除&#34; a&#34; flagfile并执行:wait
循环,直到没有任何标志文件仍然存在,这表示每个辅助批处理文件已经结束。
然后运行您的renane程序(但请更改该名称,因为rename
是批处理关键字)
timeout
命令可防止批处理成为处理程序占用的;它等了1秒钟。
另一种方法是使用相同的wait
循环,但通过执行robocopy
并查找以tasklist
开头的行,等待没有robocopy.exe
个实例。等到没有这样的行,然后继续。