This script by bluesxman on the forum can be used to accurately measure the time elapsed by some other process or script. To use it start the timer with CALL timer.cmd start, then run the other process and then CALL timer.cmd stop when finished.
@echo off setlocal :: Last update 2019-06-27 :: Updated to handle Indonesian locale set time=%~2 set time=%time: =0% set stamp.file=%temp%\%~n0.stamp :: Call a subroutine to either Start, Stop or Lap the timer. if /i "%~1" EQU "start" call :make.stamp if /i "%~1" EQU "stop" call :read.stamp stop if /i "%~1" EQU "lap" call :read.stamp lap if "%~1" EQU "" call :status endlocal goto :EOF :status :: If no parameters are passed display the status, either the timer is running or not. :: raises an errorlevel if not running. if exist "%stamp.file%" ( if /i "%~1" NEQ "/q" echo:Timer is active. exit /b 0 ) echo:Timer is not active. exit /b 1 :make.stamp :: Start the timer :: Create the stamp.file and write the current time to it. if exist "%stamp.file%" call :read.stamp stop set start.time=%time% (echo:%start.time%) > "%stamp.file%" echo:Timer started %start.time% goto :EOF :read.stamp :: Read the timer :: retrieve the start time from the stamp.file and compare with current time. call :status /q if errorlevel 1 goto :EOF set stop.time=%time% set /p start.time=< "%stamp.file%" echo:Timer started %start.time% echo:Timer %1ped %stop.time% if %1 EQU stop del "%stamp.file%" call :calc.time.code "%start.time%" set start.time.code=%errorlevel% call :calc.time.code %stop.time% set stop.time.code=%errorlevel% set /a diff.time.code=stop.time.code - start.time.code if %diff.time.code% LSS 0 set /a diff.time.code+=(24 * 60 * 60 * 100) setlocal set /a hs=diff.time.code %% 100 set /a diff.time.code/=100 set /a ss=diff.time.code %% 60 set /a diff.time.code/=60 set /a mm=diff.time.code %% 60 set /a diff.time.code/=60 set /a hh=diff.time.code set hh=0%hh% set mm=0%mm% set ss=0%ss% set hs=0%hs% endlocal & set diff.time=%hh:~-2%:%mm:~-2%:%ss:~-2%.%hs:~-2% echo %diff.time.code% hundredths of a second echo %diff.time% goto :EOF :calc.time.code :: Accept a formatted string containing the time. :: Extract the numeric parts for hour, minute,second, millisecond and combine :: into one numeric variable time.code :: The delims are to account for different regional time settings. if not defined t_delims for /f "tokens=1,2,3,4,5 delims=0123456789" %%v in ("%~1") do set "t_delims=%%v%%w%%x%%y%%z" setlocal for /f "tokens=1,2,3,4 delims=%t_delims% " %%a in ("%~1") do ( set hh=%%a set mm=%%b set ss=%%c set hs=%%d ) set /a hh=((%hh:~0,1% * 10) + %hh:~1,1%) * 60 * 60 * 100 set /a mm=((%mm:~0,1% * 10) + %mm:~1,1%) * 60 * 100 set /a ss=((%ss:~0,1% * 10) + %ss:~1,1%) * 100 set /a hs=((%hs:~0,1% * 10) + %hs:~1,1%) set /a time.code=hh + mm + ss + hs endlocal & exit /b %time.code%
When measuring short time periods run the timer several times and take an average, this will smooth out the effect of any background processes and hard drive variations.
“You go away for a long time and return a different person ~ you never come all the way back” ~ Paul Theroux
Related:
StrLen - Calculate the length of a string.
tdiff.cmd - Time difference in Hours/Minutes.
Chronometer/Timer app - SS64 Forum.
Equivalent PowerShell cmdlet: Measure-Command