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

<p>как напечатать время (в мс) в пакетном файле windows?</p><p>я хочу измерить время, которое проходит между строками в моем командном файле, но windows time/t не печатает миллисекунды.</p>

<p><code>%time%</code> должен работать, если между вызовами прошло достаточно времени:</p><pre><code>@echo off @echo %time% ping -n 1 -w 1 127.0.0.1 1>nul @echo %time% </code></pre><p>в моей системе я получаю следующий вывод:</p><blockquote> <p>6: 46: 13.50<br> 6: 46: 13.60</p> </blockquote>

<p>если вы делаете что-то вроде</p><pre><code>for /l %%i in (1,1,500) do @echo %time% </code></pre><p>или же</p><pre><code>if foo ( echo %time% do\_something echo %time% ) </code></pre><p>тогда вы можете просто поместить <code>setlocal enabledelayedexpansion</code> в начало вашего пакетного файла и использовать <code>!time!</code> вместо <code>%time%</code>, который оценивается при выполнении, а не при разборе строки (которая включает в себя полные блоки, заключенные в скобки).</p>

<p>ниже пакетная "программа" должна делать то, что вы хотите. обратите внимание, что он выводит данные в секундах, а не в миллисекундах. точность используемых команд составляет всего несколько секунд.</p><p>вот пример вывода:</p><pre><code>starttime: 13:42:52,25 endtime: 13:42:56,51 starttime: 4937225 centiseconds endtime: 4937651 centiseconds duration: 426 in centiseconds 00:00:04,26 </code></pre><p>вот пакетный скрипт:</p><pre><code>@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 </code></pre>

<p>может <a href="http://www.microsoft.com/downloads/details.aspx?familyid=913795cd-7026-4143-ae85-1f5e096f9be0&displaylang=en">этот инструмент</a> может помочь? это не возвращает время, но это хороший инструмент для измерения времени, которое занимает команда.</p>

<p>вы должны быть осторожны с тем, что вы хотите сделать, потому что это не просто получить время.</p><p>пакет имеет внутренние переменные для представления даты и времени: <em>% date%% time%</em>. но они зависят от локали windows.</p><p><em>% дата%</em>:</p><ul> <li>дд.мм.гггг</li> <li>dd.mm.yy</li> <li>d.m.yy</li> <li>дд/мм/гг</li> <li>yyyy-mm-дд</li> </ul><p><em>% time%</em>:</p><ul> <li>h: мм: сс, мс</li> <li>hh: мм: сс, мс</li> </ul><p>теперь, как долго и когда будет работать ваш скрипт? например, если он будет длиннее дня и пройдет полночь, он определенно пойдет не так, потому что разница между двумя метками времени между полуночью является отрицательным значением! вам нужна дата, чтобы узнать правильное расстояние между днями, но как это сделать, если формат даты не является константой? вещи с <em>% date%</em> и <em>% time%</em> могут ухудшаться и ухудшаться, если вы продолжите использовать их в математических целях.</p><p>причина в том, что <em>% date%</em> и <em>% time%</em> существуют только для отображения даты и времени для пользователя в выходных данных, а не для их использования для расчетов. поэтому, если вы хотите установить правильное расстояние между некоторыми значениями времени или сгенерировать какое-то уникальное значение, зависящее от даты и времени, вы должны использовать что-то другое и точное, чем <em>% date%</em> и <em>% time%</em>.</p><p>я использую встроенную утилиту wmic для запроса таких вещей (поместите это в файл скрипта):</p><pre><code>for /f "usebackq tokens=1,2 delims==" %%i in (`wmic os get localdatetime /value`) do if "%%i" == "localdatetime" echo.%%j </code></pre><p>или введите его в консоли cmd.exe:</p><pre><code>for /f "usebackq tokens=1,2 delims==" %i in (`wmic os get localdatetime /value`) do @if "%i" == "localdatetime" echo.%j </code></pre><p>недостатком этого является низкая производительность при частых звонках. на моей машине это около 12 звонков в секунду.</p><p>если вы хотите продолжить использовать это, вы можете написать что-то вроде этого (<em>get\_datetime.bat</em>):</p><pre><code>@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 </code></pre><p>теперь вы можете выполнить синтаксический анализ <em>% return\_value%</em> где-нибудь в вашем скрипте:</p><pre><code>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% </code></pre>

<blockquote> <p>% time% имеет формат h: mm: ss, cs после полуночи и, следовательно, преобразование в центсекунды> не работает. видя пост патрика каффа с 6:46 утра, кажется, что это не только я.</p> </blockquote><p>но с помощью этих строк вы легко решите эту проблему:</p><pre><code>if " "=="%startzeit:~0,1%" set startzeit=0%startzeit:~-10% if " "=="%endzeit:~0,1%" set endzeit=0%endzeit:~-10% </code></pre><p>спасибо за ваше хорошее вдохновение! мне нравится использовать его в моих скриптах mplayer, ffmpeg, sox, чтобы превратить мои медиафайлы в старые pocketplayers просто для удовольствия.</p>