O tempo limite seria interrompido se o usuário pressionasse qualquer tecla; no entanto, o comando também aceita o switch opcional /nobreak, que efetivamente ignora qualquer coisa que o usuário possa pressionar, exceto um explícito CTRL-C:
timeout /t 30 /nobreak
Além disso, se você não quiser que o comando imprima sua contagem regressiva na tela, você pode redirecionar sua saída para NUL:
Se você quiser usar o ping, há uma maneira melhor. Você desejará fazer ping em um endereço que não existe, para que possa 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 propósito de não existir (pode não ficar claro, mas vale até 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 do fornecedor e do protocolo. Os endereços dentro deste bloco não devem aparecer na Internet pública.
Para dormir por 123 milissegundos, useping 192.0.2.1 -n 1 -w 123 >nul
Você também pode inserir um pingpara localhost. Isso levará 4 segundos para ser concluído (por padrão). É considerado um kludge por alguns, mas funciona muito bem do mesmo jeito.
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 feito para aqueles que recomendam ping...
Quando possível, use timeoutcom 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 seja a próxima melhor opção, pois é muito simples. Dito isso, ofereço outra opção... incorporar algum script VB .
A base desta solução tem todo tipo de aplicação além desta. Muitas vezes, o VBS pode fazer coisas que o lote não pode, ou pelo menos com muito mais facilidade. Usando a técnica ilustrada aqui, você pode misturar os dois (não "perfeitamente", mas "funcionalmente"...).
Aqui está um forro, para criar um script temporário, executá-lo e excluí-lo. O script faz o sono para você (por 3 segundos neste exemplo).
Aqui está basicamente a mesma coisa, escrita 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, CScriptele tem uma opção de tempo limite! Portanto, se você inserir um loop infinito no script, poderá permitir que o interpretador imponha 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.Sleepprocedimento, mas apresento-a como uma opção conceitual por uma questão de completude:
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%
A maneira correta de dormir em um arquivo em lotes é usar o
timeout
comando, introduzido no Windows 2000.Para esperar algo entre 29 e 30 segundos :
O tempo limite seria interrompido se o usuário pressionasse qualquer tecla; no entanto, o comando também aceita o switch opcional
/nobreak
, que efetivamente ignora qualquer coisa que o usuário possa pressionar, exceto um explícitoCTRL-C
:Além disso, se você não quiser que o comando imprima sua contagem regressiva na tela, você pode redirecionar sua saída para
NUL
:Como também se aplica aqui, copiarei minha resposta de outro site .
Se você quiser usar o ping, há uma maneira melhor. Você desejará fazer ping em um endereço que não existe, para que possa 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 propósito de não existir (pode não ficar claro, mas vale até em redes locais):Para dormir por 123 milissegundos, use
ping 192.0.2.1 -n 1 -w 123 >nul
Você pode dormir no Lote usando o powershell:
Milissegundos
Segundos
Você também pode inserir um
ping
para localhost. Isso levará 4 segundos para ser concluído (por padrão). É considerado um kludge por alguns, mas funciona muito bem do mesmo jeito.O comando:
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 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 oping
"kludge" talvez seja a próxima melhor opção, pois é muito simples. Dito isso, ofereço outra opção... incorporar algum script VB .A base desta solução tem todo tipo de aplicação além desta. Muitas vezes, o VBS pode fazer coisas que o lote não pode, ou pelo menos com muito mais facilidade. Usando a técnica ilustrada aqui, você pode misturar os dois (não "perfeitamente", mas "funcionalmente"...).
Aqui está um forro, para criar um script temporário, executá-lo e excluí-lo. O script faz o sono para você (por 3 segundos neste exemplo).
Aqui está basicamente a mesma coisa, escrita um pouco diferente:
E então, finalmente, como
ping
,CScript
ele tem uma opção de tempo limite! Portanto, se você inserir um loop infinito no script, poderá permitir que o interpretador imponha a duração. Observe que esta é uma operação "ocupada", que consome a CPU e, portanto, não a recomendo quando você pode usar oWScript.Sleep
procedimento, mas apresento-a como uma opção conceitual por uma questão de completude: