Как измерить время выполнения команды в командной строке Windows?

Существует ли встроенный способ измерения времени выполнения команды в командной строке Windows?

вопрос задан 23.03.2009
Kuroki Kaze
3488 репутация

29 ответов


  • 384 рейтинг

    В качестве альтернативы, в Windows PowerShell есть встроенная команда, аналогичная команде Bash «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
    
    ответ дан Casey.K, с репутацией 3865, 26.01.2011
  • 239 рейтинг

    Если хочешь

    1. Чтобы измерить время выполнения с точностью до сотой секунды в (чч: мм: сс. формат ff)
    2. Чтобы не приходилось скачивать и устанавливать пакет ресурсов
    3. Чтобы выглядеть как огромный ботаник DOS (кто не)

    Попробуйте скопировать следующий скрипт в новый пакетный файл (например, г. timecmd. летучая мышь ):

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

    E. г.

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

    Если вы хотите сделать перенаправление вывода, вы можете заключить команду в кавычки следующим образом:

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

    Это должно обрабатывать команды, которые выполняются до - после полуночи, но вывод будет неправильным, если ваша команда выполняется в течение 24 часов или более.

    ответ дан Luke Sampson, с репутацией 6496, 2.06.2011
  • 190 рейтинг

    Хе-хе, самое простое решение может быть таким:

    echo %time%
    YourApp.exe
    echo %time%
    

    Это работает на каждой Windows из коробки.


    В случае приложения, использующего вывод консоли, может быть удобно сохранить время запуска во временной переменной:

    set startTime=%time%
    YourApp.exe
    echo Start Time: %startTime%
    echo Finish Time: %time%
    
    ответ дан TechGibbon, с репутацией 2025, 10.03.2010
  • 103 рейтинг

    Если вы используете 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 Resource Kit. Загрузить здесь .

    ответ дан does_not_exist, с репутацией , 15.04.2009
  • 68 рейтинг

    Просто небольшое расширение ответ от Кейси. 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.

    ответ дан vladimir veljkovic, с репутацией 829, 30.08.2015
  • 50 рейтинг

    Однострочник, который я использую в Windows Server 2008 R2:

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

    До тех пор, пока mycommand не требует кавычек (какие винты с обработкой кавычек cmd). /v:on предназначен для того, чтобы два разных значения ВРЕМЕНИ оценивались независимо, а не один раз при выполнении команды.

    ответ дан Nathan Herring, с репутацией 788, 23.06.2010
  • 41 рейтинг

    Если у вас открыто окно командной строки и вы вызываете команды вручную, вы можете отображать временную метку в каждом приглашении, e. г.

    prompt $d $t $_$P$G
    

    Это дает вам что-то вроде:

    23.03.2009 15:45:50,77

    C:\>

    Если у вас есть небольшой пакетный скрипт, который выполняет ваши команды, перед каждой командой ставьте пустую строку, e. г.

    (пустая строка)

    myCommand. exe

    (следующая пустая строка)

    myCommand2. exe

    Время выполнения каждой команды можно рассчитать по информации о времени в приглашении. Вероятно, лучше всего передать данные в текстовый файл для дальнейшего анализа:

    MyBatchFile.bat > output.txt
    
    ответ дан Treb, с репутацией 16707, 23.03.2009
  • 24 рейтинг

    Так как другие рекомендуют устанавливать такие вещи, как бесплатные программы и PowerShell, вы также можете установить Cygwin , что даст вам доступ ко многим основным командам Unix, таким как время :

    abe@abe-PC:~$ time sleep 5
    
    real    0m5.012s
    user    0m0.000s
    sys 0m0.000s
    

    Не уверен, сколько накладных расходов добавляет Cygwin.

    ответ дан Abe Voelker, с репутацией 17601, 2.06.2011
  • 21 рейтинг

    Не так элегантно, как некоторые функции в 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:
    
    ответ дан JohnW, с репутацией 2424, 23.03.2009
  • 16 рейтинг

    Я использую бесплатное программное обеспечение под названием «GS Timer».

    Просто создайте командный файл так:

    timer
    yourapp.exe
    timer /s
    

    Если вам нужно установить время, просто перенаправьте вывод timer / s в a. текстовый файл.

    Вы можете получить его здесь: Gammadyne's Free DOS Utilities


    Разрешение 0. 1 секунда

    ответ дан pepoluan, с репутацией 2937, 3.08.2009
  • 11 рейтинг

    Я использую Windows XP и по некоторым причинам время. Exe не работает для меня. Я нашел другую альтернативу - PTIME. Это работает очень хорошо.

    http: // www. ПК-инструменты. net / win32 / ptime /

    Пример -

    C:\> ptime
    
    ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
    Copyright(C) 2002, Jem Berkes 
    
    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 
    
    ===  cd ===
    C:\
    
    Execution time: 0.015 s
    
    ответ дан Murali Krishnan, с репутацией 127, 6.03.2012
  • 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.
    
    ответ дан driblio, с репутацией 109, 10.03.2011
  • 8 рейтинг

    Там также TimeMem (март 2012):

    Это утилита Windows, которая выполняет программу и отображает ее время выполнения, использование памяти и статистика ввода-вывода. Это похоже на функциональность для утилиты времени Unix.

    ответ дан Martin Moene, с репутацией 648, 21.01.2013
  • 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.

    ответ дан aschipfl, с репутацией 17441, 2.09.2015
  • 3 рейтинг

    Вот это

    Версия таймера постфикса:

    Пример использования:

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

    Execution took  ~969 milliseconds.
    

    Copy & amp; вставьте его в какой-нибудь редактор, например Notepad ++ , и сохраните его как 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: ^ ^| %~nx0
        echo.
        echo Wait for pipe getting ready... :)
        echo  (Press Ctrl+Z ^ to Cancel)
    goto :eof
    

    ^ - Основано на «Даниэль Спаркс» Версия

    ответ дан Nadu, с репутацией 1243, 20.12.2015
  • 2 рейтинг

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

    ответ дан Jeff Pratt, с репутацией 675, 23.05.2011
  • 2 рейтинг

    Этот является комментарием / редактированием к хорошему timecmd.bat Люка Сэмпсона и ответом на

    .

    По какой-то причине это дает мне вывод только в целых секундах. , , что для меня бесполезно. Я имею в виду, что я запускаю timecmd pause, и это всегда приводит к 1. 00 сек, 2. 00 сек, 4. 00 сек , , даже 0. 00 сек! Windows 7. - Камило Мартин, 25 сентября '13 в 16:00 "

    В некоторых конфигурациях разделители могут отличаться. Следующее изменение должно охватывать как минимум большинство западных стран.

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

    %time% миллисекунды работают в моей системе после добавления этого ','

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

    ответ дан Anonymous Coward, с репутацией 21, 20.02.2014
  • 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
    

    , если вы хотите, чтобы время работы в ЧЧ: мм: сс. 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%, чтобы отобразить его.

    ответ дан robotik, с репутацией 848, 1.08.2018
  • 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.
    
    ответ дан MikeM, с репутацией 8468, 31.07.2012
  • 1 рейтинг

    Следующий скрипт использует только «cmd. exe "и выводит количество миллисекунд с момента создания конвейера до момента завершения процесса, предшествующего сценарию. я. е. Введите свою команду и направьте ее к сценарию. Пример: тайм-аут 3 | время выполнения. CMD "должен дать что-то вроде" 2990. "Если вам нужны и выходные данные времени выполнения, и выходные данные stdin, перенаправьте stdin перед конвейером - например:" dir / s 1 & gt; temp. TXT | во время выполнения. 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
    
    ответ дан Daniel Sparks, с репутацией 67, 6.11.2013
  • 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 часа.

    ответ дан Alexander, с репутацией 303, 20.11.2015
  • 0 рейтинг

    ТАЙМЕР «Lean and Mean» с региональным форматом, 24-часовой и смешанной поддержкой ввода
    Адаптация тела метода замены Aacini , без IF, только одно FOR (мое региональное исправление)

    1: Файл , таймер. bat находится где-то в% PATH% или текущем каталоге

    @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
    

    Использование:
    таймер & amp; echo start_cmds & amp; тайм-аут / т 3 & amp; echo end_cmds & amp; таймер
    таймер & amp; таймер "23: 23: 23,00"
    таймер "23: 23: 23,00" & amp; таймер
    таймер "13. 23. 23,00 "и таймер " 03:03:03. 00 "
    таймер & amp; таймер "0:00:00. 00 "нет & cmd / v: вкл / с эхо до полуночи =! 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 означают конец двоеточия, конец точки и набор двоеточий, набор точек - используется для поддержки смешанного формата

    ответ дан AveYo, с репутацией 21, 16.05.2017
  • 0 рейтинг

    Следующий скрипт эмулирует время эпохи * nix, но он локальный и региональный. Он должен обрабатывать крайний случай, включая високосные годы. Если доступно Cygwin , значения эпох можно сравнить, указав параметр Cygwin .

    Я нахожусь в EST, и сообщаемая разница составляет 4 часа, что является относительно правильным. Есть несколько интересных решений по удалению TZ и региональных зависимостей, но я не заметил ничего тривиального.

    @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, с репутацией 2163, 9.03.2015
  • 0 рейтинг

    Вот мой метод, без преобразования и без мс. Полезно определить длительность кодирования (хотя и ограниченную 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
    
    ответ дан ilko, с репутацией 9, 20.02.2016
  • 0 рейтинг

    Process Explorer будет показывать время ядра, время пользователя и время стены (и много других вещей), пока вы нажимаете на процесс до его завершения. Это не инструмент командной строки, но в любом случае он очень полезен.

    ответ дан Matt Chambers, с репутацией 1146, 27.10.2011
  • 0 рейтинг
    1. В каталоге, где находится ваша программа, введите notepad mytimer.bat, нажмите «Да», чтобы создать новый файл.

    2. Вставьте приведенный ниже код, заменив YourApp.exe на вашу программу, затем сохраните.

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

    ответ дан does_not_exist, с репутацией , 16.07.2009
  • 0 рейтинг

    Для хорошего сценария Люка Сэмпсона исправления для отрицательных значений должны быть сделаны в обратном порядке, так как они могут сделать ранее 0 значение отрицательным.

    Возьмем, к примеру, время, когда начальное вычитание дало 1 час 0 минут. и -29 секунд. Как и в посте, результат будет 1 час, -1 минута и 31 секунда. Если секунды корректируются до минут и минут до часов, вместо этого вы получаете 31 секунду, 59 минут, 0 часов.

    ответ дан Garr Lystad, с репутацией 13, 1.07.2014
  • 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
    
    ответ дан Antoni Gual Via, с репутацией 390, 9.05.2016
  • -1 рейтинг

    Альтернативой времени измерения является просто «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
    
    ответ дан Rainer, с репутацией 169, 21.09.2018