如何在退出之前等待所有batch file完成?

我有一个主batch file,而不是调用4个其他batch file,所以我们可以并行运行。

例:

Main.bat

start call batch1.bat start call batch2.bat start call batch3.bat start call batch4.bat exit 

在所有批1到批4停止执行之后,我想让Main.bat退出。 这样我就可以得到batch file的总运行时间。 问题是Main.bat甚至在batch1到batch4完成执行之前退出。

我试图为每个batch file计算%errorlevel%,但即使4个.bat文件仍在运行,它总是返回0。

希望有人能帮助我!

谢谢! 🙂

我认为这是最简单和最有效的方法:

 @echo off echo %time% ( start call batch1.bat start call batch2.bat start call batch3.bat start call batch4.bat ) | set /P "=" echo %time% 

在这个方法中,主文件中的等待状态是事件驱动的 ,所以它不消耗任何CPU时间!

编辑一些解释添加

set /P命令将在( block )中的任何命令输出一行时终止,但在此cmd.exe中start命令不显示任何行。 这样, set /P会一直等待input,直到start命令启动的所有进程结束。 此时与( block )关联的pipe道closures,所以set /P标准被closures, set /P命令被操作系统终止。

为新进程提供一个唯一的标题string,然后检查标题中是否有该string的任何进程正在运行:

 start "+++batch+++" batch1.bat start "+++batch+++" batch2.bat start "+++batch+++" batch3.bat start "+++batch+++" batch4.bat :loop timeout /t 1 >nul tasklist /fi "windowtitle eq +++batch+++*" |find "cmd.exe" >nul && goto :loop echo all tasks finished 

(使用find ,因为tasklist没有返回有用的错误级别)

试试这个。

 @echo off echo %time% start "" /wait cmd /c bat1.bat |start "" /wait cmd /c bat2.bat |start "" /wait cmd /c bat3.bat echo %time% pause 

你可以让batch1..batchn4在完成运行时创build标志文件。

例如在batch1.bat中echo y > flag1 flag1

然后在主batch file中退出之前检查是否存在标志文件。 在主batch file的结尾处,您需要某种睡眠实用程序来执行此类操作:

 IF EXIST flag1 GOTO check2 sleep <for a short amount of time> goto check1 :check2 IF EXIST flag2 GOTO check3 sleep <for a short amount of time> goto check2 :check3 IF EXIST flag3 GOTO check4 sleep <for a short amount of time> goto check3 :check4 IF EXIST flag4 GOTO xit sleep <for a short amount of time> goto check4 :xit 

这种技术的缺点是你的计时会有一点点,因为你正在轮询标志文件,而不是事件驱动。 这可能是也可能不是你的情况的问题。 以这种方式batch file相当有限。 尝试在PowerShell或Python或其他更强大的脚本语言中执行它可能会更好。