我有一个主批处理文件,而不是调用其他4个批处理文件,所以我们可以并行运行。
示例:
Main.bat
start call batch1.bat
start call batch2.bat
start call batch3.bat
start call batch4.bat
exit
我希望在所有batch1到batch 4停止执行后退出Main.bat。通过这种方式,我可以获得批处理文件的总运行时间。问题是Main.bat甚至在batch1到batch4完成执行之前退出。
我尝试为每个批处理文件计算%errorlevel%,但即使4 .bat文件仍在运行,它总是返回0。
希望有人可以帮助我!
谢谢! :)
答案 0 :(得分:11)
我认为这是最简单,最有效的方式:
@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 )
命令将终止,但start
命令在此cmd.exe中不显示任何行 < / em>的。这样,set /P
一直等待输入,直到start
命令启动的所有进程结束。此时,与( block )
关联的管道线将关闭,因此set /P
Stdin将关闭,并且set /P
命令将被操作系统终止。
答案 1 :(得分:4)
为新进程提供唯一的标题字符串,然后检查标题中是否有任何带有此字符串的进程正在运行:
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
没有返回有用的错误级别)
答案 2 :(得分:3)
试一试。
@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
答案 3 :(得分:0)
你可以让batch1..batchn4在完成运行后创建标志文件。
例如batch1.bat中的echo y > flag1
然后在主批处理文件中检查退出前是否存在标志文件。您需要某种睡眠实用程序来在主批处理文件的末尾执行类似的操作:
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
这种技术的缺点是你的时间会稍微偏离,因为你正在查询标志文件而不是事件驱动。在您的情况下,这可能是也可能不是问题。批处理文件以这种方式非常有限。在PowerShell或python或其他一些更强大的脚本语言中尝试这样做可能会更好。
答案 4 :(得分:0)
考虑使用Powershell中的“作业”系列命令代替使用批处理脚本。
答案 5 :(得分:0)
没有人提到这种解决方案,我认为这是最好的。将其放在脚本末尾,如有必要,请修改进程名称和搜索字符串。
这包括进行远程工作所必需的修改,这很令人头疼。最初,我使用任务列表而不是WMIC,并检查了在调用START时定义的命名窗口标题,但是在远程使用它时,在任务列表中windowName是N / A。在我们的情况下,powershell命令比超时更好,这需要我们从Jenkins代理处运行。
:WAIT_FOR_FINISH
ECHO Waiting...
powershell -command "Start-Sleep -Milliseconds 5000" > nul
WMIC PROCESS WHERE Name="cmd.exe" GET commandline | findstr "searchString1 searchString 2" > nul && goto :WAIT_FOR_FINISH
ECHO.
ECHO Processes are Complete!
ECHO.