Al escribir un archivo por lotes para automatizar algo en un cuadro de Windows, he tenido que pausar su ejecución durante varios segundos (generalmente en un ciclo de prueba / espera, esperando que se inicie un proceso). En ese momento, la mejor solución que pude encontrar utiliza ping (no es broma) para lograr el efecto deseado. He encontrado una mejor redacción aquí , que describe un "wait.bat" invocable, implementado de la siguiente manera:
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
Luego puede incluir llamadas a wait.bat en su propio archivo por lotes, pasando el número de segundos para dormir.
Aparentemente, el Kit de recursos de Windows 2003 proporciona un comando de suspensión similar a Unix (¡por fin!). Mientras tanto, para aquellos de nosotros que todavía usamos Windows XP, Windows 2000 o (lamentablemente) Windows NT , ¿hay una mejor manera?
Modifiqué el sleep.py
script en la respuesta aceptada , de modo que su valor predeterminado sea un segundo si no se pasan argumentos en la línea de comando:
import time, sys
time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
fuente
ping
comando o descargue el kit de recursos de Windows que incluye unsleep
comando. Más detalles aquí: Archivo por lotes SLEEP CommandRespuestas:
ACTUALIZAR
El
timeout
comando, disponible desde Windows Vista en adelante, debe ser el comando utilizado, como se describe en otra respuesta a esta pregunta. Lo que sigue aquí es una vieja respuesta.Vieja respuesta
Si tiene instalado Python, o no le importa instalarlo (también tiene otros usos :), simplemente cree el siguiente script sleep.py y agréguelo en algún lugar de su RUTA:
Permitirá pausas de menos de un segundo (por ejemplo, 1.5 segundos, 0.1, etc.), en caso de que lo necesite. Si desea llamarlo como en
sleep
lugar desleep.py
, puede agregar la.PY
extensión a su variable de entorno PATHEXT. En Windows XP, puede editarlo en:Mi PC → Propiedades (menú) → Avanzado (pestaña) → Variables de entorno (botón) → Variables del sistema (marco)
fuente
El
timeout
comando está disponible desde Windows Vista en adelante:Nota: no funciona con la redirección de entrada; ejemplo trivial:
fuente
timeout
, agregado por @Cristian Ciupitu, es parcialmente incorrecto: Windows XP no tiene este comando.Usar el
ping
método como se describe es cómo lo hago cuando no puedo (o no quiero) agregar más ejecutables o instalar cualquier otro software.Debería hacer ping a algo que no está allí, y usar la
-w
bandera para que falle después de ese período de tiempo, no hacer ping a algo que está allí (como localhost)-n
veces. Esto le permite manejar el tiempo en menos de un segundo, y creo que es un poco más preciso.p.ej
(prueba de que 1.1.1.1 no se toma)
fuente
PING: transmit failed. General failure.
1.1.1.1
CloudFlare toma la IP , por lo que no esperará 15 segundos sino alrededor de algunos ms.SLEEP.exe
se incluye en la mayoría de los kits de recursos, por ejemplo, el Kit de recursos de Windows Server 2003 que también se puede instalar en Windows XP.fuente
No estoy de acuerdo con las respuestas que encontré aquí.
Utilizo el siguiente método completamente basado en las capacidades de Windows XP para retrasar un archivo por lotes:
RETARDO BAT:
También puede insertar el día en el cálculo para que el método también funcione cuando el intervalo de retraso pase más de la medianoche.
fuente
TIME
comando.%TIME%
usas una coma para separar los centisegundos, en lugar de un punto! Simplemente agregue una coma enDELIMS=:.,"
...Me enfrenté a un problema similar, pero acabo de abrir una aplicación de consola C ++ muy corta para hacer lo mismo. Simplemente ejecute MySleep.exe 1000 , tal vez más fácil que descargar / instalar todo el kit de recursos.
fuente
En Server Fault, se hizo una pregunta similar y la solución fue:
fuente
CHOICE
versiones que conozco, si alguien presiona un botón mientras espera, lo que a veces hacen las personas impacientes, entonces la opción registrará una entrada, emitirá un pitido del sistema por una entrada incorrecta y detendrá el temporizador de cuenta regresiva, lo que significa que se bloqueará allí a menos que presionen N o Y. Y si simplemente presionan uno de esos dos, entonces la elección termina allí en lugar de esperar a 5. Además, esta opción está usando una sintaxis de Vista realmente extraña. Todos los comandos de elección normales se usaríanCHOICE /T:Y,5 > NUL
para eso. No hay/D
bandera en las versiones anteriores./C:YN
o solo/C:Y
, esto no funcionará cuando alguien tenga, por ejemplo, un comando de elección sueco que probablemente haga un [J, N] por defecto. Así que esto está sumido en todo tipo de problemas.Puede usar la capa WSH de cscript de Windows y este archivo JavaScript wait.js :
fuente
Dependiendo de sus necesidades de compatibilidad, use
ping
:por ejemplo, esperar 5 segundos, usar
o en Windows 7 o uso posterior
timeout
:fuente
-w
está en milisegundos,-n
es el número de veces que se hace ping y el tiempo predeterminado entre pings es un segundo.Puedes usar ping:
Esperará 10 segundos.
La razón por la que tiene que usar 11 es porque el primer ping se apaga inmediatamente, no después de un segundo. El número siempre debe ser uno más que la cantidad de segundos que desea esperar.
Tenga en cuenta que el propósito de la
-w
no es esperar un segundo. Es para asegurarse de que no espere más de un segundo en caso de que haya problemas de red.ping
por sí solo enviará un paquete ICMP por segundo. Probablemente no sea necesario para el host local, pero los viejos hábitos son difíciles.fuente
-w
era el tiempo de espera (aunque admito que algunos pueden inferir que debido a mi falta de claridad), en realidad se usa para limitar el tiempo del ciclo donde hay problemas de red que causarían que cada ciclo tome más de lo asignado segundo. He agregado un párrafo al final para aclarar esto.Hay una mejor manera de dormir usando ping. 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):Para dormir 123 milisegundos, use
ping 192.0.2.1 -n 1 -w 123 >nul
fuente
-n
parámetro.ping 192.0.2.1
en esta PC con Windows y se puede ver que la pila TCP / IP de Windows responde a las solicitudes de eco. ¿Cuántas personas saben que 192.0.2.0/24 no debe usarse para una dirección IPv4 estática?127.255.255.255
debido a que es una dirección de bucle de difusión en Windows que ya está asignada de forma predeterminada (puede confirmar esto ejecutandoroute print
en cmd y mirando a través de la tabla de rutas IPv4 que imprime).Si tiene PowerShell en su sistema, puede ejecutar este comando:
Editar: a partir de mi respuesta en un hilo similar , las personas plantearon un problema en el que la cantidad de tiempo que toma PowerShell para comenzar es significativa en comparación con el tiempo que está tratando de esperar. Si la precisión del tiempo de espera es importante (es decir, un segundo o dos retrasos adicionales no son aceptables), puede utilizar este enfoque:
Esto lleva el tiempo en que se emitió el comando de Windows, y el script de PowerShell duerme hasta 5 segundos después de ese tiempo. Por lo tanto, siempre que el PowerShell demore menos en iniciarse que la duración de su sueño, este enfoque funcionará (son alrededor de 600 ms en mi máquina).
fuente
Por ejemplo, para hacer que el script realice una espera ininterrumpible de 2 segundos:
Lo que significa que el script esperará 2 segundos antes de continuar.
Por defecto, una pulsación de tecla interrumpirá el tiempo de espera, por lo tanto, use el
/nobreak
interruptor si no desea que el usuario pueda interrumpir (cancelar) la espera. Además, el tiempo de espera proporcionará notificaciones por segundo para notificar al usuario cuánto tiempo le queda esperar; esto se puede eliminar canalizando el comando aNUL
.editar: como señala @martineau en los comentarios , el
timeout
comando solo está disponible en Windows 7 y versiones posteriores. Además, elping
comando usa menos tiempo de procesador quetimeout
. Sin embargo, todavía creo en usarlotimeout
siempre que sea posible, ya que es más legible que elping
'hack'. Lee más aquí .fuente
ping
enfoque usa menos tiempo de procesador.Simplemente coloque esto en su archivo por lotes donde desea esperar.
fuente
En el Bloc de notas, escriba:
Ahora guárdelo como wait.bat en la carpeta C: \ WINDOWS \ System32, luego, cuando quiera esperar, use:
fuente
ping
algo no solo una vez, y usar la-w Timeout
opción para el tiempo de retraso en milisegundos en lugar de la-n Count
opción de número total de reintentos.-w Timeout
puede ser mejor, pero me aseguré de que suene una vez más que la hora ingresada.El Kit de recursos siempre ha incluido esto. Al menos desde Windows 2000.
¡Además, el paquete Cygwin tiene un
sleep
- plop que en su RUTA e incluyecygwin.dll
(o como se llame) y el camino a seguir!fuente
Me gusta la respuesta de Aacini . Le agregué para manejar el día y también habilitarlo para manejar centisegundos (
%TIME%
salidasH:MM:SS.CC
):fuente
He estado usando este programa de sueño C #. Puede ser más conveniente para usted si C # es su idioma preferido:
fuente
Aún más liviano que la solución Python es un Perl one-liner.
Para dormir durante siete segundos ponga esto en el script BAT:
Esta solución solo proporciona una resolución de un segundo.
Si necesita una resolución más alta, use el módulo Time :: HiRes de CPAN. Proporciona
usleep()
qué duerme en microsegundos ynanosleep()
qué duerme en nanosegundos (ambas funciones toman solo argumentos enteros). Ver la pregunta de desbordamiento de pila ¿ Cómo duermo un milisegundo en Perl? para mas detalles.He usado ActivePerl por muchos años. Es muy fácil de instalar.
fuente
O línea de comando Python, por ejemplo, durante 6 segundos y medio:
fuente
El uso de ping es bueno, siempre y cuando solo quieras "esperar un poco". Esto ya que depende de otras funciones debajo, como el funcionamiento de su red y el hecho de que no hay nada que responda en 127.0.0.1. ;-) Tal vez no sea muy probable que falle, pero no es imposible ...
Si desea asegurarse de que está esperando exactamente el tiempo especificado, debe usar el
sleep
funcionalidad (que también tiene la ventaja de que no usa la potencia de la CPU o espera a que una red esté lista).Encontrar un ejecutable ya hecho para dormir es la forma más conveniente. Simplemente colóquelo en su carpeta de Windows o en cualquier otra parte de su ruta estándar y siempre estará disponible.
De lo contrario, si tiene un entorno de compilación, puede hacer uno fácilmente. La
Sleep
función está disponible enkernel32.dll
, por lo que solo necesita usar esa. :-) Para VB / VBA declare lo siguiente al comienzo de su fuente para declarar una función de suspensión:Para C #:
Aquí encontrará más información sobre esta funcionalidad (disponible desde Windows 2000) en la función Suspender (MSDN).
En el estándar C,
sleep()
se incluye en la biblioteca estándar y en Visual Studio C de Microsoft se nombra la funciónSleep()
, si la memoria me sirve. ;-) Esos dos toman el argumento en segundos, no en milisegundos como las dos declaraciones anteriores.fuente
La mejor solución que debería funcionar en todas las versiones de Windows después de Windows 2000 sería:
fuente
'timeout' is not recognized as an internal or external command, operable program or batch file.
El pathping.exe puede dormir menos de un segundo.
.
fuente
Estoy impresionado con este:
http://www.computerhope.com/batch.htm#02
Técnicamente, le estás diciendo al
choice
comando que acepte solo y. Su valor predeterminado es y, hacerlo en 5 segundos, no dibujar ningún aviso y volcar todo lo que le dice a NUL (como un terminal nulo en Linux).fuente
CHOICE
versiones que conozco, si alguien presiona una tecla mientras espera, lo que a veces hacen las personas impacientes, entonces la opción leerá una entrada, emitirá un pitido del sistema por una entrada incorrecta y detendrá la cuenta regresiva, por lo que se bloqueará a menos que presione Y. Y si simplemente presionan Y, entonces la elección termina allí en lugar de esperar a 5. Además, esta opción está usando una sintaxis de Vista realmente extraña. Los comandos de elección normal en su lugar se utilizanCHOICE /T:Y,5 > NUL
para eso. (No hay bandera / D en las versiones anteriores). Y si tiene Vista,TIMEOUT
úsela.También puede usar un archivo .vbs para hacer tiempos de espera específicos:
El siguiente código crea el archivo .vbs. Pon esto cerca de la parte superior de tu código de lote:
El siguiente código abre el archivo .vbs y especifica cuánto tiempo esperar:
En el código anterior, el "1000" es el valor del retraso de tiempo que se enviará al archivo .vbs en milisegundos, por ejemplo, 1000 ms = 1 s. Puede modificar esta parte para que sea lo largo que desee.
El siguiente código elimina el archivo .vbs después de que haya terminado con él. Ponga esto al final de su archivo por lotes:
Y aquí está todo el código, así que es fácil de copiar:
fuente
Desde Windows Vista en adelante, tiene los comandos TIMEOUT y SLEEP , pero para usarlos en Windows XP o Windows Server 2003, necesitará el kit de herramientas de recursos de Windows Server 2003 .
Aquí tiene una buena visión general de las alternativas de suspensión (el enfoque de ping es el más popular, ya que funcionará en todas las máquinas con Windows), pero hay (al menos) una que no se menciona que (ab) usa el
W32TM
comando (Servicio de tiempo):Donde debe reemplazar la N con los segundos que desea pausar. Además, funcionará en todos los sistemas Windows sin requisitos previos.
Typeperf también se puede usar:
Con mshta y javascript (se puede usar para dormir menos de un segundo):
Esto debería ser aún más preciso (para esperar menos de un segundo): el ejecutable de compilación automática depende de
.net
:fuente
Hay muchas formas de lograr un ' sueño ' en cmd / lote:
Mi favorito:
Esto detendrá la consola durante 5 segundos, sin ninguna salida.
Más usado:
Esto intentará hacer una conexión
localhost
5 veces. Como está alojado en su computadora, siempre llegará al host, por lo que cada segundo probará lo nuevo cada segundo. La-n
bandera indica cuántas veces el script intentará la conexión. En este caso es 5, por lo que durará 5 segundos.Variantes de la última:
En este script hay algunas diferencias comparándolo con el último. Esto no intentará llamar
localhost
. En cambio, intentará conectarse a1.1.1.1
un sitio web muy rápido. La acción durará 5 segundos solo si tiene una conexión a Internet activa. De lo contrario, durará aproximadamente 15 para completar la acción . No recomiendo usar este método.Esto es exactamente lo mismo que en el ejemplo 2 (el más utilizado). Además, también puedes usar:
Esto, en cambio, usa la
localhost
versión de IPv6 .Hay muchos métodos para realizar esta acción. Sin embargo, prefiero el método 1 para Windows Vista y versiones posteriores y el método más utilizado (método 2) para versiones anteriores del sistema operativo.
fuente
Puedes ponerte elegante poniendo el mensaje PAUSE en la barra de título:
fuente
Esto se probó en Windows XP SP3 y Windows 7 y utiliza CScript. Me puse algunas medidas de seguridad para evitar la "" incitación. (
/q
sería peligroso)Espera un segundo:
Espere 500 ms y luego ejecute cosas después de:
sleepOrDelayExecution.bat:
fuente
Como otros sugieren programas de terceros (Python, Perl, aplicaciones personalizadas, etc.), otra opción es GNU CoreUtils para Windows disponible en http://gnuwin32.sourceforge.net/packages/coreutils.htm .
2 opciones para la implementación:
Una ventaja de implementar CoreUtils es que además obtendrá una gran cantidad de otros programas que son útiles para la creación de scripts (el lote de Windows deja mucho que desear).
fuente