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


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

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

6 51

6 ответов:

%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% находится в формате H:MM:SS,CS после полуночи и, следовательно, преобразование в сантисекунды >не работает. Увидев сообщение Патрика Каффа с 6: 46 утра, кажется, что это не только я.

но с этой линии bevor вы должны будете исправить эту проблему легко:

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

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

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

пакет имеет внутренние переменные для представления даты и tme:%ДАТА% %ВРЕМЯ%. Но они зависят от окон Место действия.

%дата%:

  • ДД. ММ. гггг
  • dd. MM. yy
  • d.M. yy
  • dd / MM / yy
  • гггг-ММ-ДД

% TIME%:

  • H: mm:ss, msec
  • чч:мм:СС,МС

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

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

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

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

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

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

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

если вы хотите продолжать использовать это, то вы можете написать что-нибудь подобное (get_datetime.летучая мышь):

@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%