如何在退出之前等待所有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或其他更强大的脚本语言中执行它可能会更好。