Время печати в пакетном файле (миллисекунды)
как напечатать время (в МС) в пакетном файле Windows?
Я хочу измерить время, которое проходит между строками в моем пакетном файле, но Windows "time /T" не печатает миллисекунды.
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%