bash "wait" alternative for Windows batch script
In bash there is a option to wait for all the background process started by current shell using 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!
How do I do same in Windows batch script? I have to run multiple commands in background and wait till all finishes.
1 ответ
Возможно, вы захотите, чтобы команда 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