Время печати в пакетном файле (миллисекунды) - PullRequest
57 голосов
/ 03 марта 2009

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

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

Ответы [ 6 ]

95 голосов
/ 03 марта 2009

%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

34 голосов
/ 04 марта 2009

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

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

или

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

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

25 голосов
/ 14 февраля 2011

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

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

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
2 голосов
/ 03 декабря 2016

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

Пакет имеет внутренние переменные для представления даты и времени: % 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 голосов
/ 20 февраля 2014

% 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 голосов
/ 03 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...