让许多进程在主进程之前等待

make many process wait before the main process

我有这个代码:

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 在执行之前等待所有进程?

停止使用 start。您使用开始不让他们等待。参见 start /?

使用 start/wstart /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.)

Syntax

START "title" [/D path] [options] "command" [parameters]

Options:

/W or /WAIT Start application and wait for it to terminate. (for an internal cmd command or a batch file this runs CMD /K)

@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

这是一个使用标志文件的过程,应该允许您并行进行复制。

首先,使用随机数生成器选择名称在临时目录中设置一个标志文件,并创建一个后缀为"a"的文件作为占位符。

接下来,并行启动您需要 运行 的每个进程,但按照以下格式将进程放入其自己的批处理中:

@ECHO OFF
SETLOCAL
ECHO robocopy %2 %3 %4 %5 %6 %7 %8 %9
PAUSE
DEL %1
EXIT

也就是说,第一个参数是标志文件的名称。在这种情况下,您将使用剩余参数执行 robocopypause只是模拟robocopy操作。

退出前最后的操作是删除flag文件

提交所有需要的作业后,删除 "a" 标志文件并执行 :wait 循环,直到保留 none 个标志文件,这表示每个子批处理文件已经结束。

然后 运行 您的 renane 程序(但请更改该名称,因为 rename 是批处理关键字)

timeout 命令防止批处理成为处理器占用;它只等待 1 秒。

另一种方法是使用相同的 wait 循环,但是通过执行 tasklist 并寻找以 robocopy.exe 开头的行来等待没有 robocopy 实例.等到没有这些行,再继续。