1

В bash есть опция ожидания всех фоновых процессов, запущенных текущей оболочкой, с помощью команды wait .

например

#!/bin/bash
{ sleep 5; echo "waking up after 5 seconds"; } &
{ sleep 1; echo "waking up after 1 second"; } &
wait
echo all jobs are done!

Как мне сделать то же самое в пакетном скрипте Windows? Я должен запустить несколько команд в фоновом режиме и ждать, пока все не закончится.

1 ответ1

3

Возможно, вы захотите, чтобы команда START инициировала параллельную обработку, хотя это можно сделать через WMIC. Обратите внимание, что первый аргумент обрабатывается как заголовок окна, если он заключен в кавычки. Вот почему мой первый аргумент - пустая строка. Параметр /B запускает команду в том же окне. Удалите его, если вы хотите новое окно для каждой команды.

Нет простой встроенной пакетной команды или опции для ожидания завершения ряда параллельных процессов.

Мне нравится перенаправлять неиспользуемый дескриптор файла в файл для каждого процесса, таким образом устанавливая исключительную блокировку. Затем я могу определить, запущен ли еще процесс, пытаясь перенаправить (CALL ) (фактически нулевой оператор) в тот же файл блокировки. Если перенаправление не удается, то процесс все еще выполняется. Успех означает, что процесс завершен.

Тест должен быть выполнен для каждого из файлов блокировки в цикле опроса. Добавление задержки является хорошей идеей для предотвращения злоупотребления ресурсами в цикле опроса.

@echo off
set "lock=%temp%\%~nx0.lock"
start "" /b "timeout" 5 9>"%lock%.1"
start "" /b "timeout" 8 9>"%lock%.2"
:wait
timeout 1 /nobreak >nul
2>nul (for %%F in ("%lock%.*") do 9>"%%F" (call ) && del "%%F" || goto :wait)
echo OK

Если у вас есть большое количество параллельных процессов для запуска, и вы хотите ограничить количество одновременных процессов, то вас может заинтересовать https://stackoverflow.com/a/11715437/1012053

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