it-swarm.com.ru

Время печати в пакетном файле (миллисекунды)

Как напечатать время (в мс) в пакетном файле Windows?

Я хочу измерить время, которое проходит между строками в моем командном файле, но Windows time/T не печатает миллисекунды.

57
Assaf Lavie

%time% должен работать, если между вызовами прошло достаточно времени:

@echo OFF

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

В моей системе я получаю следующий вывод:

6: 46: 13.50
6: 46: 13.60

95
Patrick Cuff

Если вы делаете что-то вроде

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

или же

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

тогда вы можете просто поместить setlocal enabledelayedexpansion в начало вашего пакетного файла и использовать !time! вместо %time%, который оценивается при выполнении, а не при разборе строки (которая включает в себя полные блоки, заключенные в скобки).

34
Joey

Ниже пакетная "программа" должна делать то, что вы хотите. Обратите внимание, что он выводит данные в секундах, а не в миллисекундах. Точность используемых команд составляет всего несколько секунд.

Вот пример вывода:

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

Вот пакетный скрипт:

@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
25
nusi

Может этот инструмент может помочь? Это не возвращает время, но это хороший инструмент для измерения времени, которое занимает команда.

2
Stefan

Вы должны быть осторожны с тем, что вы хотите сделать, потому что это не просто получить время.

Пакет имеет внутренние переменные для представления даты и времени: % DATE%% TIME%. Но они зависят от локали Windows.

% Дата%:

  • дД.ММ.ГГГГ
  • dD.MM.YY
  • d.M.yy
  • дд/мм/гг
  • yYYY-MM-дд

% TIME%:

  • H: мм: сс, мс
  • HH: мм: сс, мс

Теперь, как долго и когда будет работать ваш скрипт? Например, если он будет длиннее дня и пройдет полночь, он определенно пойдет не так, потому что разница между двумя метками времени между полуночью является отрицательным значением! Вам нужна дата, чтобы узнать правильное расстояние между днями, но как это сделать, если формат даты не является константой? Вещи с % DATE% и % TIME% могут ухудшаться и ухудшаться, если вы продолжите использовать их в математических целях.

Причина в том, что % DATE% и % TIME% существуют только для отображения даты и времени для пользователя в выходных данных, а не для их использования для расчетов. Поэтому, если вы хотите установить правильное расстояние между некоторыми значениями времени или сгенерировать какое-то уникальное значение, зависящее от даты и времени, вы должны использовать что-то другое и точное, чем % DATE% и % TIME%.

Я использую встроенную утилиту wmic для запроса таких вещей (поместите это в файл скрипта):

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

или введите его в консоли cmd.exe:

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

Недостатком этого является низкая производительность при частых звонках. На моей машине это около 12 звонков в секунду.

Если вы хотите продолжить использовать это, вы можете написать что-то вроде этого (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

Теперь вы можете выполнить синтаксический анализ % RETURN_VALUE% где-нибудь в вашем скрипте:

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%
2
Andry

% TIME% имеет формат H: MM: SS, CS после полуночи и, следовательно, преобразование в центсекунды> не работает. Видя пост Патрика Каффа с 6:46 утра, кажется, что это не только я.

Но с помощью этих строк вы легко решите эту проблему:

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

Спасибо за ваше хорошее вдохновение! Мне нравится использовать его в моих скриптах mplayer, ffmpeg, sox, чтобы превратить мои медиафайлы в старые PocketPlayers просто для удовольствия.

2
Mae