2010-11-30 23 views

Respuesta

4

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.

15

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 
2

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 ------------- */ 
+0

¡Esto no funcionó! –

1

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! 
5

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. 
+0

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! –

+1

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

2

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=5set /a time=(whatever time you want to start at)

+0

gracias ............... este es mi problema –

Cuestiones relacionadas