Як я вимірюю час виконання команди в командному рядку Windows?


Відповіді:


113

Якщо ви використовуєте Windows 2003 (зауважте, що Windows Server 2008 і пізніші версії не підтримуються), ви можете використовувати комплект ресурсів Windows Server 2003, який містить timeit.exe, який відображає детальну статистику виконання. Ось приклад тимчасової роботи команди "timeit -?":

C:\>timeit timeit -?
Invalid switch -?
Usage: TIMEIT [-f filename] [-a] [-c] [-i] [-d] [-s] [-t] [-k keyname | -r keyname] [-m mask] [commandline...]
where:        -f specifies the name of the database file where TIMEIT
                 keeps a history of previous timings.  Default is .\timeit.dat
              -k specifies the keyname to use for this timing run
              -r specifies the keyname to remove from the database.  If
                 keyname is followed by a comma and a number then it will
                 remove the slowest (positive number) or fastest (negative)
                 times for that keyname.
              -a specifies that timeit should display average of all timings
                 for the specified key.
              -i specifies to ignore non-zero return codes from program
              -d specifies to show detail for average
              -s specifies to suppress system wide counters
              -t specifies to tabular output
              -c specifies to force a resort of the data base
              -m specifies the processor affinity mask

Version Number:   Windows NT 5.2 (Build 3790)
Exit Time:        7:38 am, Wednesday, April 15 2009
Elapsed Time:     0:00:00.000
Process Time:     0:00:00.015
System Calls:     731
Context Switches: 299
Page Faults:      515
Bytes Read:       0
Bytes Written:    0
Bytes Other:      298

Ви можете отримати TimeIt в наборі ресурсів Windows 2003. Завантажте його тут .


7
Цей комплект має проблеми з Windows 2008 64bit і не працює на R2 2008 року
Артем

чи можна також виміряти час ядра та / або час, що використовується спареними підпроцесами?
rogerdpack

38
FYI - я не думаю, що timeit працює на Windows 7 64-розрядний. Ви отримуєте помилку Measure-Command "як Casey.K пропонує:« Неможливо дані про продуктивності системи запитів (c0000004) Замість того, щоб використовувати PowerShell в. " Stackoverflow.com/questions/673523 / ...
Michael La Voie

6
У Windows 7 я бачу, що "timeit" не розпізнається як внутрішня чи зовнішня команда, функціонуюча програма чи пакетний файл. "
Полковник Паніка

3
Я не бачу команди в Windows 10, і я не знаходжу набір ресурсів для Win 10. Хто-небудь знає, як отримати це за 10?
Джей Імерман

469

Крім того, Windows PowerShell має вбудовану команду, схожу на команду Баша "time". Це називається "Захід-командування". Вам доведеться переконатися, що PowerShell встановлений на машині, на якій він працює.

Приклад введення:

Measure-Command {echo hi}

Приклад Вихід:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 1318
TotalDays         : 1.52546296296296E-09
TotalHours        : 3.66111111111111E-08
TotalMinutes      : 2.19666666666667E-06
TotalSeconds      : 0.0001318
TotalMilliseconds : 0.1318

21
Це найкраще рішення для користувачів Windows 7, оскільки timeit.exe не підтримує Windows 7
Michael La Voie

14
Якщо ви хочете використовувати внутрішні dos-команди (наприклад: dir, echo, del тощо), не забудьте вставити "cmd / c": Measure-Command {cmd / c dir / sc: \ windows> nul}
LietKynes

7
Якщо ви бенчмаркінгу .exeв поточному каталозі, використовуйте це: Measure-Command { .\your.exe }. PowerShell, мабуть, не запускає речі, pwdякщо прямо не сказано.
Крістіан Діаконеску

13
Прикро, проте, він приховує вигляд.
Zitrax

13
Це НЕ ВСЕ, інструмент, «схожий на команду часу Баша» . Хоча приємно знати, але ... але: він не виконується і повертається до<stdout> результатів команди, укладеної у фігурні дужки!
Курт Пфайфл

287

Якщо хочете

  1. Виміряти час виконання до сотої секунди в (hh: mm: ss.ff формат)
  2. Щоб не потрібно завантажувати та встановлювати пакет ресурсів
  3. Щоб виглядати як величезний ботанік DOS (хто ні)

Спробуйте скопіювати такий сценарій у новий пакетний файл (наприклад, timecmd.bat ):

@echo off
@setlocal

set start=%time%

:: Runs your command
cmd /c %*

set end=%time%
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100

set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%

:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)

Використання

Якщо ви помістите timecmd.bat у каталог на своєму шляху, ви можете викликати його з будь-якого місця:

timecmd [your command]

Напр

C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18

Якщо ви хочете зробити перенаправлення виводу, ви можете процитувати команду так:

timecmd "dir c:\windows /s > nul"

Тут слід обробляти команди, які виконуються з до півночі, але вихід буде неправильним, якщо ваша команда працює протягом 24 годин і більше.


9
заміна cmd / c% * на % * працює, якщо ваша команда не є іншим пакетним файлом. Тоді вам доведеться зателефонувати timecmd зателефонувати other.bat
Джессі

2
@JesseChisholm У Windows 8 (і я також читав у Windows 7) вам не потрібен дзвінок для .bat
Brian J

4
Чомусь це дає лише вихід за цілі секунди ... що для мене марно. Я маю на увазі, що я бігаю timecmd pause, і це завжди призводить до 1,00 сек, 2,00 сек, 4,00 сек ... навіть 0,00 сек! Windows 7.
Каміло Мартін

9
@CamiloMartin та інші, у кого це було (як у мене) - у вас може бути локаль, який використовує COMMA замість DOT для десяткової. Отже, в цьому описі змініть delims=:.на delims=:.,, і тоді це повинно працювати "по всій дошці".
Томаш Гандор

5
У цьому сценарії є серйозна арифметична помилка: Спробуйте це: set start=10:10:10.10 set end=10:11:10.09І це виведе: command took 0:1:-1.99 (59.99s total) Ви повинні змінити порядок 4 рядків, які роблять "lss 0" порівняння, щоб перенос рухався правильно від низьких до високих статевих цифр. Тоді вихід стає: command took 0:0:59.99 (59.99s total)
Жан-Франсуа Ларвуар

230

Так, найпростішим рішенням може бути таке:

echo %time%
YourApp.exe
echo %time%

Це працює в будь-якій Windows поза коробкою.


У випадку, коли програма використовує консольний вихід, може бути зручно зберігати час початку у тимчасовій змінній:

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%

163
Ти здурів?! Це включає заняття математикою у мозку. Ось чому ми винайшли комп’ютери, щоб ми могли уникати подібних дій.
Люк Сампсон

1
блискучий! Незважаючи на те, що для процесорного часу це не дуже допомагає
Ілля Саункін

10
Ще краще (якщо ваш додаток плює вихід на консоль): set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time% (Вибачте, не вдалося отримати нові рядки в коментарі)
Jono

1
@LukeSampson, ви можете використовувати setматематику. ;-)О, чекайте, ніколи, ви вже це робили нижче.
Synetech

2
Ні, це поганий варіант. Це повідомляє вам про годинниковий час, а не про процесорний час. Тож, навіть якщо ваш командний рядок може зайняти лише 100 мс, якщо інша програма притискає процесор, ваша програма може зайняти секунди (вимкнено 100 або більше разів). Насправді, якщо ваша машина лущить, ви можете навіть зачекати хвилину, поки ваш маленький додаток на 100 м запуститься. Відстежуйте час процесора, а не настінний годинник!
Райан Шиллінгтон

102

Просто трохи розширення відповіді від Casey.K про використання Measure-Commandз допомогою PowerShell :

  1. Ви можете викликати PowerShell із стандартного командного рядка, наприклад:

    powershell -Command "Measure-Command {echo hi}"
    
  2. Це буде мати стандартний вихід, але ви можете запобігти цьому, додавши | Out-Defaultподібне до PowerShell:

    Measure-Command {echo hi | Out-Default}
    

    Або з командного рядка:

    powershell -Command "Measure-Command {echo hi | Out-Default}"
    

Звичайно, ви вільні , щоб обернути це в файл сценарію *.ps1або *.bat.


1
Що робити, якщо команда, яку ми хочемо виміряти, має лапки? Чи можна в цьому випадку це перетворити на сценарій .bat? НаприкладmeasureTime.bat "c:\program files\some dir\program.exe"
GetFree

53

Я використовую єдиний вкладиш для Windows Server 2008 R2:

cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"

До тих пір, поки мій команди не потребує цитат (які гвинти з обробкою цитат cmd). Потрібно /v:on, щоб при виконанні команди два різних значення TIME оцінювались незалежно, а не один раз.


Це також не буде працювати для пакетів "спаму", які перезаписують ярлик уперше, а це означає, що ви замінюєте комп'ютер, який виконує обчислення, як зазначено в stackoverflow.com/questions/673523/…
Val

Зазвичай ви можете ^^"
залишити

2
Якщо ви повторите cmd / v: on для другого моменту, ми можемо навіть мати, щоб мійкоманд містив лапки. Приклад: cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!.
Maarten Pennings

8
Simpler: echo %time% & *mycommand* & call echo %^time%. Дивіться також цю відповідь .
Аакіні

Якщо ваша команда виводить занадто багато, можливо, простіше просто скласти два рази разом:cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
ZHANG Zikai

49

Якщо у вас відкрито вікно команд і викликуйте команди вручну, ви можете відобразити часову позначку в кожному запиті, наприклад

prompt $d $t $_$P$G

Це дає вам щось на кшталт:

23.03.2009 15:45:50,77

C:\>

Якщо у вас невеликий пакетний сценарій, який виконує ваші команди, перед кожною командою є порожній рядок, наприклад

(порожній рядок)

myCommand.exe

(наступний порожній рядок)

myCommand2.exe

Ви можете обчислити час виконання кожної команди за інформацією про час у підказці. Найкраще, мабуть, було б передати висновок у текстовий файл для подальшого аналізу:

MyBatchFile.bat > output.txt

3
Думав, що я відпущуся через пару років за дискусію, щоб подякувати вам за те, що ви поділилися командою підказок. Я бачив багато хитрощів CMD (більше башти), але цей уникнув мого повідомлення.
Стів Ховард

Простий, елегантний, не встановлює і не записує пакетні файли для однієї команди зняття, і може робити кожен крок у пакетному файлі.
Мет

26

Оскільки інші рекомендують встановлювати такі речі, як freeware та PowerShell, ви також можете встановити Cygwin , який надасть вам доступ до багатьох основних команд Unix, таких як час :

abe@abe-PC:~$ time sleep 5

real    0m5.012s
user    0m0.000s
sys 0m0.000s

Не впевнений, скільки додає Кігвін.


41
Відповідаючи на запитання Windows, Cygwin вважається обманом :-)
mivk

14
Він заявив, що користувачі ResourceKit, TimeMem, ptime.exe, PowerShell та інших утиліт почали обманювати спочатку. Тому автор зробив ваш коментар недоречним, перш ніж ви його написали.
Валь

Я також підтримав це, оскільки знайшов це найпростішим рішенням, оскільки безкоштовна програма Cmder включає bash! cmder.net Пам'ятайте лише, що якщо вам потрібно уникнути пробілів у баші, використовуйте чорну косу \ безпосередньо перед пробілом замість "лапок". наприклад, cd / c / Program \ Files /
lukescammell

24

Не настільки елегантний, як деякі функції в Unix, але створити cmd-файл, який виглядає так:

@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T

Це відображатиме час початку та зупинки:

The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:

2
Припустимо, що вам не потрібна портативність на різних мовах, ви також можете поставити findstr "current" або щось подібне після "time <nul" (приємне використання нуля, до речі, я завжди використовував ехо. | Час, але це не виглядає так елегантно :)). І використовуйте "для", щоб витягнути лише час, а не текст.
Joey

2
Якщо розширення команд увімкнено (тобто за замовчуванням), версія XP XP timeмає /tопцію, яка просто відображає поточний системний час, не спонукаючи вас вводити новий час. Однак коли ви це робите, він відображає лише години та хвилини, що може бути недостатньо добре для деяких звичаїв. (Див. Відповідь Джона Сноу на це запитання.)
мартіно

3
time /Tє корисним лише в тому випадку, якщо процес триває кілька хвилин! time < nulбрудніше, але точніше.
PhiLho

6
Ви також можете використовувати той, echo %time%що забезпечує той самий формат і точність, як і time < nul, але ви уникаєте Enter the new time:виходу ...
aschipfl

точніше використання часу для незалежного від wmic os get LocalDateTime
локальної мережі amd

19

Я використовую безкоштовну програму під назвою "GS Timer".

Просто зробіть такий пакетний файл:

timer
yourapp.exe
timer /s

Якщо вам потрібен набір разів, просто вставте висновок таймера / с у файл .txt.

Ви можете отримати його тут: Безкоштовні утиліти DOS Gammadyne


Роздільна здатність - 0,1 секунди.


4
Я не думаю, що використання стороннього додатку не можна вважати робити це "стандартними засобами".
мартіно

4
Опитувач означав "без встановлення додаткового програмного забезпечення", але тоді вгорі (прийнято) відповідь також вимагає встановити цілий комплект ресурсів Windows 2003! У будь-якому випадку, timer.exe був ідеальним для того, що я просто шукав, дякую!
Гюго

1
Це посаджене посилання. SoftPedia - ферма кліків.
Том А

@ Поясніть, будь ласка, що ви маєте на увазі "посаджене посилання"?
pepoluan

10
Ось пряме посилання на власну сторінку розробника: gammadyne.com/cmdline.htm#timer
Хьюго

14

Я використовую Windows XP і чомусь timeit.exe не працює для мене. Я знайшов ще одну альтернативу - PTIME. Це працює дуже добре.

http://www.pc-tools.net/win32/ptime/

Приклад -

C:\> ptime

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

Syntax: ptime command [arguments ...]

ptime will run the specified command and measure the execution time
(run time) in seconds, accurate to 5 millisecond or better. It is an
automatic process timer, or program timer.


C:\> ptime cd

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  cd ===
C:\

Execution time: 0.015 s

Також добре працює і в Windows 8.1. Я перейменував шахту на timer.exe, тому що не можу запам'ятати ім'я ptime.
Брайан Бернс

11

Є також TimeMem (березень 2012 року):

Це утиліта Windows, яка виконує програму та відображає час її виконання, використання пам'яті та статистику IO. За функціональністю вона схожа на утиліту Unix.


10

Поки це не триває довше 24 годин ...

@echo off

set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)

:TimeThis
ping localhost 

set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)

set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

echo.
echo Took: %timetaken% sec.

5
Вражає, але я не думаю, що це спрацьовує, якщо в початковому або кінцевому періоді є 08 або 09, оскільки вони трактуються як вісімки. Моя відповідь вирішує це :)
Люк Сампсон

6

Ось

Версія таймера Postfix:

Приклад використання:

тайм-аут 1 | TimeIt.cmd

Execution took  ~969 milliseconds.

Скопіюйте та вставте це в який-небудь редактор, наприклад, Блокнот ++ та збережіть його як TimeIt.cmd :

:: --- TimeIt.cmd ----
    @echo off
    setlocal enabledelayedexpansion

    call :ShowHelp

    :: Set pipeline initialization time
    set t1=%time%

    :: Wait for stdin
    more

    :: Set time at which stdin was ready
    set t2=!time!


    :: Calculate difference
    Call :GetMSeconds Tms1 t1
    Call :GetMSeconds Tms2 t2

    set /a deltaMSecs=%Tms2%-%Tms1%
    echo Execution took ~ %deltaMSecs% milliseconds.

    endlocal
goto :eof

:GetMSeconds
    Call :Parse        TimeAsArgs %2
    Call :CalcMSeconds %1 %TimeAsArgs%

goto :eof

:CalcMSeconds
    set /a %1= (%2 * 3600*1000) + (%3 * 60*1000) + (%4 * 1000) + (%5)
goto :eof

:Parse

    :: Mask time like " 0:23:29,12"
    set %1=!%2: 0=0!

    :: Replace time separators with " "
    set %1=!%1::= !
    set %1=!%1:.= !
    set %1=!%1:,= !

    :: Delete leading zero - so it'll not parsed as octal later
    set %1=!%1: 0= !
goto :eof

:ShowHelp
    echo %~n0 V1.0 [Dez 2015]
    echo.
    echo Usage: ^<Command^> ^| %~nx0
    echo.
    echo Wait for pipe getting ready... :)
    echo  (Press Ctrl+Z ^<Enter^> to Cancel)
goto :eof

^ - На основі версії "Даніель Спаркс"


5

Альтернативою часу вимірювання є просто "Get-Date". У вас немає таких клопотів з виводом для переадресації тощо.

$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start

Вихід:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 506
Ticks             : 15060003
TotalDays         : 1.74305590277778E-05
TotalHours        : 0.000418333416666667
TotalMinutes      : 0.025100005
TotalSeconds      : 1.5060003
TotalMilliseconds : 1506.0003

Це було ідеально для мене
Brett

4

Це однолінійний параметр, який дозволяє уникнути затримки розширення , що може порушити певні команди:

cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "

Вихід має щось на кшталт:

14:30:27.58$
...
14:32:43.17$ rem/ 

Для тривалих випробувань замінити $Tна $D, $Tі %TIME%на%DATE%, %TIME% включати дату.

Щоб використовувати це всередині пакетного файлу , замініть %Zна %%Z.


Оновлення

Ось покращений однолінійний (без затримки розширення теж):

cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"

Вихід виглядає приблизно так:

2015/09/01, 14:30:27.58$ rem/ 
...
2015/09/01, 14:32:43.17$ prompt

Цей підхід не включає процес інстанції нового cmdв результаті, а також не включає promptкоманди (команди).


4

Залежно від версії Windows, яку ви використовуєте, саме запущений режим bashпереведе вас у режим Bash. Це дозволить використовувати купу команд, які недоступні безпосередньо в PowerShell (наприклад, timeкоманда). Призначення часу команди так само просто, як і виконання:

# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>

Примітка. Ви можете легко вийти з режиму Bash і повернутися назад у свою основну оболонку, запустившись exitу режимі Bash.

Це спрацювало для мене чудово (Windows 10) після випробування інших методів (наприклад Measure-Command), які іноді дають небажані статистичні дані. Сподіваюся, це працює і для вас.


2
Станом на Windows 10 1607 найкраща відповідь.
CarpeDiemKopi

2

Якщо хто-небудь ще завітав сюди, шукаючи відповідь на це питання, є функція API Windows, яка називається GetProcessTimes(). Написати невелику програму C, яка б запустила команду, здійснила цей виклик та повернула час роботи, виглядає не надто багато.


3
Це не виглядає як занадто багато роботи, щоб завантажити невелику програму C, яка запустила б команду, здійснила цей виклик (і набагато більше попередніх вимірювань) та повернула час роботи.
Елазар Лейбович

@ElazarLeibovich powerhell? Ви можете зателефонувати на нього з C #.
KeyWeeUsr

@KeyWeeUsr ви можете використовувати Windows API IIRC від PS blogs.technet.microsoft.com/heyscriptingguy/2013/06/25/…
Elazar

2

Це коментар / редакція до приємного timecmd.batта відповіді Лука Сампсона

Чомусь це дає лише вихід за цілі секунди ... що для мене марно. Я маю на увазі, що я запускаю timecmd паузу, і це завжди призводить до 1,00 сек, 2,00 сек, 4,00 сек ... навіть 0,00 сек! Windows 7. - Camilo Martin 25 вересня 1313 о 16:00 "

У деяких конфігураціях розмежувачі можуть відрізнятися. Наступна зміна повинна охопити принаймні більшість західних країн.

set options="tokens=1-4 delims=:,." (added comma)

The %time% миллисекундах працюють в моїй системі додавши , що «»

(* тому що сайт не дозволяє коментувати без коментарів і не відстежувати особистість, хоча я завжди використовую ту саму електронну пошту гостя, яка в поєднанні з ipv6 ip і відбитком браузера повинна бути достатньою для однозначної ідентифікації без пароля)


Я прокоментував це саме перед тим, як прокрутити до вашої відповіді. У будь-якому випадку, сценарій Луки міг би нульову годину, хвилини та секунди, а не лише підсекунди (це сантисекунди , а не мілісекунди, BTW). Дивіться тут: en.wiktionary.org/wiki/centisecond
Томаш

2

Ось мій метод, без перетворення і без мс. Корисно визначити тривалість кодування (хоча обмежено 24 години):

@echo off

:start
REM Start time storage
set ST=%time%
echo Process started at %ST%
echo.
echo.

REM Your commands
REM Your commands
REM Your commands

:end
REM Start Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%ST%") do set /a h1=%%a & set /a m1=%%b & set /a s1=%%c

REM End Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%TIME%") do set /a h2=%%a & set /a m2=%%b & set /a s2=%%c

REM Difference
set /a h3=%h2%-%h1% & set /a m3=%m2%-%m1% & set /a s3=%s2%-%s1%

REM Time Adjustment
if %h3% LSS 0 set /a h3=%h3%+24
if %m3% LSS 0 set /a m3=%m3%+60 & set /a h3=%h3%-1
if %s3% LSS 0 set /a s3=%s3%+60 & set /a m3=%m3%-1

echo Start    :    %ST%
echo End    :    %time%
echo.
echo Total    :    %h3%:%m3%:%s3%
echo.
pause

1
@echo off & setlocal

set start=%time%

REM Do stuff to be timed here.
REM Alternatively, uncomment the line below to be able to
REM pass in the command to be timed when running this script.
REM cmd /c %*

set end=%time%

REM Calculate time taken in seconds, to the hundredth of a second.
REM Assumes start time and end time will be on the same day.

set options="tokens=1-4 delims=:."

for /f %options% %%a in ("%start%") do (
    set /a start_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
    set /a start_hs=100%%d %% 100
)

for /f %options% %%a in ("%end%") do (
    set /a end_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
    set /a end_hs=100%%d %% 100
)

set /a s=%end_s%-%start_s%
set /a hs=%end_hs%-%start_hs%

if %hs% lss 0 (
    set /a s=%s%-1
    set /a hs=100%hs%
)
if 1%hs% lss 100 set hs=0%hs%

echo.
echo  Time taken: %s%.%hs% secs
echo.

Не працює. Отримання: незбалансована дужка. Незбалансована дужка. Відсутній операнд.
Річард Сандос

@RichardSandoz Це прекрасно працює, немає незбалансованих дужок. Як ти це використовуєш?
MikeM

1

Наступний скрипт використовує лише "cmd.exe" і виводить кількість мілісекунд з моменту створення конвеєра до часу закінчення процесу, що передує сценарію. тобто введіть свою команду та передайте скрипт. Приклад: "timeout 3 | runtime.cmd" повинен дати щось на зразок "2990." Якщо вам потрібен і вихідний час виконання, і вихід STDIN, перенаправлення stdin перед трубою - наприклад: "dir / s 1> temp.txt | runtime.cmd" буде скидати висновок команди "dir" на "temp.txt" і надрукував би час виконання на консолі.

:: --- runtime.cmd ----
@echo off
setlocal enabledelayedexpansion

:: find target for recursive calls
if not "%1"=="" (
    shift /1
    goto :%1
    exit /b
)

:: set pipeline initialization time
set t1=%time%

:: wait for stdin
more > nul

:: set time at which stdin was ready
set t2=!time!

::parse t1
set t1=!t1::= !
set t1=!t1:.= !
set t1=!t1: 0= !

:: parse t2
set t2=!t2::= !
set t2=!t2:.= !
set t2=!t2: 0= !

:: calc difference
pushd %~dp0
for /f %%i in ('%0 calc !t1!') do for /f %%j in ('%0 calc !t2!') do (
    set /a t=%%j-%%i
    echo !t!
)
popd
exit /b
goto :eof

:calc
set /a t=(%1*(3600*1000))+(%2*(60*1000))+(%3*1000)+(%4)
echo !t!
goto :eof

endlocal

Ну а замість рекурсивного виклику сценарію, подумайте зробити це так call :calc. Я це зробив тут. Код посилання отримати дещо приємніше. : D
Наду

Помилка №1 вийде з ладу о 12-й годині. Приклад: " 0 : 23: 19,42" Помилка №2 вийде з ладу, якщо десяткова крапка - щось інше. той же приклад: "0:23:19 , 42" тут десяткова крапка є, <__________> Добре спробував відредагувати, проте німий **** у "комісії з затвердження редагування" відхилив це - 3 з 5 проголосували "Це редагування теж змінюється значна частина оригінальних намірів авторів ". тому якщо ви хочете спробувати удачу з редагуванням або просто тримати помилки - значить, "авторський намір авторів залишається недоторканим". facepalm
Nadu

Не вдається вивести мілісекунд, коли роздільна здатність вашого годинника ледь здатна до 1/100 секундної роздільної здатності.
jwdonahue

1

Відповідь driblio можна зробити трохи коротшою (хоча і не дуже читаною)

@echo off

:: Calculate the start timestamp
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _started=_hours*60*60*100+_min*60*100+_sec*100+_cs


:: yourCommandHere


:: Calculate the difference in cSeconds
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _duration=_hours*60*60*100+_min*60*100+_sec*100+_cs-_started

:: Populate variables for rendering (100+ needed for padding)
set /a _hours=_duration/60/60/100,_min=100+_duration/60/100%%60,_sec=100+(_duration/100%%60%%60),_cs=100+_duration%%100

echo Done at: %_time% took : %_hours%:%_min:~-2%:%_sec:~-2%.%_cs:~-2%

::prints something like:
::Done at: 12:37:53,70 took: 0:02:03.55

На зауваження Лука Сампсона, ця версія є безпечною для восьмериків, хоча завдання має бути виконане за 24 години.


Не працює. Відсутній оператор, коли одноцифрова година.
Річард Сандос

set _time=%time: =0%виправляє одноцифрову годинну проблему - замініть в обох місцях.
Лаур

1
  1. У каталозі, де знаходиться ваша програма, введіть notepad mytimer.bat, натисніть «так», щоб створити новий файл.

  2. Вставте код нижче, замінивши YourApp.exeпрограмою, а потім збережіть.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. Введіть mytimer.batкомандний рядок і натисніть клавішу Enter.


7
час / т дає лише час у HH: MM. Щоб встигнути виконати, вам зазвичай потрібна більша точність ... Чи все, що ви можете налаштувати, щоб перейти до частки секунди? Я тестував гуманного від JohnW (час <NUL), і що на насправді дає час до 1 / 100s: HH: MM: SS.XX
благоговіння

1

мій код дає вам час роботи в мілісекундах, до 24 годин, він нечутливий до локальних даних і враховує негативні значення, якщо код працює через півночі. він використовує уповільнене розширення, і його слід зберегти у файлі cmd / bat.

перед вашим кодом:

SETLOCAL EnableDelayedExpansion

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t1 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t1=!t1!%t:~15,3%

після коду:

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t2 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t2=!t2!%t:~15,3%
set /a t2-=t1 && if !t2! lss 0 set /a t2+=24*3600000

якщо ви хочете час роботи у форматі HH: мм: ss.000, додайте:

set /a "h=t2/3600000,t2%%=3600000,m=t2/60000,t2%%=60000" && set t2=00000!t2!&& set t2=!t2:~-5!
if %h% leq 9 (set h=0%h%) && if %m% leq 9 (set m=0%m%)
set t2=%h%:%m%:%t2:~0,2%.%t2:~2,3%

ENDLOCAL

змінна t2утримує ваш час роботи, ви можете echo %t2%відобразити її.


1

Перл встановив доступне рішення для найму: запустіть:

C:\BATCH>time.pl "echo Fine result"
0.01063
Fine result

STDERR виходить перед вимірюваними секундами

#!/usr/bin/perl -w

use Time::HiRes qw();
my $T0 = [ Time::HiRes::gettimeofday ];

my $stdout = `@ARGV`;

my $time_elapsed = Time::HiRes::tv_interval( $T0 );

print $time_elapsed, "\n";
print $stdout;

0

Використання підрядника для повернення часу в сотих частках секунди

::tiemeit.cmd
@echo off
Setlocal EnableDelayedExpansion

call :clock 

::call your_command  or more > null to pipe this batch after your_command

call :clock

echo %timed%
pause
goto:eof

:clock
if not defined timed set timed=0
for /F "tokens=1-4 delims=:.," %%a in ("%time%") do ( 
set /A timed = "(((1%%a - 100) * 60 + (1%%b - 100)) * 60 + (1%%c - 100))  * 100 + (1%%d - 100)- %timed%"
)
goto:eof

0

TIMER "Lean and Mean" з регіональним форматом, цілодобова та змішана підтримка введення
адаптації Aacini тіла методу заміни , без ІФ, лише один ЗА (моє регіональне виправлення)

1: Файл timer.bat розміщений десь у% PATH% або поточному dir

@echo off & rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!"     & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof

Використання:
таймер & ехо start_cmds & timeout / t 3 & echo end_cmds & timer
timer & timer "23: 23: 23,00"
таймер "23: 23: 23,00" & таймер
таймера "13.23.23,00" & таймер "03: 03: 03.00"
таймер і таймер "0: 00: 00.00" немає & cmd / v: on / c відлуння до півночі =! Timer_end!
Введення даних тепер може бути змішаним, для тих малоймовірних, але можливих змін формату часу під час виконання

2: Функція : таймер у комплекті з пакетним сценарієм (використання зразка нижче):

@echo off
set "TIMER=call :timer" & rem short macro
echo.
echo EXAMPLE:
call :timer
timeout /t 3 >nul & rem Any process here..
call :timer
echo.
echo SHORT MACRO:
%TIMER% & timeout /t 1 & %TIMER% 
echo.
echo TEST INPUT:
set "start=22:04:04.58"
set "end=04.22.44,22"
echo %start% ~ start & echo %end% ~ end
call :timer "%start%"
call :timer "%end%"
echo.
%TIMER% & %TIMER% "00:00:00.00" no 
echo UNTIL MIDNIGHT: %timer_end%
echo.
pause 
exit /b

:: щоб протестувати його, скопіюйте вставити як над, так і під кодові секції

rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support 
:timer Usage " call :timer [input - optional] [no - optional]" :i Result printed on second call, saved to timer_end 
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!"     & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof

CE, DE і CS, DS - це кінець товстої кишки, набір точок і товстої кишки, набір точок - використовується для підтримки змішаного формату


0

Наступний сценарій імітує * nix epoch time, але він локальний та регіональний. Він повинен обробляти краєвидні календарі, включаючи високосні роки. Якщо Cygwin доступний, значення епохи можна порівняти, вказавши Cygwin .

Я в EST, і різниця, що повідомляється, становить 4 години, що є відносно правильним. Є кілька цікавих рішень для усунення залежностей від ТЗ та регіональних залежностей, але нічого тривіального, що я помітив.

@ECHO off
SETLOCAL EnableDelayedExpansion

::
::  Emulates local epoch seconds
::

:: Call passing local date and time
CALL :SECONDS "%DATE%" "%TIME%"
IF !SECONDS! LEQ 0 GOTO END

:: Not testing - print and exit
IF NOT "%~1"=="cygwin" (
    ECHO !SECONDS!
    GOTO END
)

:: Call on Cygwin to get epoch time
FOR /F %%c IN ('C:\cygwin\bin\date +%%s') DO SET EPOCH=%%c

:: Show the results
ECHO Local Seconds: !SECONDS!
ECHO Epoch Seconds: !EPOCH!

:: Calculate difference between script and Cygwin
SET /A HOURS=(!EPOCH!-!SECONDS!)/3600
SET /A FRAC=(!EPOCH!-!SECONDS!)%%3600

:: Delta hours shown reflect TZ
ECHO Delta Hours: !HOURS! Remainder: !FRAC!

GOTO END

:SECONDS
SETLOCAL  EnableDelayedExpansion

    :: Expecting values from caller
    SET DATE=%~1
    SET TIME=%~2

    :: Emulate Unix epoch time without considering TZ
    SET "SINCE_YEAR=1970"

    :: Regional constraint! Expecting date and time in the following formats:
    ::   Sun 03/08/2015   Day MM/DD/YYYY
    ::   20:04:53.64         HH:MM:SS
    SET VALID_DATE=0
    ECHO !DATE! | FINDSTR /R /C:"^... [0-9 ][0-9]/[0-9 ][0-9]/[0-9][0-9][0-9][0-9]" > nul && SET VALID_DATE=1
    SET VALID_TIME=0
    ECHO !TIME! | FINDSTR /R /C:"^[0-9 ][0-9]:[0-9 ][0-9]:[0-9 ][0-9]" > nul && SET VALID_TIME=1
    IF NOT "!VALID_DATE!!VALID_TIME!"=="11" (
        IF !VALID_DATE! EQU 0  ECHO Unsupported Date value: !DATE! 1>&2
        IF !VALID_TIME! EQU 0  ECHO Unsupported Time value: !TIME! 1>&2
        SET SECONDS=0
        GOTO SECONDS_END
    )

    :: Parse values
    SET "YYYY=!DATE:~10,4!"
    SET "MM=!DATE:~4,2!"
    SET "DD=!DATE:~7,2!"
    SET "HH=!TIME:~0,2!"
    SET "NN=!TIME:~3,2!"
    SET "SS=!TIME:~6,2!"
    SET /A YEARS=!YYYY!-!SINCE_YEAR!
    SET /A DAYS=!YEARS!*365

    :: Bump year if after February  - want leading zeroes for this test
    IF "!MM!!DD!" GEQ "0301" SET /A YEARS+=1

    :: Remove leading zeros that can cause octet probs for SET /A
    FOR %%r IN (MM,DD,HH,NN,SS) DO (
        SET "v=%%r"
        SET "t=!%%r!"
        SET /A N=!t:~0,1!0
        IF 0 EQU !N! SET "!v!=!t:~1!"
    )

    :: Increase days according to number of leap years
    SET /A DAYS+=(!YEARS!+3)/4-(!SINCE_YEAR!%%4+3)/4

    :: Increase days by preceding months of current year
    FOR %%n IN (31:1,28:2,31:3,30:4,31:5,30:6,31:7,31:8,30:9,31:10,30:11) DO (
        SET "n=%%n"
        IF !MM! GTR !n:~3! SET /A DAYS+=!n:~0,2!
    )

    :: Multiply and add it all together
    SET /A SECONDS=(!DAYS!+!DD!-1)*86400+!HH!*3600+!NN!*60+!SS!

:SECONDS_END
ENDLOCAL & SET "SECONDS=%SECONDS%"
GOTO :EOF

:END
ENDLOCAL

Цікаво про нивото. Дякую.
bvj

0

Розчин з використанням чистого PHP для cmd та однієї env. змінна:

@echo off
setlocal enableextensions

REM set start time env var
FOR /F "tokens=* USEBACKQ" %%F IN (`php -r "echo microtime(true);"`) DO ( SET start_time=%%F )

## PUT_HERE_THE_COMMAND_TO_RUN ##

REM echo elapsed time
php -r "echo 'elapsed: ' . (round(microtime(true) - trim(getenv('start_time')), 2)) . ' seconds' . mb_convert_encoding('&#13;&#10;', 'UTF-8', 'HTML-ENTITIES');"
  • немає необхідності в цигвіні чи невірених утилітах. Корисно, коли PHP доступний на місцях

  • точність та вихідний формат можна легко налаштувати

  • та ж ідея може бути передана для PowerShell

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.