¿Alguien me puede indicar una forma de agregar un temporizador a un archivo por lotes de Windows? Necesito rastrear el tiempo que mi lote se ejecuta desde el inicio.Temporizador en el archivo por lotes de Windows
Respuesta
Por lo que yo sé, no existe un comando explícito de "temporizador" que pueda usarse en archivos por lotes; sin embargo, hay una solución bastante simple. En la parte superior de su archivo por lotes, registre la hora actual (hora de inicio) al final del archivo por lotes, registre la hora actual (hora de finalización) y luego compare las dos. Algo así debe hacerlo (que no parece demasiado complicado, pero maneja la mayoría de los caprichos del tiempo):
:: Store start time
set StartTIME=%TIME%
set H=%StartTIME:~0,2%
if "%H:~0,1%"==" " set H=%H:~1,1%
if "%H:~0,1%"=="0" set H=%H:~1,1%
set M=%StartTIME:~3,2%
if "%M:~0,1%"=="0" set M=%M:~1,1%
set S=%StartTIME:~6,2%
if "%S:~0,1%"=="0" set S=%S:~1,1%
set U=%StartTIME:~9,2%
if "%U:~0,1%"=="0" set U=%U:~1,1%
)
set /a Start100S=%H%*360000+%M%*6000+%S%*100+%U%
::
:: Add your script functionality here
::
:: Get the end time
set StopTIME=%TIME%
set H=%StopTIME:~0,2%
if "%H:~0,1%"==" " set H=%H:~1,1%
if "%H:~0,1%"=="0" set H=%H:~1,1%
set M=%StopTIME:~3,2%
if "%M:~0,1%"=="0" set M=%M:~1,1%
set S=%StopTIME:~6,2%
if "%S:~0,1%"=="0" set S=%S:~1,1%
set U=%StopTIME:~9,2%
if "%U:~0,1%"=="0" set U=%U:~1,1%
)
set /a Stop100S=%H%*360000+%M%*6000+%S%*100+%U%
:: Test midnight rollover. If so, add 1 day=8640000 1/100ths secs
if %Stop100S% LSS %Start100S% set /a Stop100S+=8640000
set /a TookTime=%Stop100S%-%Start100S%
echo Started: %StartTime%
echo Stopped: %StopTime%
echo Elapsed: %TookTime:~0,-2%.%TookTime:~-2% seconds
alternativa # 1: El kit de recursos de servidor de Windows 2k3 incluye timeit.exe. Puede usar esto para mostrar varias estadísticas de rendimiento para su secuencia de comandos.
alternativa # 2: Usted podría ir mucho más simple que el guión escrito previamente y hacer esto:
echo %time%
::
:: Your script functionality
::
echo %time%
Sin embargo, esto no le da tiempo de ejecución en cuestión de segundos.
refactorizado el código para calcular el tiempo transcurrido:
- menos código en el cálculo,
- proporcionado relleno para el tiempo transcurrido menos de .1 segundos,
- el uso de etiquetas para permitir que llamar varias veces, y para agrupar el código del temporizador.
código reutilizable:
:StartTimer
:: Store start time
set StartTIME=%TIME%
for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo %StartTIME: =0%`) do set /a Start100S=1%%f*360000+1%%g*6000+1%%h*100+1%%i-36610100
goto :EOF
:StopTimer
:: Get the end time
set StopTIME=%TIME%
for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo %StopTIME: =0%`) do set /a Stop100S=1%%f*360000+1%%g*6000+1%%h*100+1%%i-36610100
:: Test midnight rollover. If so, add 1 day=8640000 1/100ths secs
if %Stop100S% LSS %Start100S% set /a Stop100S+=8640000
set /a TookTime=%Stop100S%-%Start100S%
set TookTimePadded=0%TookTime%
goto :EOF
:DisplayTimerResult
:: Show timer start/stop/delta
echo Started: %StartTime%
echo Stopped: %StopTime%
echo Elapsed: %TookTime:~0,-2%.%TookTimePadded:~-2% seconds
goto :EOF
Código de llamada:
call :StartTimer
::
:: Add your script functionality here
::
call :StopTimer
call :DisplayTimerResult
pause
call :StartTimer
::
:: Add more script functionality here
::
call :StopTimer
call :DisplayTimerResult
goto :EOF
Nota el "1" -prefix para evitar errores de interpretación de los valores con relleno de ceros como valores octales (08 y 09) y la corrección con la constante apropiada. Ya que esto podría ser confuso para entender el cálculo básico, una alternativa a la de una línea for
declaración sería algo como lo siguiente:
for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo.%StartTIME%`) do set TempTIME=%%f %%g %%h %%i
for /f "usebackq tokens=1-4" %%f in (`echo %TempTIME: 0= %`) do set /a Start100S=%%f*360000+%%g*6000+%%h*100+%%i
Puede probar esto (más corto ..)
@echo off
:loop
set TA=%time% & echo %time%--A
echo Put Your Code Here...
set TB=%time% & echo %time%--B
call:Timediff %TA% %TB% Tab
for /f "tokens=1-3 delims=:" %%a in ("%TAB%")do echo Time difference: %%a hours %%b minutes and %%c seconds
pause
goto:loop
:: /* ---------- Timediff ---------------
:Timediff [%t1%] [%t2%] [par|0]
for %%a in (+%1 +%2 +%3)do if "%%a"=="+" echo No Parameters!!&exit/b
setlocal enabledelayedexpansion
:timediff_1
set P2=%~1&set "P2=!P2::=!"
set/a P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%)
if not "%3"=="" set P1=!P2!&shift&goto:timediff_1
if !P2! geq !P1! (set/a df=!P2!-!P1!) else set/a df=!P2!-!P1!+8640000
set/a h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100
if %pt% leq 9 set pt=0%pt%
endlocal&if %2.==0. (echo\%h%:%m%:%s%.%pt%) else set %2=%h%:%m%:%s%.%pt%&goto:eof
:: ------------- Timediff ------------- */
¡Esto no funcionó! –
Estructura de su programa como este:
@echo off
setlocal enabledelyedexpansion
set T[1]=%time%
::
:: Your program goes here...
::
set T[2]=%time%
call TIMER
Aquí está el código para el programa TIMER.BAT. Guárdelo como un archivo separado en algún lugar de su camino.
for /l %%t in (1,1,2) do for /f "tokens=1-4 delims=:." %%a in ("!T[%%t]!") do (
set "T[%%t]=!T[%%t]: =0!"
set "h[%%t]=%%a" & if "!h[%%t]:~0,1!"=="0" set "h[%%t]=!h[%%t]:~1!"
set "m[%%t]=%%b" & if "!m[%%t]:~0,1!"=="0" set "m[%%t]=!m[%%t]:~1!"
set "s[%%t]=%%c" & if "!s[%%t]:~0,1!"=="0" set "s[%%t]=!s[%%t]:~1!"
set "c[%%t]=%%d" & if "!c[%%t]:~0,1!"=="0" set "c[%%t]=!c[%%t]:~1!"
set /a T[%%t]=!h[%%t]!*360000+!m[%%t]!*6000+!s[%%t]!*100+!c[%%t]!
)
set /a c=!T[2]!-!T[1]!
set /a h=!c!/360000 & set /a c%%=360000 & if !h! lss 10 set "h= !h!"
set /a m=!c!/6000 & set /a c%%=6000 & if !m! lss 10 set "m=0!m!"
set /a s=!c!/100 & set /a c%%=100 & if !s! lss 10 set "s=0!s!"
echo !h!:!m!:!s!.!c!
Una versión minimalista con tiempo transcurrido en segundos.
@set /A _tic=%time:~0,2%*3600^
+%time:~3,1%*10*60^
+%time:~4,1%*60^
+%time:~6,1%*10^
+%time:~7,1% >nul
:: actual script
@set /A _toc=%time:~0,2%*3600^
+%time:~3,1%*10*60^
+%time:~4,1%*60^
+%time:~6,1%*10^
+%time:~7,1% >nul
@set /A _elapsed=%_toc%-%_tic
@echo %_elapsed% seconds.
pero tengo un script de hora y media. ¿Cómo se haría por minutos en lugar de segundos? lo siento si para ti parece demasiado simple! –
Gracias @migonzalvar, esto era justo lo que necesitaba. Para los curiosos, no puede recuperar dos dígitos a la vez durante minutos y segundos porque un 0 inicial hará que el número se interprete como octal. Funciona durante horas porque hay un espacio principal, no un 0. Y necesitas el espacio antes de "> nul" porque (por ejemplo) "2> nul" significa redirigir stderr. (Ah, y esos símbolos que se arrastran escapan de la nueva línea.) – yoyo
Este temporizador es bastante preciso, y cuenta regresivamente desde 5. No obstante, no estoy seguro de cómo podría agregar esto a su código. Nota: Este es un muy temporizador de lote básico, y las otras respuestas son probablemente mejores, pero esta es solo una forma rápida de diseñar su propio temporizador por lotes con código simple.
@echo off
cls
set /a time=5
:hi
cls
echo Time:%time%
ping localhost -n 2 >nul
set /a time=%time%-1
if %time%==0 (
goto timeup
)else goto :hi
:timeup
cls
echo Time is up!
pause
también para cambiar el tiempo de este temporizador se inicia en, acaba de cambiar a set /a time=5
set /a time=(whatever time you want to start at)
gracias ............... este es mi problema –
- 1. archivo por lotes de Windows operador &&
- 2. Invocar el archivo por lotes de Windows desde Linux
- 3. Ejecute el archivo por lotes como un servicio de Windows
- 4. Incluir un archivo por lotes en un archivo por lotes
- 5. Control de psftp en un archivo por lotes de Windows
- 6. ¿Cómo concatenar cadenas en un archivo por lotes de Windows?
- 7. Ejecutando archivo por lotes en segundo plano cuando Windows inicia
- 8. Ejecutando un script por lotes en el cierre de Windows
- 9. Archivo por lotes de Windows: ¿PID del último proceso?
- 10. ¿Cómo puedo comprobar el tamaño de un archivo en un archivo por lotes de Windows?
- 11. texto Abrir archivo y programa de acceso directo en el archivo por lotes de Windows
- 12. Ejecutar archivo por lotes en el fondo
- 13. Redirigir argumentos pasados a un archivo por lotes de Windows
- 14. Incrustar VBScript dentro del archivo por lotes de Windows
- 15. Windows script por lotes: cálculo de subcadena
- 16. Prueba del atributo de archivo en el archivo por lotes
- 17. Archivo por lotes para reiniciar un servicio. Windows
- 18. Codificación de archivo por lotes
- 19. ¿Cómo ejecutar programas en el mismo directorio que el archivo por lotes de Windows?
- 20. Cómo ejecutar múltiples programas usando el archivo por lotes
- 21. Ejecutando vbscript desde el archivo por lotes
- 22. Comandos largos divididos en varias líneas en el archivo por lotes de Windows Vista (.bat)
- 23. enviando correo desde el archivo por lotes
- 24. ¿Cómo establecer el directorio de trabajo de un comando en un archivo por lotes de Windows?
- 25. Ejecutando rake desde el archivo por lotes
- 26. Ejecutando un archivo por lotes en el shell git
- 27. ¿Cómo recupero la versión de un archivo de un archivo por lotes en Windows Vista?
- 28. ¿Eco cadena exacta en el archivo de proceso por lotes de Windows?
- 29. ¿Cómo atravesar el árbol de carpetas/subárboles en un archivo por lotes de Windows?
- 30. Declaración y uso de una variable en el archivo por lotes de Windows (.BAT)
qué versión de DOS está utilizando? – TZHX
im usando la versión 5.2.379 – JVIDIN