yyyy variable ddmmyyyy batch bat and windows batch-file time

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