rox*_*sap 6 windows command-line cmd batch-file call
我有一个主批处理文件,而不是调用其他4个批处理文件,所以我们可以并行运行.
例:
Main.bat
start call batch1.bat
start call batch2.bat
start call batch3.bat
start call batch4.bat
exit
Run Code Online (Sandbox Code Playgroud)
我希望Main.bat在所有batch1到batch 4停止执行后退出.通过这种方式,我可以获得批处理文件的总运行时间.问题是Main.bat甚至在batch1到batch4完成执行之前退出.
我尝试为每个批处理文件计算%errorlevel%,但即使4个.bat文件仍在运行,它总是返回0.
希望有人可以帮助我!
谢谢!:)
Aac*_*ini 14
我认为这是最简单,最有效的方式:
@echo off
echo %time%
(
start call batch1.bat
start call batch2.bat
start call batch3.bat
start call batch4.bat
) | set /P "="
echo %time%
Run Code Online (Sandbox Code Playgroud)
在此方法中,主文件中的等待状态是事件驱动的,因此它不消耗任何CPU时间!
编辑:添加了一些解释
set /P当( block )输出中的start任何命令都行时,该命令将终止,但命令不会在此cmd.exe中显示任何行.这样,set /P在start命令启动的所有进程结束之前,一直等待输入.此时,与之关联的管道( block )关闭,因此set /PStdin关闭,set /P操作系统终止命令.
尝试一下。
@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
Run Code Online (Sandbox Code Playgroud)
为新进程提供一个唯一的标题字符串,然后检查标题中是否带有该字符串的任何进程正在运行:
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
Run Code Online (Sandbox Code Playgroud)
(find用于,因为tasklist不会返回有用的错误级别)