windows - variable - get date and time cmd
Tiempo de impresión en un archivo por lotes(milisegundos) (6)
¿Cómo imprimo la hora (en ms) en un archivo por lotes de Windows?
Quiero medir el tiempo que pasa entre las líneas en mi archivo por lotes, pero el "tiempo / T" de Windows no imprime milisegundos.
% TIME% tiene 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, deberías solucionarlo 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 mis secuencias de comandos mplayer, ffmpeg, sox para adornar mis archivos multimedia para PocketPlayers antiguos solo por diversión.
El "programa" 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
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%
)
entonces simplemente podría poner una setlocal enabledelayedexpansion
de setlocal enabledelayedexpansion
al principio de su archivo por lotes y !time!
utilizar !time!
en lugar de %time%
que se evalúa en la ejecución, no al analizar la línea (que incluye bloques completos entre paréntesis).
Tal vez esta herramienta podría ayudar? No devuelve el tiempo, pero es una buena herramienta para medir el tiempo que tarda un comando.
Tienes que tener cuidado con lo que quieres hacer, porque no solo se trata de obtener tiempo.
El lote tiene variables internas para representar la fecha y el tiempo: % DATE %% TIME% . Pero dependen de la configuración regional de Windows.
% Fecha% :
- dd.MM.aaaa
- dd.MM.yy
- dMyy
- dd / MM / aa
- aaaa-MM-dd
% TIME% :
- H: mm: ss, mseg
- HH: mm: ss, mseg
Ahora, ¿cuánto tiempo funcionará su script y cuándo? Por ejemplo, si va a durar más de un día y pasa la medianoche definitivamente va a salir 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 fecha no es una constante? Las cosas con % DATE% y % TIME% pueden ser más graves y peores si continúa utilizándolas para fines matemáticos.
La razón por la que % DATE% y % TIME% existen es solo para mostrar una fecha y una hora para el usuario en la salida, no para usarlas para los cálculos. Por lo tanto, si desea establecer la distancia correcta entre algunos valores de tiempo o generar algún valor único en función de la fecha y la hora, debe usar algo diferente y preciso que % FECHA% y % TIEMPO% .
Estoy usando la utilidad incorporada 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íbalo 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 minas, se trata de 12 llamadas por segundo.
Si desea continuar use 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% algo en 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%
%time%
debería funcionar, siempre que haya transcurrido el tiempo suficiente entre 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