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

¿Cómo puedo obtener la diferencia entre dos tiempos en un archivo por Lotes? Porque quiero imprimir 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 yo quiero es:

00:09:10,14

O 9 minutos y 10 segundos o 550 segundos

  • Aunque es posible (sólo la búsqueda por fecha/hora de matemáticas en lote, sinceramente) no debería hacerlo. Y yo probablemente no debería preguntar por qué un archivo de proceso por lotes es involucradas en la atención de contenido HTML, supongo.
  • Por qué no debería hacerlo? Yo hago servir HTML porque me implementar algunos plugins y la única manera de ver si el se exito, es buscar a través del archivo de registro en la palabra ‘éxito’.. Y por supuesto quiero comentarios porque son más de 100 plugins. Por lo que puedo ver de la bruja fueron exitosos y la bruja de error. Tiene usted algún método mejor?
  • Usted podría utilizar al menos WSH o PowerShell para la automatización. Hay un montón de opciones hoy en día. Mientras escribo archivos por lotes a mí mismo muy a menudo y saber cómo resolver muchos oscuro de las cosas no es una tecnología que debería servir de base a una generación o en proceso de implementación en si usted puede ayudar.
  • Acabo de encontrar la respuesta que me lo creo. Voy a probar ahora: @nusi stackoverflow.com/questions/605522/print-time-in-a-batch-file-milliseconds
  • ¿Por qué utilizar PowerShell si es Posible en un archivo por lotes? Puedo usar un fichero batch en Windows 7, Vista, XP sin necesidad de instalar nada. Powershell es sólo ‘estándar’ en Windows 7. En el otro sistema operativo necesito para instalarlo.. va a costar más tiempo, aunque es posible en un archivo por lotes..
  • Estoy de acuerdo con Joey, no escriba en los procesos de producción en lote (y yo soy un lote fanático!), tiene mucho limitaciones y es difícil de implementar tareas complejas. Yo elegiría phython/perl o algún lenguaje real que el trabajo independiente de MS (que garantiza su funcionamiento en tres años) y puede cambiar incluso para linux
  • Lo estoy usando para las pruebas de las compilaciones donde correcta. Después de esto me va a borrar. Es sólo una prueba si se implementa. Cuando se que voy a poner un Éxito en el archivo HTML, cuando no voy a poner un Error en el archivo HTML. A continuación, voy a eliminar el plugin. Y así para todos los plugins. No es para la producción o a algo, es solo para ver si funciona. Y ahora tengo un archivo de proceso por lotes y funciona muy bien. Así que no entiendo por qué debo ir a la Powershell o cualquier otra cosa?
  • Tal vez algo como esto – thesysadminhimself.com/2011/03/… – pero como otros han dicho que es mucho más complejo, en el lote que está en un lenguaje de programación real
  • gracias compañero! Ya me pareció ver a mi cuarto puestos de arriba! Sé que es más complejo en un archivo de proceso por lotes. Estoy estudiando Java, por lo que yo sé que aquí hay muchos más métodos, a continuación, en un archivo por lotes.
  • Ah sí, acabo de leer los otros comentarios 🙂 Genial, Java le hará la vida mucho más fácil!

8 Kommentare

  1. 58
    @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%
    

    EDITAR 2017-05-09: más Corta método agregado

    He desarrollado un método más corto para obtener el mismo resultado, así que me pude resistir a publicar aquí. Los dos for comandos que se utilizan para separar las partes de la hora y los tres if comandos que se utilizan para insertar ceros a la izquierda en el resultado son reemplazados por dos de largo expresiones aritméticas, que incluso podría ser combinadas en una sola línea más larga.

    El método consiste en convertir directamente una variable con un tiempo en «HH:MM:SS.CC» el formato en la fórmula necesaria para convertir el tiempo a centiseconds, de acuerdo con el esquema de asignación dada a continuación:

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

    Que es, insertar (((10 en principio, sustituir la coma por %%100)*60+1, sustituir el punto por %%100)*100+1 e insertar %%100 al final; y, por último, evaluar la cadena resultante como una expresión aritmética. En la variable de tiempo hay dos subcadenas que necesita ser reemplazado, por lo que la conversión debe ser completado en dos líneas. Para obtener un tiempo transcurrido, el uso de (endTime)-(startTime) expresión y reemplazar cadenas de hora en la misma línea.

    EDITAR 2017/06/14: Regional independiente de ajuste añadido

    @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 consultar una explicación detallada de este método en esta respuesta.

    • Bien hecho, me gusta mucho. Sólo quiero decir que lo más probable es que la gente se ajuste el tiempo de inicio más temprano en el guión, así que me gustaría establecer la variable de salida / meta valores en lugar de haciendo y el formato en el momento en el que fue grabado. Lo que voy a publicar un re-hash de suyo a continuación.
    • Esto funcionó para mí, es que hace de la configuración regional de los supuestos concretos-que «,» se utiliza un separador de decimales en el resultado (debería ser bastante fácil de detectar a esto ya que estamos analizando %time% de todos modos…), pero con un carácter de cambio de código, funciona para mí, y mira a la derecha (en mi zona).
    • Y para la actualización de la respuesta, usted tiene que reemplazar [...]Time:. con [...]Time:, si usted tiene ‘,’ como separador decimal (locales son horribles).
    • sí, pero el local independiente de ajuste es muy sencillo. Ver mi segunda edición…
    • Gracias por que. Por una razón fuera de mi comprensión de la configuración regional dependiente de la solución dejado de funcionar hoy. Por lo que la actualización es muy apreciada.
    • Hay desequilibrada llaves aquí: «elap=((((10!final:%de tiempo:~2,1%=%%100)*60+1!%%100)-((((10!inicio:%de tiempo:~2,1%=%%100)*60+1!%%100)»
    • Esta es mi cuenta: el (((( en principio = 4 a la izquierda paréntesis. El !end:%time:~2,1%=%%100)*60+1! parte contiene un paréntesis de la derecha que es !reemplazado! una vez que para cada dos puntos en end variable, y end variable contiene dos dos puntos. Un derecho paren ya fue reemplazado en la línea anterior por el punto decimal, por lo que el recuento de aquí es: 3 derecho paréntesis. Además el paréntesis de cierre en %%100) parte de totales 4 derecho paréntesis… El mismo conde se aplican a start variable en el lado derecho del signo menos. Donde está el desequilibrio entre paréntesis?
    • Agregar if %elap% LEQ 0 set /A elap+=24*60*60*100 adecuadamente ir sobre la medianoche.

  2. 41

    Como la respuesta aquí:
    ¿Cómo puedo utilizar un archivo por lotes de Windows para medir el rendimiento de la aplicación de consola?

    A continuación lote «programa» debe hacer lo que quiera. Por favor, tenga en cuenta que las salidas de los datos en centiseconds en lugar de milisegundos. La precisión de los comandos usados sólo centiseconds.

    Aquí es 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á la secuencia de comandos 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
    
    • Aacini la de abajo creo que es mejor porque es más sencillo. También el script escupe errores en mi sistema y no siempre se realizan las operaciones matemáticas. A veces, no estoy seguro de cuál es el problema era, pero no se está haciendo ahora..
    • No está mal, pero aún es un gran error de la izquierda, como Mike ya se dijo. Hay (al menos 🙂 dos comportamientos especiales que un algoritmo tiene que trabajar en torno a: 1. La primera es que los Lotes de pensar que los números precedidos por cero son los números octales. Este se abordan aquí correctamente por el prefijo con un «1» y restar 100 de nuevo. 2. Pero el otro problema es que las horas consistir a veces de un Dígito («2:») y a veces de dos («12:»). Tal vez esta es la configuración regional específica, pero creo que no lo es. Así que el «:~02,2%» falla aquí. Sin embargo, esto no funciona siempre, la solución de Aacini parece funcionar mejor.
    • Por supuesto, la configuración regional se aplican aquí, así que mejor sabe cómo cualquier otro usuario que pueda ejecutar esta secuencia de comandos es configurar… a Mí, por ejemplo: cuando las 01:35 AM, mi «horario» se convierte en: «1:» (en lugar de «01», que estaría bien) y que producirá la secuencia de comandos anterior. Mejor añadir un poco de lógica para cubrir ese!
    • Línea 25: if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME% – no entiendo cómo se supone que funciona!? Creo que debe ser if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%DURATION%+8640000. Constante 8640000 es un número de centiseconds en un día.
  3. 21

    Una re-hash de Aacini del código porque lo más probable es que va a establecer la hora de inicio como una variable que se desea guardar los datos para la 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% 
    

    De salida:

        Start    : 11:02:45.92
        Finish   : 11:02:48.98
                 ---------------
        Duration : 00:00:03,06
    
    • … ustedes saben archivos por lotes han GOSUB-como el comportamiento, la derecha? (a través de la CALL estado de cuenta, usted puede CALL una etiqueta, se pasan los parámetros y puede pasar los valores devueltos… usted puede buscar en google la sintaxis pero no es demasiado difícil).
    • Sí, cuando yo este en mi script me llama como una función.
    • Para dar cuenta de terminar después de la medianoche, me gustaría modificar el segundo bucle for para: for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do ( if %ENDTIME% GTR %STARTTIME% set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" if %ENDTIME% LSS %STARTTIME% set /A "end=((((%%a+24)*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100" )
    • Cómo usar el script dentro DE un ciclo?
    • Colocar el código en entre los bucles for arriba
  4. 2

    Basado en respuestas anteriores, aquí son reutilizables «procedimientos» 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
    
    • Sólo en caso de que centiseconds es negativo, :centiseconds_to_time puede comprobar y precedidos por un signo menos. set "_n=" seguido por if %_centiseconds% lss 0 set "_n=-" & set /A _centiseconds*=-1 luego, al final: set _result=%_n%%_h%:%_m%:%_s%.%_hs% para que call :centiseconds_to_time -3000 test_neg da test_neg = -00:00:30.00
    • No se necesitan en este ejemplo de secuencia de comandos, como la duración es siempre no negativo.
  5. 2

    Fijo Gynnad líder 0 Problema. Me fijo con las dos Líneas de

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

    Completa De La Secuencia De Comandos ( CalculateTime.cmd ):

    @ECHO OFF
    
    :: F U N C T I O N S
    
    :__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
    
    :: U S A G E
    
    :: 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
    
  6. 2

    Aacini más reciente de código muestra una impresionante variable método de sustitución.

    Es una pena que no Regional formato de prueba – falla en muchos niveles.

    He aquí una breve revisión que mantiene la sustitución+math método intacta:

    @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
    

    *

    «Arrolladora» TEMPORIZADOR con formato Regional, las 24 horas y entrada mixto de apoyo

    La adaptación de Aacini del método de sustitución cuerpo, no se SI es, solo uno (el DE mi regionales fix)

    1: Archivo temporizador.bate 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:

    temporizador & echo start_cmds & tiempo de espera /t 3 & echo end_cmds & temporizador

    temporizador & temporizador «23:23:23,00»

    temporizador «23:23:23,00» & temporizador

    temporizador «13.23.23,00» & temporizador «03:03:03.00»

    temporizador & temporizador «0:00:00.00» no & cmd /v:en /c echo hasta la medianoche=!timer_end!

    De entrada pueden ser mezcladas, para aquellos poco probable, pero posible formato de tiempo cambia durante la ejecución

    2: Función :temporizador incluido con la secuencia de comandos por lotes (uso de ejemplo 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
    

    :: a prueba de ti, copiar-pegar encima y por debajo de las secciones del código de

    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
    
  7. 2

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

    Respeta el formato regional de %TIEMPO% sin tomar ninguna hipótesis sobre el tipo de caracteres por el tiempo y los separadores de decimales.

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

    Es flexible, por lo que también puede ser utilizado para normalizar la no-estándar de los valores de tiempo así

    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 <outDiff> <inStartTime> <inEndTime>
    (
        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=(@[email protected])*360000+(@[email protected])*6000+(@[email protected])*100+(@[email protected]), @sign=(@d>>31)&1, @d+=(@sign*24*360000), @h=(@d/360000), @d%%=360000, @[email protected]/6000, @d%%=6000, @[email protected]/100, @[email protected]%%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 :timediff función:

    function prototype  :timediff <outDiff> <inStartTime> <inEndTime>
    

    De entrada y el formato de salida es el mismo formato que %TIEMPO%

    Toma 3 parámetros de izquierda a derecha:

    Param1: Nombre de la variable de entorno para guardar el resultado.

    Param2: Nombre de la variable de entorno que se pasan a la función que contiene StartTime cadena

    Param3: Nombre de la variable de entorno que se pasan a la función que contiene EndTime cadena

    Si la hora de finalización es de menos de StartTime a continuación:

      hora de finalización será tratado como un tiempo en el día siguiente

      en ese caso, la función de las medidas de la diferencia de tiempo entre una distancia máxima de 24 horas menos de 1 centisecond

      el tiempo de los elementos puede tener valores superiores a su nivel máximo de valor de ejemplo: 12:247:853.5214

      siempre que el total de tiempo representado no exceda de 24*360000 centiseconds o (24:00:00.00) de lo contrario el resultado no será significativo.

    Si EndTime es mayor o igual a StartTime a continuación:

      Ningún tipo de limitación se aplica al valor de los elementos,

      salvo que el total de tiempo representado no puede exceder de los 2147483647 centiseconds.


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

      Literal de ejemplo con EndTime menos de 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
    
      De salida:
    Hora De Inicio: 23:57:33,12 
    La Hora De Finalización: 00:02:19,41 
    
    Diferencia: 00:04:46,29 
    
      Normalizar 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
    
      De salida:
     
    27:2457:433.85935 es equivalente a 68:18:32.35 
    
    
      Último bono ejemplo:
    @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
    
      De salida:
     
    2147483647 centiseconds es igual a 5965:13:56.47 
    
    
  8. 1

    El uso de una sola función con la posibilidad de costumbre unidad de medida o el formato.
    Cada vez que se llama a la función sin parámetros se reinicia el tiempo 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:
    ::             <return>     the returned value
    ::             [formatted]  s (for seconds), m (for minutes), h (for hours)
    ::                          anything else for formatted output
    :: -----------------------------------------------------------------------
    :timer <return> [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 seg

    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 . . .
    
    • Una pequeña actualización para una alternativa de formato de salida si queremos que en lugar de hh:mm:ss,cs, cambie el formato a 00h 00m 00s necesitamos para cambiar las líneas con: SET "_t=!_h!:!_m!:!_s!.!_cs!" SET "_t=!_t:00:=!" y reemplazarlos con el siguiente código: IF "%_f%" == "hms" ( SET "_t=!_h!h !_m!m !_s!s" & SET "_t=!_t:00h=!" & SET "_t=!_t:00m=!" & SET "_t=!_t: =!" ) ELSE ( SET "_t=!_h!:!_m!:!_s!.!_cs!" & SET "_t=!_t:00:=!" ) Ahora podemos utilizar como un formato de parámetro de la frase «hms», de modo que el formato de salida sería 00h 00m 00s

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea