Como pausar a execução por um tempo em um arquivo em lotes do Windows entre um comando e o próximo?
Como pausar a execução por um tempo em um arquivo em lotes do Windows entre um comando e o próximo?
Respostas:
A maneira correta de dormir em um arquivo em lotes é usar o timeout
comando, introduzido no Windows 2000.
Para esperar entre 29 e 30 segundos :
timeout /t 30
O tempo limite seria interrompido se o usuário pressionar qualquer tecla; no entanto, o comando também aceita a opção opcional /nobreak
, que ignora efetivamente qualquer coisa que o usuário possa pressionar, exceto uma explícita CTRL-C
:
timeout /t 30 /nobreak
Além disso, se você não quiser que o comando imprima sua contagem regressiva na tela, poderá redirecionar sua saída para NUL
:
timeout /t 30 /nobreak > NUL
Como também se aplica aqui, copiarei minha resposta de outro site .
Se você deseja usar o ping, existe uma maneira melhor. Você deseja executar ping em um endereço que não existe, para poder especificar um tempo limite com precisão de milissegundos. Felizmente, esse endereço é definido em um padrão (RFC 3330), e é 192.0.2.x
. Isso não é inventado, é realmente um endereço com o único objetivo de não existir (pode não estar claro, mas se aplica mesmo em redes locais):
192.0.2.0/24 - Este bloco é atribuído como "TEST-NET" para uso em documentação e código de exemplo. É frequentemente usado em conjunto com nomes de domínio example.com ou example.net na documentação de fornecedores e protocolos. Endereços dentro deste bloco não devem aparecer na Internet pública.
Para dormir por 123 milissegundos, use ping 192.0.2.1 -n 1 -w 123 >nul
Ping
é simplesmente a ferramenta errada para o trabalho.
Você também pode inserir um ping no host local. Isso levará 4 segundos para ser concluído (por padrão). É considerado um argumento por alguns, mas funciona muito bem da mesma forma.
O comando:
ping 127.0.0.1
ping
seu sistema operacional vem ou não . Se você está preocupado o suficiente sobre '95 '98 ou ME, então você deve ser como igualmente preocupado com 6,22 que não tem ping
tanto
Isenção de responsabilidade : esta não é a solução "ideal", então não se incomode em me bater na cabeça com isso, como feito para aqueles que recomendam ping
...
Quando possível, use timeout
com certeza. Mas, como observado nos comentários, isso nem sempre é uma opção (por exemplo, no modo não interativo). Depois disso, concordo que o ping
"kludge" é talvez a próxima melhor opção, pois é muito simples. Dito isto, ofereço outra opção ... incorporar alguns scripts VB .
A base desta solução tem todos os tipos de aplicação além disso. Freqüentemente, o VBS pode fazer coisas que o lote não pode ou, pelo menos, fazê-lo com drasticamente mais facilidade. Usando a técnica ilustrada aqui, você pode misturar os dois (não "perfeitamente", mas "funcionalmente" ...).
Aqui está uma lista, para criar um script temporário, executá-lo e excluí-lo. O script dorme para você (por 3 segundos neste exemplo).
echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs
Aqui está basicamente a mesma coisa, escrita de forma um pouco diferente:
set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%
E então, finalmente, como ping
, CScript
em si tem uma opção de tempo limite! Portanto, se você inserir um loop infinito no script, poderá deixar o intérprete impor a duração. Observe que esta é uma operação "ocupada", que consome a CPU e, portanto, não a recomendo quando você pode usar o WScript.Sleep
procedimento, mas apresento como uma opção conceitual por uma questão de integridade:
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%