11

Кто-нибудь знает, есть ли cmd-скрипт, который делает это и / или инструмент командной строки, готовый к работе?

6 ответов6

6

Создайте три пакетных файла ниже. Main.bat запускает 1.bat и 2.bat

1.bat и 2.bat записывают временные файлы, которые проверяет main.bat. Пока работают 1.bat и 2.bat, main.bat сообщает, что обработка все еще происходит. Когда вы нажимаете ввод в открытом окне 1.bat или 2.bat, временный файл удаляется, и программа завершает работу. Это имитирует остановку обработки для этого файла .bat. Если вы сделаете это для 1 и 2.bat, main.bat сообщит вам, что обработка для этих процессов завершена. Вы можете заставить 1.bat и 2.bat делать все, что захотите, если вы очистите временный файл, когда закончите. На этом этапе main.bat также может делать все, что вы хотите.

1.bat

echo %time% > 1.tmp
pause
del 1.tmp
exit 

2.bat

echo %time% > 2.tmp
pause
del 2.tmp
exit

main.bat

@echo off
start "1" 1.bat
start "2" 2.bat
    @ping -n 1 127.0.0.1 > nul
:loop
@echo Processing......
if not exist *.tmp goto :next
    @ping -n 5 127.0.0.1 > nul
goto loop
:next
@echo Done Processing!
1

Единственный способ сделать это - запустить отдельные командные файлы (см. start /?) которые запускают отдельную задачу и после завершения пишут текстовый файл. Затем вы периодически проверяете, были ли созданы текстовые файлы.

1

Достаточно просто, при условии, что процессы не требуют стандартного ввода или вывода. Из командной строки или в командном файле:

process1 | process2 | process3 | process4

Это запустит все четыре процесса одновременно и не вернется, пока все они не завершатся. (Возможное исключение: если процесс явно закрывает стандартный вывод, он может быть обработан так, как если бы он вышел. Но это необычно, очень немногие процессы делают это.)

Я не уверен, сколько именно процессов вы можете запустить одновременно таким образом. Я пробовал до десяти.

0

Вы можете посмотреть командлет Powershell Start-Job. Это должно позволить вам сделать это. Подробнее здесь Powershell - это предпочтительная оболочка Microsoft. Это намного мощнее, чем сценарии cmd и хорошо тратит ваше время

0

Я тоже искал похожую задачу. Задача состояла в том, чтобы запустить несколько команд параллельно и извлечь вывод (stdout & error) всех параллельных процессов. Затем дождитесь завершения всех параллельных процессов и выполните другую команду. Ниже приведен пример кода для файла BAT, который может быть выполнен в CMD:

( start "" /B cmd /c ping localhost -n 6 ^>nul timeout /t 5 /nobreak start "" /B /D "C:\users\username\Desktop" cmd /c dir ^> dr.txt ^2^>^&^1 start "" /B cmd /c ping localhost -n 11 ^>nul timeout /t 10 /nobreak ) | pause Echo waited timeout /t 12 /nobreak

Все операторы внутри () выполняются в первую очередь, ждут их завершения, затем выполняются две последние строки. Все команды, start со старта , выполняются одновременно.

Эти ссылки полезны:https://stackoverflow.com/a/43762349/9689416 и https://ss64.com/nt/start.html.

0

Или вы можете использовать это:http://www.out-web.net/?p=167

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .