Запустите bat-файлы параллельно и дождитесь их завершения, прежде чем запускать новый набор bat-файлов

У меня есть ряд файлов bat, которые я хочу запустить параллельно, например:

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
...

Пока что я попробовал эту функцию :

: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

Но он только запустил первые 3 файла bat и остановился ... Как я могу решить эту проблему? Благодарность,

РЕДАКТИРОВАТЬ: Это содержимое файла program1_i.bat :

program1.exe input_i.txt

Он запустит program1.exe для каждого входного файла. То же самое для program2_i.bat .

Всего 4 ответа


Ваш вопрос немного расплывчат относительно ожидаемых результатов.

Я, однако, предполагаю, что вы хотите сделать что-то подобное.

start /wait program1_1.bat | start /wait program1_2.bat | start /wait program1_3.bat
start /wait program2_1.bat | start /wait program2_2.bat | start /wait program2_3.bat

Разделители с одним каналом позволяют нам запускать первые три команды параллельно и запускать следующие три команды только после того, как все первые три завершены, просто потому, что следующие 3 команды находятся в следующей batch строке с использованием start /wait


* Обновление * Решение, представленное здесь, прекрасно работает для параллельного запуска подпрограмм без необходимости ввода пользователя (пауза) или фиксированного времени ожидания между группами программ.

В сочетании с оригинальным ответом:

@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

Оригинальный ответ:

Это простой способ убедиться, что каждая группа программ завершена до следующей. Ошибка в методе списка задач состоит в том, что если запущены другие процессы cmd.exe, условие If может не соответствовать действительности, как ожидается, что приводит к зависанию сценария.

Опция start / wait не идеальна, так как вы намереваетесь запустить несколько программ одновременно - и если подпрограмма, на которой вы ждете, завершает работу раньше других подпрограмм, вы возвращаетесь к квадрату 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

Хорошо, вот что сработало для меня:

@echo off
setlocal enableextensions enabledelayedexpansion
call :InitDos
start program1_1.bat
start program1_2.bat
start program1_3.bat
call :waitForFinish
start program2_1.bat
start program2_2.bat
start program2_3.bat
call :waitForFinish
Goto:eof
: waitForFinish
set /a counter=0
for /f %%i in ('tasklist /NH /FI "Imagename eq cmd.exe"') do (
    set /a counter+=1
)
if !counter! GTR !init_count! Goto waitForFinish
goto :eof
: InitDos
set /a init_count=0
for /f %%i in ('tasklist /NH /FI "Imagename eq cmd.exe"') do (
    set /a init_count+=1
)
goto :eof

Попробуйте /WAIT включить команду start . Я предполагаю, что если вы поместите летучие мыши в сценарий, вызываемый с помощью переключателя ожидания, это может сработать.


Есть идеи?

10000