tagger tag windows command-line batch-file sleep

windows - tagger - tag folders



¿Cómo dormir durante 5 segundos en el símbolo del sistema de Windows?(o DOS) (30)

Esta pregunta ya tiene una respuesta aquí:

La herramienta Snipping de Windows puede capturar la pantalla, pero a veces quiero capturar la pantalla después de 5 segundos, como tomar una imagen que muestra la webcam. (ejecute el guión y sonría a la cámara, por ejemplo).

Así que en Ruby, podría hacer algo como

sleep 3 system(''c:/windows/system32/SnippingTool.exe'')

pero no todas las computadoras tienen Ruby, entonces, ¿cómo hago eso en un archivo .bat? (algo que se puede ejecutar en la mayoría de las PC con la herramienta Snipping).

El problema es que no se puede "dormir" en un archivo .bat.


¿No podemos waitfor /T 180 ?

waitfor /T 180 pause resultará en "ERROR: Tiempo de espera en espera de ''pausa''".

waitfor /T 180 pause >nul barrerá ese "error" debajo de la alfombra

El comando waitfor debería estar allí en el sistema operativo Windows después de Win95

En el pasado, descargué un ejecutable llamado sleep que funcionará en la línea de comandos después de que lo coloques en tu ruta.

Por ejemplo: sleep shutdown -r -f /m //yourmachine aunque shutdown ahora tiene la opción -t incorporada


Al utilizar "ping", la -n determinará el tiempo de espera solo cuando no haya respuesta al ping. Echa un vistazo a esta publicación sobre la implementación de DELAY como un archivo por lotes.

Comando DELAY implementado como un archivo por lotes

Podría copiar y pegar los bits importantes, pero toda la publicación es bastante útil.


Bueno esto funciona si tienes elección o ping.

@echo off echo. if "%1"=="" goto askq if "%1"=="/?" goto help if /i "%1"=="/h" goto help if %1 GTR 0 if %1 LEQ 9999 if /i "%2"=="/q" set ans1=%1& goto quiet if %1 GTR 0 if %1 LEQ 9999 set ans1=%1& goto breakout if %1 LEQ 0 echo %1 is not a valid number & goto help if not "%1"=="" echo.&echo "%1" is a bad parameter & goto help goto end :help echo SLEEP runs interactively (by itself) or with parameters (sleep # /q ) echo where # is in seconds, ranges from 1 - 9999 echo Use optional parameter /q to suppress standard output echo or type /h or /? for this help file echo. goto end :askq set /p ans1=How many seconds to sleep? ^<1-9999^> echo. if "%ans1%"=="" goto askq if %ans1% GTR 0 if %ans1% LEQ 9999 goto breakout goto askq :quiet choice /n /t %ans1% /d n > nul if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul goto end :breakout choice /n /t %ans1% /d n > nul if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul echo Slept %ans1% second^(s^) echo. :end

solo nómbrelo sleep.cmd o sleep.bat y ejecutarlo


Creo que el siguiente comando puede ayudar:

pause 5

La sintaxis del comando de pausa es: pausa d // donde d representa la duración en segundos

Estoy usando Windows 7 (32 bits), pero no sé sobre los demás.


Dos formas más que deberían funcionar en todo, desde XP y superiores:

con w32tm

w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2 1>nul

con typeperf:

typeperf "/System/Processor Queue Length" -si 5 -sc 1 >nul


Dos respuestas:

En primer lugar, retrasar un archivo por lotes, simplemente sin todos los métodos obtusos que la gente ha estado proponiendo:

timeout /t <TimeoutInSeconds> [/nobreak]

http://technet.microsoft.com/en-us/library/cc754891.aspx

En segundo lugar, vale la pena mencionar que si bien puede que no haga exactamente lo que desea, con la herramienta integrada de recorte de Windows, puede disparar un recorte sin usar el mouse. Ejecute la herramienta de recorte, salga del recorte actual pero deje la herramienta en ejecución y presione Control + Imprimir pantalla cuando desee que se produzca el recorte. Esto no debería interferir con lo que sea que estés intentando cortar.


En Windows XP SP3 puedes usar el comando de reposo.


En las versiones más recientes del sistema operativo Windows, puede usar el comando

sleep /w2000

en un script de DOS ( .cmd o .bat ) para esperar 2s (2000 ms, sustituya el tiempo en ms que necesite). Tenga cuidado de incluir el argumento /w - ¡sin él toda la computadora se pone en suspensión! Puede usar -m lugar de /m si lo desea y, opcionalmente, dos puntos (:) entre la w y el número.


Escribí un programa powerbasic wait.exe , donde le pasas un parámetro de milisegundos en tu archivo por lotes

wait 3000 system(''c:/windows/system32/SnippingTool.exe'')

El código para el EXE:

FUNCTION PBMAIN() c$ = Command$ s! = Val(c$)*1000 Sleep s! END FUNCTION


Esta es la última versión de lo que estoy usando en la práctica durante una pausa de diez segundos para ver el resultado cuando finaliza un script.

BEST>@echo done BEST>@set DelayInSeconds=10 BEST>@rem Use ping to wait BEST>@ping 192.0.2.0 -n 1 -w %DelayInSeconds%000 > nul

El eco realizado me permite ver cuándo finalizó el script y el ping proporciona la demora. Los signos @ adicionales significan que veo el texto "hecho" y que la espera se produce sin que me distraigan sus comandos.

He probado las diversas soluciones que se dan aquí en una máquina XP, ya que la idea era tener un archivo de proceso por lotes que se ejecutara en una variedad de máquinas, por lo que elegí la máquina XP como el entorno que probablemente sea el menos capaz.

GOOD> ping 192.0.2.0 -n 1 -w 3000 > nul

Esto pareció dar un retraso de tres segundos como se esperaba. Un intento de ping que dura 3 segundos especificados.

BAD> ping -n 5 192.0.2.0 > nul

Esto tomó alrededor de 10 segundos (no 5). Mi explicación es que hay 5 intentos de ping, cada uno de aproximadamente un segundo de diferencia, haciendo 4 segundos. Y cada intento de ping probablemente duró alrededor de un segundo, haciendo un total estimado de 9 segundos.

BAD> timeout 5 BAD> sleep /w2000 BAD> waitfor /T 180 BAD> choice

Comandos no disponibles.

BAD> ping 192.0.2.0 -n 1 -w 10000 > nul :: wait 10000 milliseconds, ie 10 secs

Intenté lo anterior también, después de leer que los comentarios podrían agregarse a los archivos BAT utilizando dos puntos consecutivos. Sin embargo, el software volvió casi al instante. Poner el comentario en su propia línea antes de que el ping funcionara bien.

GOOD> :: wait 10000 milliseconds, ie 10 secs GOOD> ping 192.0.2.0 -n 1 -w 10000 > nul

Para entender mejor lo que hace ping en la práctica, corrí

ping 192.0.2.0 -n 5 -w 5000

Esto tomó alrededor de 30 segundos, aunque 5 * 5 = 25. Mi explicación es que hay 5 intentos de ping, cada uno de los cuales dura 5 segundos, pero hay un retraso de aproximadamente 1 segundo entre los intentos de ping: después de todo, hay pocas razones para esperar un resultado diferente si hace ping de nuevo inmediatamente y es mejor dar un Red un poco de tiempo para recuperarse de cualquier problema que haya tenido.

Edición: robado de otra publicación , ... RFC 3330 dice que la dirección IP 192.0.2.0 no debe aparecer en Internet, por lo que al hacer ping en esta dirección se evita que estas pruebas envíen correos no deseados a nadie. ¡He modificado el texto anterior en consecuencia!


Estaba tratando de hacer esto desde una tarea msbuild, y la elección y el tiempo de espera no funcionaron debido a la redirección de E / S.

Terminé usando sleep.exe desde http://sourceforge.net/projects/unxutils , lo cual está bien porque no requiere ninguna instalación y es muy pequeña.

Tratando con choice :

<Target Name="TestCmd"> <Exec Command="choice /C YN /D Y /t 5 " /> </Target>

Resultados en:

TestCmd: choice /C YN /D Y /t 5 EXEC : error : The file is either empty or does not contain the valid choices. [test.proj] [Y,N]? C:/test.proj(5,9): error MSB3073: The command "choice /C YN /D Y /t 5 " exited with code 255.

Tratando con el timeout :

<Target Name="TestCmd"> <Exec Command="timeout /t 5 " /> </Target>

Resultados en:

TestCmd: timeout /t 5 EXEC : error : Input redirection is not supported, exiting the process immediately. [test.proj] C:/test.proj(5,7): error MSB3073: The command "timeout /t 5 " exited with code 1.

Aparte:

En realidad estoy usando <Exec Command="sleep 2 & dbghost.exe" /> porque estoy ejecutando dbghost.exe varias veces en paralelo y crea archivos temporales / bases de datos basados ​​en el tiempo de la época actual en segundos, lo que por supuesto significa si inicia varias instancias, cada una usa el mismo nombre temporal. Originalmente estaba tratando de usar el comando MSBuild Extension Pack Thread.Sleep , pero parece que (normalmente) estaba ejecutando bien la tarea de suspensión, pero luego estaba iniciando la tarea <exec> en todas las secuencias al mismo tiempo, y por supuesto dbghost. exe fallaría con los conflictos. Hasta ahora, el uso de sleep.exe parece ser más confiable.


Esto debería hacer el truco: elección / T 5 / N / DY

Reemplace el 5 con el tiempo en segundos que desea esperar ...


Estoy muy sorprendido de que nadie haya mencionado:

C:/> timeout 5

NB. Sin embargo, tenga en cuenta (gracias Dan!) Que el timeout 5 significa:

Duerme en cualquier lugar entre 4 y 5 segundos.

Esto se puede verificar empíricamente poniendo lo siguiente en un archivo por lotes, ejecutándolo repetidamente y calculando las diferencias de tiempo entre el primer y el segundo echo s:

@echo off echo %time% timeout 5 > NUL echo %time%


Haga un archivo cmd llamado sleep.cmd:

REM Usage: SLEEP Time_in_MiliSECONDS @ECHO off ping 1.0.0.0 -n 1 -w %1 > nul

Copie sleep.cmd en c: / windows / system32

Uso:

sleep 500

Duerme durante 0,5 segundos. Argumentos en ms. Una vez copiado a System32, se puede utilizar en todas partes.

EDITAR: También debe estar ausente de que si la máquina no está conectada a una red (por ejemplo, un dispositivo portátil que está usando en el metro), el truco de ping ya no funciona.


La forma más fácil de hacerlo fue esta:

Descargue el Sleep.exe en http://www.sleepcmd.com/ . ¡El archivo .exe debe estar en la misma carpeta que el programa que escribiste!


Pruebe el comando Choice . Ha existido desde MSDOS 6.0, y debería hacer el truco.

Use el parámetro / T para especificar el tiempo de espera en segundos y el parámetro / D para especificar la selección predeterminada e ignorar la opción seleccionada.

Lo único que podría ser un problema es si el usuario escribe uno de los caracteres de elección antes de que transcurra el tiempo de espera. Una solución parcial es ofuscar la situación: use el argumento / N para ocultar la lista de opciones válidas y solo tiene 1 carácter en el conjunto de opciones, de modo que será menos probable que el usuario escriba una opción válida antes de el tiempo de espera expira.

A continuación se muestra el texto de ayuda en Windows Vista. Creo que es lo mismo en XP, pero mire el texto de ayuda en una computadora con XP para verificar.

C:/>CHOICE /? CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] Description: This tool allows users to select one item from a list of choices and returns the index of the selected choice. Parameter List: /C choices Specifies the list of choices to be created. Default list is "YN". /N Hides the list of choices in the prompt. The message before the prompt is displayed and the choices are still enabled. /CS Enables case-sensitive choices to be selected. By default, the utility is case-insensitive. /T timeout The number of seconds to pause before a default choice is made. Acceptable values are from 0 to 9999. If 0 is specified, there will be no pause and the default choice is selected. /D choice Specifies the default choice after nnnn seconds. Character must be in the set of choices specified by /C option and must also specify nnnn with /T. /M text Specifies the message to be displayed before the prompt. If not specified, the utility displays only a prompt. /? Displays this help message. NOTE: The ERRORLEVEL environment variable is set to the index of the key that was selected from the set of choices. The first choice listed returns a value of 1, the second a value of 2, and so on. If the user presses a key that is not a valid choice, the tool sounds a warning beep. If tool detects an error condition, it returns an ERRORLEVEL value of 255. If the user presses CTRL+BREAK or CTRL+C, the tool returns an ERRORLEVEL value of 0. When you use ERRORLEVEL parameters in a batch program, list them in decreasing order. Examples: CHOICE /? CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel." CHOICE /T 10 /C ync /CS /D y CHOICE /C ab /M "Select a for option 1 and b for option 2." CHOICE /C ab /N /M "Select a for option 1 and b for option 2."


Puede usar VBScript , por ejemplo, archivo myscript.vbs :

set wsobject = wscript.createobject("wscript.shell") do while 1=1 wsobject.run "SnippingTool.exe",0,TRUE wscript.sleep 3000 loop

Archivo por lotes:

cscript myscript.vbs %1


Puedes hacerlo con timeout :

Esto será visible: timeout 5

Este no será visible el timeout 5 >nul


Se puede hacer con dos líneas simples en un archivo por lotes: escriba un archivo .vbs temporal en la carpeta %temp% y llámelo:

echo WScript.Sleep(5000) >"%temp%/sleep.vbs" cscript "%temp%/sleep.vbs"



Si tienes PowerShell en tu sistema, puedes ejecutar este comando:

powershell -command "Start-Sleep -s 5"

Edición: las personas plantearon un problema en el que la cantidad de tiempo que demora el powershell en comenzar es significativo en comparación con el tiempo que está esperando. Si la precisión del tiempo de espera es importante (es decir, un segundo o dos retrasos adicionales no es aceptable), puede utilizar este método:

powershell -command "$sleepUntil = [DateTime]::Parse(''%date% %time%'').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

Esto toma el tiempo cuando se emitió el comando de Windows, y la secuencia de comandos powershell duerme hasta 5 segundos después de ese tiempo. Por lo tanto, mientras powershell tarde menos en comenzar que en la duración de su sueño, este enfoque funcionará (es de unos 600 ms en mi máquina).


Un truco es (mal) usar el comando ping:

ping 127.0.0.1 -n 6 > nul

Explicación:

  • ping es una utilidad del sistema que envía solicitudes de ping. ping está disponible en todas las versiones de Windows.
  • 127.0.0.1 es la dirección IP de localhost . Se garantiza que esta dirección IP siempre se resolverá, será accesible y responderá inmediatamente a los pings.
  • -n 6 especifica que habrá 6 pings. Hay un retraso de 1s entre cada ping, así que para un retraso de 5s necesita enviar 6 pings.
  • > nul suprime la salida de ping , redirecting a nul .

Una mejora del código propuesto por el usuario Aacini, tiene resolución de centésimas de segundo y no falla cuando el tiempo llega a 23: 59: 59,99:

for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC :: Example delay 1 seg. set /a TFIN=%TBASE%+100 :ESPERAR for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL% if %TACTUAL% lss %TFIN% goto ESPERAR


Utilizo el siguiente método completamente basado en las capacidades de Windows XP para hacer un retraso en un archivo por lotes:

Archivo DELAY.BAT

@ECHO OFF REM DELAY seconds REM GET ENDING SECOND FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, ENDING=(H*60+M)*60+S+%1 REM WAIT FOR SUCH A SECOND :WAIT FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S IF %CURRENT% LSS %ENDING% GOTO WAIT

También puede insertar el día en el cálculo para que el método también funcione cuando el intervalo de retardo supera la medianoche.


Yo hice esto. Está funcionando y muestra el tiempo restante en segundos. Si quieres usarlo, agrégalo a un archivo por lotes:

call wait 10

Estaba funcionando cuando lo probé.

Listado de wait.bat (debe estar en el directorio de trabajo o windir/system32/ ):

@echo off set SW=00 set SW2=00 set /a Sec=%1-1 set il=00 @echo Wait %1 second for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC, SW=CC set /a TFIN=%TBASE%+%100 :ESPERAR for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC, SW2=CC if %SW2% neq %SW% goto notype if %il%==0 (echo Left %Sec% second & set /a Sec=sec-1 & set /a il=il+1) goto no0 :notype set /a il=0 :no0 if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL% if %TACTUAL% lss %TFIN% goto ESPERAR


ping espera unos 5 segundos antes de que se agote el tiempo de espera, no 1 segundo como se indicó anteriormente. Es decir, a menos que le digas que solo espere 1 segundo antes de que se agote el tiempo.

ping 1.0.0.1 -n 1 -w 1000

hará ping una vez, esperará solo 1 segundo (1000 ms) para obtener una respuesta, y luego expirará.

Entonces, un retraso de aproximadamente 20 segundos sería:

ping 1.0.0.1 -n 20 -w 1000


SLEEP 5 se incluyó en algunos de los kits de recursos de Windows.

TIMEOUT 5 se incluyó en algunos de los kits de recursos de Windows, pero ahora es un comando estándar en Windows 7 y 8 (no estoy seguro de Vista).

PING 1.1.1.1 -n 1 -w 5000 >NUL Para cualquier versión de MS-DOS o Windows con un cliente TCP / IP, se puede usar PING para retrasar la ejecución durante varios segundos.

NETSH badcommand (solo Windows XP / Server 2003) o CHOICE

Este enlace te ayudará más .


Timeout /t 1 >nul

Es como una pausa en 1 segundo, puede tomar el limado a casi 100.000 (99.999) segundos. Si está conectado a internet, la mejor solución sería:

ping 1.1.1.1. -n 1 -w 1000 >nul

Cuando haces ping, cuentas en milisegundos, por lo que un segundo sería de 1000 milisegundos. Pero el comando ping es un poco dudoso, no funciona de la misma manera en máquinas sin conexión. El problema es que la máquina se confunde porque está fuera de línea y le gustaría hacer ping a un website/server/host/ip , pero no puede. Así que recomendaría tiempo de espera. ¡Buena suerte!


PING -n 60 127.0.0.1>nul

en caso de que su adaptador de LAN no esté disponible.


rem *** HACK ALERT: Sleep for 5 seconds *** ping -n 6 127.0.0.1 > nul rem ***************************************

  • Corregido según lo explicado por @Joey