Calcular la diferencia de tiempo en el archivo por lotes de Windows

¿Cómo puedo obtener la diferencia entre dos veces en un archivo por lotes? Porque quiero imprimirlo en un archivo HTML.

Pensé que esto sería posible, pero no lo es.

Set "tijd=%time%" echo %tijd% echo %time%-%tijd% 

Resultados:

 11:07:48,85 11:16:58,99-11:07:48,85 

Pero lo que quiero es:

 00:09:10,14 

O 9 minutos y 10 segundos o 550 segundos

 @echo off rem Get start time: for /F "tokens=1-4 delims=:.," %%a in ("%time%") do ( set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" ) rem Any process here... rem Get end time: for /F "tokens=1-4 delims=:.," %%a in ("%time%") do ( set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" ) rem Get elapsed time: set /A elapsed=end-start rem Show elapsed time: set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100 if %mm% lss 10 set mm=0%mm% if %ss% lss 10 set ss=0%ss% if %cc% lss 10 set cc=0%cc% echo %hh%:%mm%:%ss%,%cc% 

EDICION 2017-05-09: método más corto agregado

Desarrollé un método más corto para obtener el mismo resultado, así que no pude resistirme a publicarlo aquí. Los dos comandos utilizados para separar partes de tiempo y los tres if comandos utilizados para insertar ceros a la izquierda en el resultado son reemplazados por dos expresiones aritméticas largas, que incluso podrían combinarse en una única línea más larga.

El método consiste en convertir directamente una variable con una hora en formato “HH: MM: SS.CC” en la fórmula necesaria para convertir el tiempo en centisegundos, de acuerdo con el esquema de mapeo que se muestra a continuación:

  HH : MM : SS . CC (((10 HH %%100)*60+1 MM %%100)*60+1 SS %%100)*100+1 CC %%100 

Es decir, insertar (((10 al comienzo, reemplazar los dos puntos por %%100)*60+1 , reemplazar el punto por %%100)*100+1 e insertar %%100 al final; finalmente, evaluar la cadena resultante como una expresión aritmética. En la variable de tiempo hay que sustituir dos subcadenas diferentes, por lo que la conversión debe completarse en dos líneas. Para obtener un tiempo transcurrido, utilice la expresión (endTime)-(startTime) y reemplace ambas cadenas de tiempo en la misma línea

EDITAR 14/06/2017: ajuste independiente de configuración regional agregado

 @echo off setlocal EnableDelayedExpansion set "startTime=%time: =0%" set /P "=Any process here..." set "endTime=%time: =0%" rem Get elapsed time: set "end=!endTime:%time:~8,1%=%%100)*100+1!" & set "start=!startTime:%time:~8,1%=%%100)*100+1!" set /A "elap=((((10!end:%time:~2,1%=%%100)*60+1!%%100)-((((10!start:%time:~2,1%=%%100)*60+1!%%100)" rem Convert elapsed time to HH:MM:SS:CC format: set /A "cc=elap%%100+100,elap/=100,ss=elap%%60+100,elap/=60,mm=elap%%60+100,hh=elap/60+100" echo Start: %startTime% echo End: %endTime% echo Elapsed: %hh:~1%%time:~2,1%%mm:~1%%time:~2,1%%ss:~1%%time:~8,1%%cc:~1% 

Puede revisar una explicación detallada de este método en esta respuesta .

Tal como se responde aquí: ¿Cómo puedo usar un archivo por lotes de Windows para medir el rendimiento de la aplicación de la consola?

El “progtwig” por debajo del lote debe hacer lo que quieras. Tenga en cuenta que genera los datos en centisegundos en lugar de milisegundos. La precisión de los comandos usados ​​es de solo centésimos de segundo.

Aquí hay un ejemplo de salida:

 STARTTIME: 13:42:52,25 ENDTIME: 13:42:56,51 STARTTIME: 4937225 centiseconds ENDTIME: 4937651 centiseconds DURATION: 426 in centiseconds 00:00:04,26 

Aquí está el script por lotes:

 @echo off setlocal rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99 set STARTTIME=%TIME% rem here begins the command you want to measure dir /s > nul rem here ends the command you want to measure set ENDTIME=%TIME% rem output as time echo STARTTIME: %STARTTIME% echo ENDTIME: %ENDTIME% rem convert STARTTIME and ENDTIME to centiseconds set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100) set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100) rem calculating the duratyion is easy set /A DURATION=%ENDTIME%-%STARTTIME% rem we might have measured the time inbetween days if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME% rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds set /A DURATIONH=%DURATION% / 360000 set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000 set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100 set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100) rem some formatting if %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH% if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM% if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS% if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS% rem outputing echo STARTTIME: %STARTTIME% centiseconds echo ENDTIME: %ENDTIME% centiseconds echo DURATION: %DURATION% in centiseconds echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS% endlocal goto :EOF 

Un re-hash del código de Aacini porque lo más probable es que establezca la hora de inicio como variable y desee guardar esa información para su salida:

  @echo off rem ****************** MAIN CODE SECTION set STARTTIME=%TIME% rem Your code goes here (remove the ping line) ping -n 4 -w 1 127.0.0.1 >NUL set ENDTIME=%TIME% rem ****************** END MAIN CODE SECTION rem Change formatting for the start and end times for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do ( set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" ) for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do ( set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" ) rem Calculate the elapsed time by subtracting values set /A elapsed=end-start rem Format the results for output set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100 if %hh% lss 10 set hh=0%hh% if %mm% lss 10 set mm=0%mm% if %ss% lss 10 set ss=0%ss% if %cc% lss 10 set cc=0%cc% set DURATION=%hh%:%mm%:%ss%,%cc% echo Start : %STARTTIME% echo Finish : %ENDTIME% echo --------------- echo Duration : %DURATION% 

Salida:

  Start : 11:02:45.92 Finish : 11:02:48.98 --------------- Duration : 00:00:03,06 

Según las respuestas anteriores, aquí hay “procedimientos” reutilizables y un ejemplo de uso para calcular el tiempo transcurrido:

 @echo off setlocal set starttime=%TIME% echo Start Time: %starttime% REM --------------------------------------------- REM --- PUT THE CODE YOU WANT TO MEASURE HERE --- REM --------------------------------------------- set endtime=%TIME% echo End Time: %endtime% call :elapsed_time %starttime% %endtime% duration echo Duration: %duration% endlocal echo on & goto :eof REM --- HELPER PROCEDURES --- :time_to_centiseconds :: %~1 - time :: %~2 - centiseconds output variable setlocal set _time=%~1 for /F "tokens=1-4 delims=:.," %%a in ("%_time%") do ( set /A "_result=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" ) endlocal & set %~2=%_result% goto :eof :centiseconds_to_time :: %~1 - centiseconds :: %~2 - time output variable setlocal set _centiseconds=%~1 rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds set /A _h=%_centiseconds% / 360000 set /A _m=(%_centiseconds% - %_h%*360000) / 6000 set /A _s=(%_centiseconds% - %_h%*360000 - %_m%*6000) / 100 set /A _hs=(%_centiseconds% - %_h%*360000 - %_m%*6000 - %_s%*100) rem some formatting if %_h% LSS 10 set _h=0%_h% if %_m% LSS 10 set _m=0%_m% if %_s% LSS 10 set _s=0%_s% if %_hs% LSS 10 set _hs=0%_hs% set _result=%_h%:%_m%:%_s%.%_hs% endlocal & set %~2=%_result% goto :eof :elapsed_time :: %~1 - time1 - start time :: %~2 - time2 - end time :: %~3 - elapsed time output setlocal set _time1=%~1 set _time2=%~2 call :time_to_centiseconds %_time1% _centi1 call :time_to_centiseconds %_time2% _centi2 set /A _duration=%_centi2%-%_centi1% call :centiseconds_to_time %_duration% _result endlocal & set %~3=%_result% goto :eof 

Se corrigió el problema 0 Gynnad. Lo arreglé con las dos Líneas

 SET STARTTIME=%STARTTIME: =0% SET ENDTIME=%ENDTIME: =0% 

Script completo ( CalculateTime.cmd ):

 @ECHO OFF :: FUNCTIONS :__START_TIME_MEASURE SET STARTTIME=%TIME% SET STARTTIME=%STARTTIME: =0% EXIT /B 0 :__STOP_TIME_MEASURE SET ENDTIME=%TIME% SET ENDTIME=%ENDTIME: =0% SET /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100) SET /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100) SET /A DURATION=%ENDTIME%-%STARTTIME% IF %DURATION% == 0 SET TIMEDIFF=00:00:00,00 && EXIT /B 0 IF %ENDTIME% LSS %STARTTIME% SET /A DURATION=%STARTTIME%-%ENDTIME% SET /A DURATIONH=%DURATION% / 360000 SET /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000 SET /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100 SET /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100) IF %DURATIONH% LSS 10 SET DURATIONH=0%DURATIONH% IF %DURATIONM% LSS 10 SET DURATIONM=0%DURATIONM% IF %DURATIONS% LSS 10 SET DURATIONS=0%DURATIONS% IF %DURATIONHS% LSS 10 SET DURATIONHS=0%DURATIONHS% SET TIMEDIFF=%DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS% EXIT /B 0 :: USAGE :: Start Measuring CALL :__START_TIME_MEASURE :: Print Message on Screen without Linefeed ECHO|SET /P=Execute Job... :: Some Time pending Jobs here :: '> NUL 2>&1' Dont show any Messages or Errors on Screen MyJob.exe > NUL 2>&1 :: Stop Measuring CALL :__STOP_TIME_MEASURE :: Finish the Message 'Execute Job...' and print measured Time ECHO [Done] (%TIMEDIFF%) :: Possible Result :: Execute Job... [Done] (00:02:12,31) :: Between 'Execute Job... ' and '[Done] (00:02:12,31)' the Job will be executed 

Aquí está mi bash de medir la diferencia de tiempo en lote.

Respeta el formato regional de % TIME% sin tomar ninguna suposición sobre el tipo de caracteres para separadores de tiempo y decimales.

El código está comentado, pero también lo describiré aquí.

Es flexible, por lo que también se puede usar para normalizar valores de tiempo no estándar.

La función principal: timediff

 :: timediff :: Input and output format is the same format as %TIME% :: If EndTime is less than StartTime then: :: EndTime will be treated as a time in the next day :: in that case, function measures time difference between a maximum distance of 24 hours minus 1 centisecond :: time elements can have values greater than their standard maximum value ex: 12:247:853.5214 :: provided than the total represented time does not exceed 24*360000 centiseconds :: otherwise the result will not be meaningful. :: If EndTime is greater than or equals to StartTime then: :: No formal limitation applies to the value of elements, :: except that total represented time can not exceed 2147483647 centiseconds. :timediff    ( setlocal EnableDelayedExpansion set "Input=!%~2! !%~3!" for /F "tokens=1,3 delims=0123456789 " %%A in ("!Input!") do set "time.delims=%%A%%B " ) for /F "tokens=1-8 delims=%time.delims%" %%a in ("%Input%") do ( for %%A in ("@h1=%%a" "@m1=%%b" "@s1=%%c" "@c1=%%d" "@h2=%%e" "@m2=%%f" "@s2=%%g" "@c2=%%h") do ( for /F "tokens=1,2 delims==" %%A in ("%%~A") do ( for /F "tokens=* delims=0" %%B in ("%%B") do set "%%A=%%B" ) ) set /a "@d=(@h2-@h1)*360000+(@m2-@m1)*6000+(@s2-@s1)*100+(@c2-@c1), @sign=((@d&0x80000000)>>31)&1, @d+=(@sign*24*360000), @h=(@d/360000), @d%%=360000, @m=@d/6000, @d%%=6000, @s=@d/100, @c=@d%%100" ) ( if %@h% LEQ 9 set "@h=0%@h%" if %@m% LEQ 9 set "@m=0%@m%" if %@s% LEQ 9 set "@s=0%@s%" if %@c% LEQ 9 set "@c=0%@c%" ) ( endlocal set "%~1=%@h%%time.delims:~0,1%%@m%%time.delims:~0,1%%@s%%time.delims:~1,1%%@c%" exit /b ) 

Ejemplo:

 @echo off setlocal EnableExtensions set "TIME=" set "Start=%TIME%" REM Do some stuff here... set "End=%TIME%" call :timediff Elapsed Start End echo Elapsed Time: %Elapsed% pause exit /b :: put the :timediff function here 


Explicación de la función: timediff:

 function prototype :timediff    

El formato de entrada y salida tiene el mismo formato que % TIME%

Toma 3 parámetros de izquierda a derecha:

Param1: nombre de la variable de entorno para guardar el resultado en.
Param2: Nombre de la variable de entorno que se pasará a la función que contiene la cadena StartTime
Param3: nombre de la variable de entorno que se pasará a la función que contiene la cadena EndTime

Si EndTime es menor que StartTime, entonces:

    EndTime se tratará como una hora al día siguiente
    en ese caso, la función mide la diferencia de tiempo entre una distancia máxima de 24 horas menos 1 centisegundo
    los elementos de tiempo pueden tener valores mayores que su valor máximo estándar ex: 12: 247: 853.5214
    siempre que el tiempo total representado no exceda 24 * 360000 centiseconds o (24: 00: 00.00) de lo contrario, el resultado no será significativo.

Si EndTime es mayor o igual a StartTime, entonces:

    No se aplica ninguna limitación formal al valor de los elementos,
    excepto que el tiempo total representado no puede exceder 2147483647 centiseconds.


Más ejemplos con valores de tiempo literales y no estándar

    Ejemplo literal con EndTime menor que StartTime:
 @echo off setlocal EnableExtensions set "start=23:57:33,12" set "end=00:02:19,41" call :timediff dif start end echo Start Time: %start% echo End Time: %end% echo, echo Difference: %dif% echo, pause exit /b :: put the :timediff function here 
    Salida:
 Hora de inicio: 23: 57: 33,12
 Hora de finalización: 00: 02: 19,41

 Diferencia: 00: 04: 46,29
    Normaliza el tiempo no estándar:
 @echo off setlocal EnableExtensions set "start=00:00:00.00" set "end=27:2457:433.85935" call :timediff normalized start end echo, echo %end% is equivalent to %normalized% echo, pause exit /b :: put the :timediff function here 
    Salida:

 27: 2457: 433.85935 es equivalente a 68: 18: 32.35

    Último ejemplo de bonificación:
 @echo off setlocal EnableExtensions set "start=00:00:00.00" set "end=00:00:00.2147483647" call :timediff normalized start end echo, echo 2147483647 centiseconds equals to %normalized% echo, pause exit /b :: put the :timediff function here 
    Salida:

 2147483647 centiseconds equivalen a 5965: 13: 56.47

Utilizando una sola función con la posibilidad de unidad de medida personalizada o formateada. Cada vez que se llama a la función sin parámetros reiniciamos la hora inicial.

 @ECHO OFF ECHO. ECHO DEMO timer function ECHO -------------------- SET DELAY=4 :: First we call the function without any parameters to set the starting time CALL:timer :: We put some code we want to measure ECHO. ECHO Making some delay, please wait... ECHO. ping -n %DELAY% -w 1 127.0.0.1 >NUL :: Now we call the function again with the desired parameters CALL:timer elapsed_time ECHO by Default : %elapsed_time% CALL:timer elapsed_time "s" ECHO in Seconds : %elapsed_time% CALL:timer elapsed_time "anything" ECHO Formatted : %elapsed_time% (HH:MM:SS.CS) ECHO. PAUSE :: Elapsed Time Function :: ----------------------------------------------------------------------- :: The returned value is in centiseconds, unless you enter the parameters :: to be in another unit of measure or with formatted :: :: Parameters: ::  the returned value :: [formatted] s (for seconds), m (for minutes), h (for hours) :: anything else for formatted output :: ----------------------------------------------------------------------- :timer  [formatted] SetLocal EnableExtensions EnableDelayedExpansion SET _t=%time% SET _t=%_t::0=: % SET _t=%_t:,0=, % SET _t=%_t:.0=. % SET _t=%_t:~0,2% * 360000 + %_t:~3,2% * 6000 + %_t:~6,2% * 100 + %_t:~9,2% SET /A _t=%_t% :: If we call the function without parameters is defined initial time SET _r=%~1 IF NOT DEFINED _r ( EndLocal & SET TIMER_START_TIME=%_t% & GOTO :EOF ) SET /A _t=%_t% - %TIMER_START_TIME% :: In the case of wanting a formatted output SET _f=%~2 IF DEFINED _f ( IF "%_f%" == "s" ( SET /A "_t=%_t% / 100" ) ELSE ( IF "%_f%" == "m" ( SET /A "_t=%_t% / 6000" ) ELSE ( IF "%_f%" == "h" ( SET /A "_t=%_t% / 360000" ) ELSE ( SET /A "_h=%_t% / 360000" SET /A "_m=(%_t% - !_h! * 360000) / 6000" SET /A "_s=(%_t% - !_h! * 360000 - !_m! * 6000) / 100" SET /A "_cs=(%_t% - !_h! * 360000 - !_m! * 6000 - !_s! * 100)" IF !_h! LSS 10 SET "_h=0!_h!" IF !_m! LSS 10 SET "_m=0!_m!" IF !_s! LSS 10 SET "_s=0!_s!" IF !_cs! LSS 10 SET "_cs=0!_cs!" SET "_t=!_h!:!_m!:!_s!.!_cs!" SET "_t=!_t:00:=!" ) ) ) ) EndLocal & SET %~1=%_t% goto :EOF 

Una prueba con un retraso de 94 segundos

 DEMO timer function -------------------- Making some delay, please wait... by Default : 9404 in Seconds : 94 Formatted : 01:34.05 (HH:MM:SS.CS) Presione una tecla para continuar . . . 

El último código de Aacini muestra un asombroso método de sustitución variable.
Es una pena que no sea una prueba de formato regional, falla en muchos niveles.
Aquí hay una solución breve que mantiene el método de sustitución + matemática intacto:

 @echo off setlocal EnableDelayedExpansion set "startTime=%time: =0%" & rem AveYo: fix single digit hour set /P "=Any process here..." set "endTime=%time: =0%" & rem AveYo: fix single digit hour rem Aveyo: Regional format fix with just one aditional line for /f "tokens=1-3 delims=0123456789" %%i in ("%endTime%") do set "COLON=%%i" & set "DOT=%%k" rem Get elapsed time: set "end=!endTime:%DOT%=%%100)*100+1!" & set "start=!startTime:%DOT%=%%100)*100+1!" set /A "elap=((((10!end:%COLON%=%%100)*60+1!%%100)-((((10!start:%COLON%=%%100)*60+1!%%100)" rem Aveyo: Fix 24 hours set /A "elap=!elap:-=8640000-!" rem Convert elapsed time to HH:MM:SS:CC format: set /A "cc=elap%%100+100,elap/=100,ss=elap%%60+100,elap/=60,mm=elap%%60+100,hh=elap/60+100" echo Start: %startTime% echo End: %endTime% echo Elapsed: %hh:~1%%COLON%%mm:~1%%COLON%%ss:~1%%DOT%%cc:~1% & rem AveYo: display as regional pause 

*

TEMPORIZADOR “Lean and Mean” con formato regional, 24 horas y soporte mixto de entrada
Adaptando el cuerpo del método de sustitución de Aacini , sin IF, solo uno FOR (mi arreglo regional)

1: archivo timer.bat colocado en algún lugar en% PATH% o el directorio actual

 @echo off & rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof (if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n) set "TE=!timer_end:%DE%=%%100)*100+1!" & set "TS=!timer_set:%DS%=%%100)*100+1!" set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!" set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100" set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value! endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof 

Uso:
timer & echo start_cmds & timeout / t 3 & echo end_cmds & timer
temporizador y temporizador “23: 23: 23,00”
temporizador “23: 23: 23,00” y temporizador
temporizador “13.23.23,00” y temporizador “03: 03: 03.00”
timer & timer “0: 00: 00.00” no & cmd / v: on / c echo hasta la medianoche =! timer_end!
La entrada ahora puede mezclarse, para esos cambios improbables, pero posibles cambios de formato de tiempo durante la ejecución

2: Función : temporizador incluido con el script por lotes (uso de muestra a continuación):

 @echo off set "TIMER=call :timer" & rem short macro echo. echo EXAMPLE: call :timer timeout /t 3 >nul & rem Any process here.. call :timer echo. echo SHORT MACRO: %TIMER% & timeout /t 1 & %TIMER% echo. echo TEST INPUT: set "start=22:04:04.58" set "end=04.22.44,22" echo %start% ~ start & echo %end% ~ end call :timer "%start%" call :timer "%end%" echo. %TIMER% & %TIMER% "00:00:00.00" no echo UNTIL MIDNIGHT: %timer_end% echo. pause exit /b 

:: para probarlo, copiar y pegar secciones de códigos tanto arriba como debajo

 rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support :timer Usage " call :timer [input - optional] [no - optional]" :i Result printed on second call, saved to timer_end if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof (if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n) set "TE=!timer_end:%DE%=%%100)*100+1!" & set "TS=!timer_set:%DS%=%%100)*100+1!" set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!" set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100" set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value! endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof 

echo es el comando para imprimir el valor de la variable y es posible manejar cualquier matemática.

Pero puede consultar el enlace a continuación para encontrar una solución.

¿Cuánto demora ejecutar un archivo por lotes?