Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

%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

Ответ 2

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

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

или

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

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

Ответ 3

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

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

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

Вот пакет script:

@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

Ответ 4

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

Ответ 5

% ВРЕМЯ% находится в формате H: MM: SS, CS после полуночи и, следовательно, преобразование в centiseconds > не работает. Увидев сообщение Патрика Каффа с 6:46 утра, кажется, что это не только я.

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

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

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

Ответ 6

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

У партии есть внутренние переменные, чтобы представить дату и tme:% DATE%% TIME%. Но они зависят от Windows Locale.

% Дата%:

  • ДД.ММ.ГГГГ
  • DD.MM.YY
  • d.M.yy
  • дд/ММ/ГГ
  • гггг-ММ-дд

% TIME%:

  • Н: мм: сс, мс
  • HH: мм: сс, мс

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

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

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

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% в своем 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%

Ответ 7

Времени в CMD так же просто, как

echo %TIME% && your_command && cmd /v:on /c echo !TIME!