Pergunta

Como faço para imprimir o tempo (em ms) em um arquivo de lote do Windows?

Eu quero medir o tempo que passa entre as linhas no meu arquivo de lote, mas não do Windows "tempo / T" não imprimir milissegundos.

Foi útil?

Solução

%time% deve funcionar, tempo suficiente desde que tenham decorrido entre chamadas:

@echo OFF

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

No meu sistema eu recebo o seguinte resultado:

6: 46: 13.50
6: 46: 13.60

Outras dicas

Se você está fazendo algo como

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

ou

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

então você poderia simplesmente colocar um setlocal enabledelayedexpansion no início do seu arquivo em lotes e uso !time! vez de %time% que fica avaliada em execução, não no analisando a linha (que inclui blocos completos entre parênteses).

Abaixo "programa" lote deve fazer o que quiser. Por favor, note que ela exiba os dados em centésimos de segundo em vez de milissegundos. A precisão dos comandos usados ??é apenas centésimos de segundo.

Aqui está um exemplo de saída:

STARTTIME: 13:42:52,25
ENDTIME: 13:42:56,51
STARTTIME: 4937225 centiseconds
ENDTIME: 4937651 centiseconds
DURATION: 426 in centiseconds
00:00:04,26

Aqui está o script em 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

esta ferramenta poderia ajudar? Ela não retorna o tempo, mas é uma boa ferramenta para medir o tempo de um comando preciso.

% TIME% está no formato H: MM: SS, CS após a meia-noite e, portanto, a conversão para centiseconds> não funciona. Vendo o post de Patrick Cuff com 6:46 parece que não é só de mim.

Mas com estas linhas bevor você deve vai corrigir esse problema fácil:

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

Obrigado por sua inspiração agradável! Eu gosto de usá-lo em meus MPlayer, ffmpeg, Scripts Sox pimp my mediafiles para PocketPlayers velhos apenas por diversão.

Você tem que ter cuidado com o que você quer fazer, porque não é apenas sobre a chegar a tempo.

O lote tem variáveis ??internas para representar a data e o tme: % DATE%% TIME% . Mas eles dependente do Windows Locale.

% Date% :

  • dd.mm.aaaa
  • DD.MM.AA
  • d.M.yy
  • dd / MM / aa
  • AAAA-MM-dd

% TIME% :

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

Agora, quanto tempo seu script vai funcionar e quando? Por exemplo, se ele vai ser mais do que um dia e não passar a meia-noite ela vai definitivamente der errado, porque diferença entre 2 marcas de tempo entre a meia-noite é um valor negativo! Você precisa a data para descobrir distância correta entre os dias, mas como fazer isso se o formato de data não é uma constante? Coisas com % DATE% e % TIME% poder vai worser e worser se você continuar a usá-los para fins de matemática.

O motivo é a % DATE% e % TIME% são existe é apenas para mostrar uma data e uma hora para o usuário na saída, para não usá-los para cálculos. Então, se você quiser fazer distância correta entre alguns valores de tempo ou gerar algum valor único dependente de data e hora, então você tem que usar algo diferente e preciso do que % DATE% e % TIME% .

Eu estou usando as janelas wmic embutido utilitário para solicitar tais coisas (colocá-lo em um arquivo de script):

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

ou digite-o no console cmd.exe:

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

A desvantagem desta situação é um desempenho lento no caso de chamadas freqüentes. Na minha máquina é de cerca de 12 chamadas por segundo.

Se você quiser continuar a usar isso, então você pode escrever algo como isto ( 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

Agora, você pode analisar % RETURN_VALUE% somethere em seu 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top