2009-03-03 10 views

Respuesta

77

%time% debería funcionar, ha transcurrido el plazo de 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 me da el siguiente resultado:

6: 46: 13.50
6: 46: 13.60

+2

En mi máquina, muestra el mismo tiempo, incluso si duermo entre llamadas. –

+0

¿Se puede publicar el código del archivo de proceso por lotes que está tratando de crear? –

+0

nm, soy un idiota. :) –

2

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

+0

Gracias, +1 útil. Pero sigue siendo interesante por qué no hay impresión de tiempo simple en lote ... –

+4

Me gusta esta sugerencia. Desafortunadamente, sin el nombre de la herramienta, cuando el enlace se rompe (por ejemplo, ahora) no puedo ver de qué estás hablando. – Stephen

+4

Creo que podría haber sido 'timethis.exe' (que, en el momento de redactar este documento, parece estar disponible en [este enlace] (http://download.microsoft.com/download/win2000platform/timethis/1.00. 0.1/NT5/ES-US/timethis_setup.exe). – Henning

31

Si está haciendo algo como

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

o

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

entonces se podría simplemente poner un setlocal enabledelayedexpansion al comienzo de su archivo por lotes y utilizar !time! en lugar de %time% que obtiene evaluado en ejecución, no en analizar la línea (que incluye bloques completos encerrado entre paréntesis).

23

El "programa" por debajo del lote debe hacer lo que quiera. 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í 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 
+0

% 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. –

+0

el (1% STARTTIME: ~ 6,2% -100) * 100 debe ser (1% STARTTIME: ~ 6,2% -100) * 1000 etc. – Kvant

+0

the (1% STARTTIME: ~ 9,2% -100) debe ser (1% STARTTIME: ~ 9,2% -100) * 10 etc. – Kvant

2

% TIEMPO% 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.

Sin embargo, con estas líneas se debe registrado para solucionar ese problema fácil:

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

Gracias por su 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.

2

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

El lote tiene variables internas para representar la fecha y la fecha: % FECHA%% TIEMPO%. Pero dependen de la configuración regional de Windows.

% Fecha%:

  • dd.MM.yyyy
  • dd.mm.aa
  • dMyy
  • dd/mm/aa
  • aaaa-MM-dd

% TIME% :

  • H: mm: ss, ms
  • HH: mm: ss, ms

Ahora, el tiempo que el guión va a funcionar 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 aún más graves si continúa usándolas para fines matemáticos.

La razón es la % FECHA% y % TIEMPO% son existe sólo para mostrar una fecha y una hora de usuario en la salida, no utilizarlos para los cálculos. Por lo tanto, si desea establecer la distancia correcta entre algunos valores de tiempo o generar algún valor único dependiente de la fecha y la hora, debe usar algo diferente y preciso que % DATE% y % TIME%.

estoy usando las ventanas wmic incorporadas utilidad para solicitar este tipo de cosas (lo puso 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 escriba 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 

El 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 seguir utilizando esto, entonces usted 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, puede analizar % RETURN_VALUE% somethere en el 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% 
Cuestiones relacionadas