如何在Windows命令行上测量命令的执行时间?

这可以用标准手段来完成吗?

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 

您可以在Windows 2003 Resource Kit中获得TimeIt。 在这里下载。

或者,Windows PowerShell具有与Bash的“时间”命令类似的内置命令。 它被称为“测量命令”。 你必须确保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. 要以(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小时或更长时间,输出将是错误的。

呵呵,最简单的解决办法可能是这样的:

 echo %time% YourApp.exe echo %time% 

这可以在每个开箱即用的Windows上运行。


在使用控制台输出的应用程序的情况下,将开始时间存储在临时变量中可能是方便的:

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

我在Windows Server 2008 R2中使用的单线程是:

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

只要我的命令不需要引号(与cmd的报价处理螺丝钉)。 /v:on是为了允许两个不同的TIME值独立计算,而不是一次执行命令。

只是从Casey.K有关使用PowerShell中的Measure-Command 的答案稍微扩展一下:

  1. 您可以从标准命令提示符调用PowerShell,如下所示:

     powershell -Command "Measure-Command {echo hi}" 
  2. 这将会吃掉标准输出,但是可以通过添加| Out-Default来防止 | Out-Default在PowerShell中是这样的:

     Measure-Command {echo hi | Out-Default} 

    或从命令提示符处:

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

当然,你可以自由地把它包装在脚本文件*.ps1*.bat

如果打开命令窗口并手动调用命令,则可以在每个提示符上显示一个时间戳,例如

 prompt $d $t $_$P$G 

它给你类似于:

23.03.2009 15:45:50,77

C:\>

如果你有一个执行你的命令的小批量脚本,在每个命令之前有一个空行,例如

(空行)

myCommand.exe

(下一个空行)

myCommand2.exe

您可以通过提示中的时间信息来计算每个命令的执行时间。 最好的办法可能是将输出传递给一个文本文件作进一步的分析:

 MyBatchFile.bat > output.txt 

由于其他人正在推荐安装诸如免费软件和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 yourapp.exe timer /s 

如果您需要一组时间,请将计时器的输出传送到.txt文件中。

你可以在这里得到它: Gammadyne的免费DOS公用事业


分辨率是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 

只要持续时间不超过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. 

还有TimeMem (2012年3月):

这是一个Windows实用程序,它执行程序并显示其执行时间,内存使用情况和IO统计信息。 它在功能上与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替换$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命令。

如果有人来这里寻找这个问题的答案,有一个叫做GetProcessTimes()的Windows API函数。 编写一个可以启动命令的小C程序并不需要太多的工作,进行这个调用并返回处理时间。

是对Luke Sampson的nice timecmd.bat和回复的评论/编辑

由于某些原因,这只能给我输出整个秒…这对我来说是无用的。 我的意思是我运行timecmd暂停,它总是在1.00秒,2.00秒,4.00秒…甚至0.00秒的结果! Windows 7. – 卡米洛马丁13年9月25日在16:00“

在一些配置上,分隔符可能不同。 以下变化应该覆盖至少大部分西方国家。

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

在添加','后,我的系统上的%time%毫秒工作,

(*因为网站不允许匿名评论,即使我总是使用与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 /as=%end_s%-%start_s% set /a hs=%end_hs%-%start_hs% if %hs% lss 0 ( set /as=%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:“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 /at=%%j-%%i echo !t! ) popd exit /b goto :eof :calc set /at=(%1*(3600*1000))+(%2*(60*1000))+(%3*1000)+(%4) echo !t! goto :eof endlocal 

流失的答案可以缩短一点(尽管不太可读)

 @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小时内完成。

  1. 在你的程序所在的目录下,输入notepad mytimer.bat ,点击'yes'创建一个新文件。

  2. 粘贴下面的代码,用您的程序替换YourApp.exe ,然后保存。

     @echo off date /t time /t YourApp.exe date /t time /t 
  3. 在命令行中键入mytimer.bat ,然后按Enter键。

只要您在进程退出之前点击进程,Process Explorer将显示内核时间,用户时间和内存时间(以及许多其他内容)。 这不是一个命令行工具,但它无论如何是非常有用的。

以下脚本模拟* nix时代,但它是本地和区域的。 它应该处理包括闰年在内的压光边缘情况。 如果Cygwin可用,则可以通过指定Cygwin选项来比较时期值。

我在东部时间,报告的差异是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 /AN=!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 

这是一个

后缀定时器版本:

用法示例:

暂停1 | TimeIt.cmd

 Execution took ~969 milliseconds. 

复制并粘贴到一些编辑器中,例如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: ^<Command^> ^| %~nx0 echo. echo Wait for pipe getting ready... :) echo (Press Ctrl+Z ^<Enter^> to Cancel) goto :eof 

^ – 基于“丹尼尔火花”版本

使用一个子百分之一秒返回时间

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

“精益和平均”的定时器与区域格式,24小时和混合输入的支持
适应Aacini的替代方法主体,没有IF,只有一个FOR(我的区域修复)

1:将文件timer.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 

用法:
定时器 &回声start_cmds&超时/吨3&回声end_cmds& 定时器
定时器计时器 “23:23:23,00”
定时器 “23:23:23,00”和计时器
定时器 “13.23.23,00”和计时器 “03:03:03.00”
定时器计时器 “0:00:00.00”no&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代表冒号结尾,点结束和冒号集,点集 – 用于混合格式支持

对于卢克·桑普森(Luke Sampson)的漂亮脚本,负值的修正应该以相反的顺序完成,因为他们可以使之前的0值变为负值。

例如一次是最初的减法给1小时,0分钟。 和-29秒。 如后所述,结果将是1小时,-1分钟和31秒。 如果秒数在几分钟之前和几分钟之前得到纠正,您将得到31秒,59分钟,0小时。

这是我的方法,没有转换,没有ms。 It is useful to determine encoding durations (limited to 24 hours though):

 @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