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

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

29 ответов


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


кроме того, 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

если вы хотите

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

попробуйте скопировать этот скрипт в новый пакетный файл (например,timecmd.летучая мышь!--16-->):

@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 часов или более.


Хе-Хе, самым простым решением может быть следующее:

echo %time%
YourApp.exe
echo %time%

это работает на всех Windows из коробки.


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

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

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


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

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

пока mycommand не требует кавычек (которые винтами с обработкой кавычек cmd). The /v:on позволяет независимо оценивать два разных значения времени, а не один раз при выполнении команды.


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

prompt $d $t $_$P$G

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

23.03.2009 15:45:50,77

C:\>

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

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

myCommand.exe

(рядом пустой line)

myCommand2.exe

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

MyBatchFile.bat > output.txt

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

abe@abe-PC:~$ time sleep 5

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

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


не так элегантно, как некоторые функции в 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:

Я использую бесплатное ПО под названием "GS Timer".

просто сделайте пакетный файл следующим образом:

timer
yourapp.exe
timer /s

Если вам нужен набор времен, то как раз труба выход таймера /с в А.txt-файл.

вы можете получить его здесь: бесплатные утилиты DOS Gammadyne


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


Я использую 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

покуда оно не продолжает более длиной чем 24hours...

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

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

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


это ОДН-вкладыш который избегает отложенная экспансия, что может нарушить определенные команды:

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 by $D, $T и %TIME% by %DATE%, %TIME% включить дату.

использовать это внутри пакетным файлом заменить %Z by %%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 в результате, и не включает в себя (ы).


здесь

версия таймера 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

^ - на основе 'Daniel Sparks' Версия


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


этой Это комментарий / редактирование к люку Сэмпсону nice 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% миллисекунды работают на моей системе после добавления этого ','

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


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

следующий скрипт использует только " cmd.exe " и выводит количество миллисекунд с момента создания конвейера до момента выхода процесса, предшествующего сценарию. т. е. введите свою команду и передайте ее скрипту. Пример: "timeout 3 / runtime.cmd " должен дать что-то вроде "2990."Если вам нужны как выходные данные среды выполнения, так и выходные данные stdin, перенаправьте stdin перед pipe - ex: "dir /s 1>temp.тхт | во время выполнения.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

ответ 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 часов.


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


использование sub для возврата времени в сотых долях секунды

::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

таймер"Lean and Mean" с региональным форматом, 24h и поддержкой смешанного ввода
Адаптация Aacini это тело метода замены, нет если, только один для (моего регионального исправления)

1: файл таймер.летучая мышь!--5--> помещено где-то в %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

использование:
таймер & echo start_cmds & timeout /t 3 & echo end_cmds& таймер
таймер & таймер "23:23:23,00"
таймер "23:23:23,00" & таймер
таймер "13.23.23,00" & таймер "03:03:03.00"
таймер & таймер "0:00:00.00" нет & cmd/v: on / c echo до полуночи=!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 стоят для конца двоеточия, конца точки и набора двоеточия, набора точки-используется для поддержки смешанного формата


  1. в каталоге, где находится ваша программа, введите notepad mytimer.bat нажмите кнопку "Да", чтобы создать новый файл.

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

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


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


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

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


следующий скрипт эмулирует *Nix epoch time, но он является локальным и региональным. Он должен обрабатывать случаи края календаря, включая високосные годы. Если 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

вот мой метод, нет преобразования и нет ms. Полезно определить длительность кодирования (ограниченную 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

альтернативой измерению времени является просто "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