Question: I have a series of bat files that I want to run in parallel, for example:

```
start program1_1.bat
start program1_2.bat
start program1_3.bat
wait until program1 finished then
start program2_1.bat
start program2_2.bat
start program2_3.bat
wait until program2 finished then
...

```

So far, what I've tried is this [function](https://stackoverflow.com/questions/41584281/how-to-run-three-batch-files-in-parallel-and-run-another-three-batch-files-after):

```
:waitForFinish
set counter=0
for /f %%i in ('tasklist /NH /FI "Imagename eq cmd.exe') do set /a counter=counter+1
if counter GTR 2 Goto waitForFinish

```

But it just launched the first 3 bat files and stop... How can I solve this problem?
Thanks,

EDIT: This is the content of `program1_i.bat` file:

```
program1.exe input_i.txt

```

It will run program1.exe for each input file. The same for `program2_i.bat`.

Answer: 
**\* *Update* \*** 
The solution provided [here](https://stackoverflow.com/a/33585114/12343998) works nicely to achieve parallel running of subprograms without needing user entry (pause) or a fixed length Timeout between program groups.

Combined with the original answer:

```
@echo off

:controller

Call :launcher "program1_1.bat" "program1_2.bat" "program1_3.bat"

Call :launcher "program2_1.bat" "program2_2.bat" "program2_3.bat"

pause
EXIT

:launcher
For %%a in (%*) Do (
Start "+++batch+++" "%%~a"
)

:loop
    timeout /t 1 >nul
    tasklist /fi "windowtitle eq +++batch+++*" |find "cmd.exe" >nul && goto :loop

GOTO :EOF

```

---

***Original Answer:***

This is a simple way to ensure each group of programs is finished before the next. The fault in the tasklist method is that if there's other cmd.exe processes running, the If condition may not be true when expected, causing the script to hang.

The start /wait option is not ideal, as you intend on running multiple programs simultaneously - and if the subprogram you wait on finishes before the other subs, you're back to square 1.

```
@echo off

:controller

Call :launcher "program1_1.bat" "program1_2.bat" "program1_3.bat"

Call :launcher "program2_1.bat" "program2_2.bat" "program2_3.bat"

pause
EXIT

:launcher
For %%a in (%*) Do (
Start "" "%%~a"
)

pause
GOTO :EOF

```
Try `/WAIT` switch on `start` command. I guess if you wrap bats into script called with wait switch, it could work.