Pregunta

¿Cómo imprimo la hora (en ms) en un archivo por lotes de Windows?

Quiero medir el tiempo que pasa entre líneas en mi archivo por lotes, pero Windows " time / T " no imprime milisegundos.

¿Fue útil?

Solución

% time% debería funcionar, siempre que haya transcurrido el tiempo suficiente entre las llamadas:

@echo OFF

@echo %time%
ping -n 1 -w 1 127.0.0.1 1>nul
@echo %time%

En mi sistema obtengo el siguiente resultado:

  

6: 46: 13.50
   6: 46: 13.60

Otros consejos

Si estás haciendo algo como

for /l %%i in (1,1,500) do @echo %time%

o

if foo (
    echo %time%
    do_something
    echo %time%
)

luego, simplemente puede poner un setlocal enabledelayedexpansion al comienzo de su archivo por lotes y usar ! time! en lugar de % time% , que se evalúa en la ejecución, no en el análisis de la línea (que incluye bloques completos entre paréntesis).

Por debajo del lote " programa " deberías hacer lo que quieras Tenga en cuenta que genera los datos en centisegundos en lugar de milisegundos. La precisión de los comandos utilizados es solo de centisegundos.

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

Tal vez esta herramienta podría ayudar? No devuelve el tiempo, pero es una buena herramienta para medir el tiempo que tarda un comando.

  

% TIME% está en el formato H: MM: SS, CS después de la medianoche y, por lo tanto, la conversión a centisegundos > no funciona. Al ver la publicación de Patrick Cuff a las 6:46 am, parece que no soy solo yo.

Pero con estas líneas antes, deberías solucionar ese problema fácilmente:

if " "=="%StartZeit:~0,1%" set StartZeit=0%StartZeit:~-10%
if " "=="%EndZeit:~0,1%" set EndZeit=0%EndZeit:~-10%

Gracias por tu buena inspiración! Me gusta usarlo en mi mplayer, ffmpeg, sox Scripts para modificar mis archivos multimedia para los antiguos PocketPlayers solo por diversión.

Tienes que tener cuidado con lo que quieres hacer, porque no se trata solo de conseguir el tiempo.

El lote tiene variables internas para representar la fecha y el tme: % DATE%% TIME% . Pero dependen de la configuración regional de Windows.

% Date% :

  • dd.MM.yyyy
  • dd.MM.yy
  • d.M.yy
  • dd / MM / aa
  • yyyy-MM-dd

% TIME% :

  • H: mm: ss, msec
  • HH: mm: ss, msec

Ahora, ¿cuánto tiempo funcionará tu script y cuándo? Por ejemplo, si será más largo que un día y si pasa la medianoche, definitivamente saldrá mal, porque la diferencia entre 2 marcas de tiempo entre una medianoche es un valor negativo. ¿Necesita la fecha para averiguar la distancia correcta entre días, pero cómo lo hace si el formato de la fecha no es una constante? Las cosas con % DATE% y % TIME% pueden empeorar y empeorar si continúa usándolas para los propósitos matemáticos.

El motivo es que % DATE% y % TIME% existen solo para mostrar una fecha y una hora al usuario en la salida, no para usarlos para cálculos Por lo tanto, si desea establecer la distancia correcta entre algunos valores de tiempo o generar un valor único que dependa de la fecha y la hora, debe usar algo diferente y preciso que % DATE% y % TIME% .

Estoy usando la utilidad incorporada de wmic windows para solicitar tales cosas (ponerlo en un archivo de script):

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE`) do if "%%i" == "LocalDateTime" echo.%%j

o escríbelo en la consola cmd.exe:

for /F "usebackq tokens=1,2 delims==" %i in (`wmic os get LocalDateTime /VALUE`) do @if "%i" == "LocalDateTime" echo.%j

La desventaja de esto es un rendimiento lento en caso de llamadas frecuentes. En la máquina de la mina, se trata de 12 llamadas por segundo.

Si desea continuar usando esto, puede escribir algo como esto ( get_datetime.bat ):

@echo off

rem Description:
rem   Independent to Windows locale date/time request.

rem Drop last error level
cd .

rem drop return value
set "RETURN_VALUE="

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if "%%i" == "LocalDateTime" set "RETURN_VALUE=%%j"

if not "%RETURN_VALUE%" == "" (
  set "RETURN_VALUE=%RETURN_VALUE:~0,18%"
  exit /b 0
)

exit /b 1

Ahora, puedes analizar % RETURN_VALUE% en algún lugar de tu script:

call get_datetime.bat
set "FILE_SUFFIX=%RETURN_VALUE:.=_%"
set "FILE_SUFFIX=%FILE_SUFFIX:~8,2%_%FILE_SUFFIX:~10,2%_%FILE_SUFFIX:~12,6%"
echo.%FILE_SUFFIX%
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top