¿Cómo pausar la ejecución durante un tiempo en un archivo por lotes de Windows entre un comando y el siguiente?
¿Cómo pausar la ejecución durante un tiempo en un archivo por lotes de Windows entre un comando y el siguiente?
Respuestas:
La forma correcta de dormir en un archivo por lotes es usar el timeout
comando, introducido en Windows 2000.
Para esperar entre 29 y 30 segundos :
timeout /t 30
El tiempo de espera se interrumpiría si el usuario presiona cualquier tecla; sin embargo, el comando también acepta el interruptor opcional /nobreak
, que ignora efectivamente cualquier cosa que el usuario pueda presionar, excepto un explícito CTRL-C
:
timeout /t 30 /nobreak
Además, si no desea que el comando imprima su cuenta regresiva en la pantalla, puede redirigir su salida a NUL
:
timeout /t 30 /nobreak > NUL
Como también se aplica aquí, copiaré mi respuesta de otro sitio .
Si quieres usar ping, hay una mejor manera. Querrá hacer ping a una dirección que no existe, por lo que puede especificar un tiempo de espera con precisión de milisegundos. Afortunadamente, dicha dirección se define en un estándar (RFC 3330), y lo es 192.0.2.x
. Esto no está inventado, realmente es una dirección con el único propósito de no existir (puede que no esté claro, pero se aplica incluso en redes locales):
192.0.2.0/24: este bloque se asigna como "TEST-NET" para su uso en documentación y código de ejemplo. A menudo se usa junto con los nombres de dominio example.com o example.net en la documentación del proveedor y del protocolo. Las direcciones dentro de este bloque no deben aparecer en Internet pública.
Para dormir 123 milisegundos, use ping 192.0.2.1 -n 1 -w 123 >nul
Ping
es simplemente la herramienta incorrecta para el trabajo.
También puede insertar un ping a localhost. Esto tardará 4 segundos en completarse (de forma predeterminada). Algunos lo consideran un error, pero de todos modos funciona bastante bien.
El comando:
ping 127.0.0.1
ping
viene con su sistema operativo o no . Si te preocupa lo suficiente sobre '95 '98 o ME, entonces debería ser igualmente preocupado por 6,22 que no tiene ping
o bien
Descargo de responsabilidad : esta no es la solución "ideal", así que no te molestes en golpearme la cabeza con eso como lo hicieron los que recomiendan ping
...
Cuando sea posible, úselo timeout
con seguridad. Pero como se señaló en los comentarios, esa no siempre es una opción (por ejemplo, en modo no interactivo). Después de eso, estoy de acuerdo en que ping
"kludge" es quizás la siguiente mejor opción, ya que es muy simple. Dicho esto, ofrezco otra opción ... incrustar algunos VB Script .
La base de esta solución tiene todo tipo de aplicaciones más allá de esto. A menudo, VBS puede hacer cosas que el lote no puede, o al menos hacerlo con mucha más facilidad. Usando la técnica ilustrada aquí, puede mezclar los dos (no "sin problemas", sino "funcionalmente" ...).
Aquí hay un trazador de líneas, para crear un script temporal, ejecutarlo y luego eliminarlo. El script duerme por ti (durante 3 segundos en este ejemplo).
echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs
Esto es básicamente lo mismo, escrito de manera un poco diferente:
set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%
Y, por último, al igual que ping
, CScript
en sí tiene una opción de tiempo de espera! Entonces, si ingresa un bucle infinito en el script, puede dejar que el intérprete imponga la duración. Tenga en cuenta que esta es una operación "ocupada", que consume la CPU y, por lo tanto, no la recomiendo cuando puede usar el WScript.Sleep
procedimiento, pero lo presento como una opción conceptual en aras de la integridad:
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%