Waiting for parallel batch scripts

11,201

Solution 1

This is easily done using a much simplified version of a solution I provided for Parallel execution of shell processes. Refer to that solution for an explanation of how the file locking works.

@echo off
setlocal
set "lock=%temp%\wait%random%.lock"

:: Launch one and two asynchronously, with stream 9 redirected to a lock file.
:: The lock file will remain locked until the script ends.
start "" cmd /c 9>"%lock%1" one.bat
start "" cmd /c 9>"%lock%2" two.bat

:Wait for both scripts to finish (wait until lock files are no longer locked)
1>nul 2>nul ping /n 2 ::1
for %%N in (1 2) do (
  ( rem
  ) 9>"%lock%%%N" || goto :Wait
) 2>nul

::delete the lock files
del "%lock%*"

:: Launch three and four asynchronously
start "" cmd /c three.bat
start "" cmd /c four.bat

Solution 2

I had this same dilemma. Here's the way I solved this issue. I used the Tasklist command to monitor whether the process is still running or not:

:Loop
tasklist /fi "IMAGENAME eq <AAA>" /fi "Windowtitle eq <BBB>"|findstr /i /C:"<CCC>" >nul && (
timeout /t 3
GOTO :Loop
)
echo one.bat has stopped
pause

You'll need to tweak the

<AAA>, <BBB>, <CCC>

values in the script so that it's correctly filtering for your process.

Hope that helps.

Solution 3

Create a master.bat file that starts one.bat and two.bat. When one.bat and two.bat end correctly, they echo to file they have finished

if errorlevel 0 echo ok>c:\temp\OKONE
if errorlevel 0 echo ok>c:\temp\OKTWO

Then the master.bat wait for the existence of the two files

del c:\temp\OKONE
del c:\temp\OKTWO
start one.bat
start two.bat
:waitloop
if not exist c:\temp\OKONE (
    sleep 5
    goto waitloop
    )
if not exist c:\temp\OKTWO (
    sleep 5
    goto waitloop
    )
start three.bat
start four.bat

Another way is to try with the /WAIT flag

start /WAIT one.bat
start /WAIT two.bat

but you don't have any control on errors.

Here's some references

http://malektips.com/xp_dos_0002.html

http://ss64.com/nt/sleep.html

http://ss64.com/nt/start.html

Solution 4

Just adding another way, maybe the shortest.

(one.cmd | two.cmd) && (three.cmd | four.cmd)

Concept is really straight forward. Start one and 2 in paralel, once done and errorlevel is 0 run three and four.

Share:
11,201

Related videos on Youtube

sudhakar m
Author by

sudhakar m

Updated on June 17, 2022

Comments

  • sudhakar m
    sudhakar m almost 2 years

    I have 4 batch files. I want to run one.bat and two.bat at once, concurrently. After completion of these two batch files, three.bat and four.bat should run at once, in parallel. I tried with many ways but mot works fine.

    Can anyone help me over this?

  • James K
    James K over 11 years
    start /WAIT xxx waits for xxx to finish before letting execution pass to the next line in the batch file. So one.bat would have to finish before two.bat could even start. You COULD assume that one.bat will always finish first and use start /wait two.bat, but that's quite an assumption. BTW, you don't have to start four.bat, you could just call four.bat, (or even leave off the call if nothing else is to be done after executing four.bat ) and save the memory that would be used by launching another command processor.
  • Parag Doke
    Parag Doke over 11 years
    Marked as useful for the approach shared before the mention of start /WAIT. Also make sure you delete those files from master.bat before you start one.bat and two.bat.
  • Alessandro Da Rugna
    Alessandro Da Rugna over 11 years
    Thank you for the suggestion, edited the post accordingly :-)
  • Future
    Future about 9 years
    exactly what i need. Thank you!
  • macetw
    macetw over 8 years
    This worked great for my needs. Thank you! What I also needed was to ensure those commands ran with success. So it looks more like: start "" 9>"%lock%1" CMD /C "one.bat > one-log.txt 2>&1 && echo success > one-success.txt" ... then, ensure that each -success.txt file exists, and type the output from each -log.txt.
  • SketchBookGames
    SketchBookGames over 7 years
    @macetw i would like to see your solution that checks for success in a code block so that it is readable. Could you edit the answer above or submit your code block as an answer?
  • phuclv
    phuclv about 7 years
  • dbenham
    dbenham about 7 years
    @LưuVĩnhPhúc - Absolutely, though you might want to also throw in the /nobreakoption. However, TIMEOUT is not available to XP, and that had a significant market share when this answer was written. Thankfully, XP is becoming less and less prevalent now that it is no longer supported.
  • phonetagger
    phonetagger almost 7 years
    Regarding your wait line: 1>nul 2>nul ping /n 2 ::1 What does the ::1 do?
  • phuclv
    phuclv over 6 years
    @phonetagger that's the IPv6 loopback address