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í:
- ¿Cómo esperar en un script por lotes? [duplicar] 6 respuestas
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 tiene una versión adecuada de Windows y las herramientas del Kit de recursos de Windows Server 2003 , incluye un comando de suspensión para los programas por lotes. Más en: http://malektips.com/xp_dos_0002.html
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 deping
, redirecting anul
.
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
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