bash “wait” alternativa para script de lote do Windows

1

No bash há uma opção para esperar por todo o processo em segundo plano iniciado pelo shell atual usando o comando wait .

por exemplo.

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

Como faço o mesmo no script de lote do Windows? Eu tenho que executar vários comandos em segundo plano e esperar até que todos acabem.

    
por Hemant 18.08.2015 / 08:06

1 resposta

3

Você provavelmente desejará que o comando START inicie o processamento paralelo, embora isso possa ser feito via WMIC. Observe que o primeiro argumento é tratado como um título de janela se for citado. É por isso que meu primeiro argumento é uma string vazia. A opção /B executa o comando na mesma janela. Remova-o se você quiser uma nova janela para cada comando.

Não há comando ou opção em lote nativo simples para aguardar a conclusão de uma série de processos paralelos.

Eu gosto de redirecionar um identificador de arquivo não usado para um arquivo para cada processo, estabelecendo assim um bloqueio exclusivo. Em seguida, posso detectar se um processo ainda está em execução, tentando redirecionar (CALL ) (efetivamente uma operação nula) para o mesmo arquivo de bloqueio. Se o redirecionamento falhar, o processo ainda estará em execução. Sucesso indica que o processo terminou.

O teste deve ser feito em cada um dos arquivos de bloqueio em um loop de pesquisa. Adicionar um atraso é uma boa ideia para evitar que o loop de polling abuse de recursos.

@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

Se você tem um grande número de processos paralelos para executar, e você quer limitar o número de processos simultâneos, então você pode estar interessado em link

    
por 18.08.2015 / 13:42