2017-01-11 3 views
-3

У меня есть около 24 пакетных файлов, которые я должен запускать по 3 за один раз и после финиша первым 3, тогда я буду запускать следующие 3 файла и так далее.Как запустить три пакетных файла параллельно и запустить еще три пакетных файла после завершения первого набора?

Предположим, у меня есть файлы, такие как 1.bat, 2.bat, 3.bat и т. Д. Мне нужно, чтобы они запускали первые 3 при завершении первых трех файлов Мне нужны следующие 3 файла для запуска и так далее до 24 файлов.

+2

Уже есть решения на SO. Вам нужно только Google для них. – jeb

+0

Вам может быть интересно: [выполнять пакетные файлы параллельно и получать код выхода из каждого] (http://stackoverflow.com/a/41051895) ... – aschipfl

+0

IMO, вопрос должен был быть закрыт как «слишком широкий», или «должен включать MCVE». – halfer

ответ

0
start 1.bat 
start 2.bat 
start /wait 3.bat 
start 4.bat 
start 5.bat 
start /wait 6.bat 

И так далее. Это предполагает, что пакетный файл с коммутатором /wait является самым длинным. Если это невозможно, вы можете использовать этот сценарий здесь:

@echo off 

start bat1.bat 
start bat2.bat 
start bat3.bat 
call waitForFinish 
start bat4.bat 
start bat5.bat 
start bat6.bat 
call waitForFinish 
Goto:eof 

: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 Batch-файлы, которые вы называете «функцию» waitForFinish. Это проверяет, найдет ли он более 1 запущенного командного процесса (один используется для работающего пакетного файла, поэтому он всегда будет присутствовать, а еще одна строка выше вывода) и подсчитывает для каждого найденного окна.
Если этот счетчик больше 2, он будет делать то же самое снова и снова до той точки, где найден только запущенный файл пакетного файла только для процесса cmd.exe. Если это так, сценарий возвращается в верхнюю часть скрипта, чтобы начать следующие три.

+0

Я пробовал использовать тот же код, который вы указали. В результате получилось: первые три командных файла побежали и закрылись, но все же значение счетчика больше 1, и цикл повторялся непрерывно. Следующие три командных файла не выполнялись. пожалуйста, предложите мне, –

+0

Вместо того, чтобы использовать 'findstr' для фильтрации, вы должны использовать возможности фильтра' tasklist' (см. его опцию '/ FI') ... – aschipfl

+0

@UmamaheswaraReddyAmbati Кажется, что была дополнительная строка, которая вызывала проблема ... Я немного изменил команду после предложений aschipfl и изменил неверный 0 на 2. – geisterfurz007

0

Как насчет следующего сценария для параллельного выполнения трех пакетных файлов и дождаться их завершения? В основном это позволяет каждому пакетному файлу перенаправить свой вывод STDERR во временный файл, который заблокирован при записи, пока пакетный файл все еще запущен. Как только пакетный файл завершается, временный файл доступен для записи, и поэтому он может и будет удален. Так вот код:

@echo off 

rem /* Execute three batch files in parallel, redirect their STDERR output 
rem into individual temporary files: */ 
start "" cmd /C 2^> "1.tmp" "1.bat" 
start "" cmd /C 2^> "2.tmp" "2.bat" 
start "" cmd /C 2^> "3.tmp" "3.bat" 

rem // Call sub-routine containing a polling loop: 
call :POLL "1.tmp" "2.tmp" "3.tmp" 

exit /B 


:POLL {val_temp_file}* 
rem /* Establish polling loop that tries to delete the temporary files; 
rem if a batch file is still running, the respective temporary file 
rem is not yet accessible, so deletion fails: */ 
:LOOP 
rem // Delay execution to give processor some time: 
> nul timeout /T 1 /NOBREAK 
rem /* `for /F` loop to capture the STDERR output of the `del` command; 
rem remember that `del` does not set the `ErrorLevel` unfortunately: */ 
for /F "delims=" %%E in (' 
    rem/ Discard STDOUT output and redirect STDERR output adequately: ^&^
    2^>^&1 ^> nul ^(^ 
     rem/ `if exist` even works for already opened/accessed files: ^&^
     for %%F in ^(%*^) do if exist "%%~F" del "%%~F"^ 
    ^) 
') do (
    rem // Loop iterates, so there is STDERR output, hence loop back: 
    goto :LOOP 
) 

exit /B 
1

Это решение использовать метод, описанный в this answer:

@echo off 
setlocal EnableDelayedExpansion 

for /L %%i in (1,3,22) do (
    set /A N1=%%i, N2=%%i+1, N3=%%i+2 
    (start "" !N1!.bat & start "" !N2!.bat & start "" !N3!.bat) | set /P "=" 
) 

В этом способе первый поток входит в состояние с ожидания что не не потребляют CPU до тех пор, три начались Пакетные файлы заканчиваются. Также очень легко написать (и выглядит хорошо! ;)

+0

Я знал, что есть способ использовать трубку, но я не мог вспомнить ...: -/+1! – aschipfl

Смежные вопросы