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

StackOverflow https://stackoverflow.com/questions/605522

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

%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

Другие советы

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

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

или

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

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

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

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

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

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

%TIME% имеет формат Ч:ММ:СС,CS после полуночи, поэтому преобразование в сантисекунды > не работает.Увидев пост Патрика Каффа с 6:46, кажется, что это касается не только меня.

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

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

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

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

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

%Дата%:

  • дд.ММ.гггг
  • дд.ММ.гг
  • д.М.гг
  • дд/мм/гг
  • гггг-ММ-дд

%ВРЕМЯ%:

  • Ч:мм:сс,мсек
  • ЧЧ:мм:сс,мсек

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

Причина в том %ДАТА% и %ВРЕМЯ% существуют только для того, чтобы показать пользователю дату и время на выходе, а не использовать их для вычислений.Поэтому, если вы хотите установить правильное расстояние между некоторыми значениями времени или сгенерировать какое-то уникальное значение, зависящее от даты и времени, вам нужно использовать что-то другое и точное, чем %ДАТА% и %ВРЕМЯ%.

Я использую встроенную утилиту Windows 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%
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top