альтернатива bash "wait" для пакетного скрипта Windows

1138
Hemant

В 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
Я не знаю простого способа сделать это в cmd (если вы хотите запускать свои задания параллельно), но если бы вы могли использовать Powershell, есть эквивалент, называемый `wait-job` (https://technet.microsoft. ком / EN-US / библиотека / Hh849735.aspx) wmz 8 лет назад 0
Powershell не допускается :( Hemant 8 лет назад 0
Просто из любопытства, что за причина [PS не разрешено]? wmz 8 лет назад 0

1 ответ на вопрос

3
dbenham

Возможно, вы захотите, чтобы команда 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