How to wait all batch files to finish before exiting?
I think this is the simplest and most efficient way:
@echo offecho %time%( start call batch1.bat start call batch2.bat start call batch3.bat start call batch4.bat) | set /P "="echo %time%
In this method the waiting state in the main file is event driven, so it does not consume any CPU time!
EDIT: Some explanations added
The set /P
command would terminate when anyone of the commands in the ( block )
outputs a line, but start
commands don't show any line in this cmd.exe. This way, set /P
keeps waiting for input until all processes started by start
commands ends. At that point the pipe line associated to the ( block )
is closed, so the set /P
Stdin is closed and set /P
command is terminated by the OS.
give a unique title string to the new processes, then check if any processes with this string in the title are running:
start "+++batch+++" batch1.batstart "+++batch+++" batch2.batstart "+++batch+++" batch3.batstart "+++batch+++" batch4.bat:loop timeout /t 1 >nul tasklist /fi "windowtitle eq +++batch+++*" |find "cmd.exe" >nul && goto :loopecho all tasks finished
(find
is used, because tasklist
does not return a helpful errorlevel)
Give this a try.
@echo offecho %time%start "" /wait cmd /c bat1.bat |start "" /wait cmd /c bat2.bat |start "" /wait cmd /c bat3.batecho %time%pause