Windows批处理文件中的计时器

JVI*_*DIN 16 windows time cmd timer batch-file

有人能指出我在Windows批处理文件中添加计时器的方法吗?我需要跟踪批次从开始运行的时间.

mou*_*sio 15

重构代码以计算经过的时间:

  • 计算中的代码较少,
  • 提供的填充时间小于.1秒,
  • 使用标签允许多次调用,并对计时器代码进行分组.

可重复使用的代码:

:StartTimer
:: Store start time
set StartTIME=%TIME%
for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo %StartTIME: =0%`) do set /a Start100S=1%%f*360000+1%%g*6000+1%%h*100+1%%i-36610100
goto :EOF

:StopTimer
:: Get the end time
set StopTIME=%TIME%
for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo %StopTIME: =0%`) do set /a Stop100S=1%%f*360000+1%%g*6000+1%%h*100+1%%i-36610100
:: Test midnight rollover. If so, add 1 day=8640000 1/100ths secs
if %Stop100S% LSS %Start100S% set /a Stop100S+=8640000
set /a TookTime=%Stop100S%-%Start100S%
set TookTimePadded=0%TookTime%
goto :EOF

:DisplayTimerResult
:: Show timer start/stop/delta
echo Started: %StartTime%
echo Stopped: %StopTime%
echo Elapsed: %TookTime:~0,-2%.%TookTimePadded:~-2% seconds
goto :EOF
Run Code Online (Sandbox Code Playgroud)

来电代码:

call :StartTimer
:: 
:: Add your script functionality here
::
call :StopTimer
call :DisplayTimerResult
pause

call :StartTimer
:: 
:: Add more script functionality here
::
call :StopTimer
call :DisplayTimerResult
goto :EOF
Run Code Online (Sandbox Code Playgroud)

注意"1" - 前缀以避免零填充值的解释错误为八进制值(08和09),并使用适当的常量进行校正.由于理解核心计算可能会令人困惑,因此单行for语句的替代方法如下:

for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo.%StartTIME%`) do set TempTIME=%%f %%g %%h %%i
for /f "usebackq tokens=1-4" %%f in (`echo %TempTIME: 0= %`) do set /a Start100S=%%f*360000+%%g*6000+%%h*100+%%i
Run Code Online (Sandbox Code Playgroud)


mig*_*var 6

简约版本,以秒为单位的经过时间.

@set /A _tic=%time:~0,2%*3600^
            +%time:~3,1%*10*60^
            +%time:~4,1%*60^
            +%time:~6,1%*10^
            +%time:~7,1% >nul

:: actual script

@set /A _toc=%time:~0,2%*3600^
            +%time:~3,1%*10*60^
            +%time:~4,1%*60^
            +%time:~6,1%*10^
            +%time:~7,1% >nul

@set /A _elapsed=%_toc%-%_tic
@echo %_elapsed% seconds.
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@migonzalvar,这正是我所需要的。出于好奇,您不能一次检索分钟和秒的两位数字,因为前导 0 会导致数字被解释为八进制。它可以工作数小时,因为有一个前导空格,而不是 0。而且您确实需要在“>nul”之前的空格,因为(例如)“2>nul”表示重定向 stderr。(哦,那些尾随的 ^ 符号会转义换行符。) (2认同)

MrE*_*yes 3

据我所知,没有可以在批处理文件中使用的明确的“计时器”命令 - 但是有一个相当简单的解决方案。在批处理文件的顶部记录当前时间(开始时间),在批处理文件的末尾记录当前时间(结束时间),然后比较两者。像这样的事情应该可以做到(它看起来确实过于复杂,但它可以处理大多数时间的怪癖):

:: Store start time
set StartTIME=%TIME%
set H=%StartTIME:~0,2%
if "%H:~0,1%"==" " set H=%H:~1,1%
if "%H:~0,1%"=="0" set H=%H:~1,1%
set M=%StartTIME:~3,2%
if "%M:~0,1%"=="0" set M=%M:~1,1%
set S=%StartTIME:~6,2%
if "%S:~0,1%"=="0" set S=%S:~1,1%
set U=%StartTIME:~9,2%
if "%U:~0,1%"=="0" set U=%U:~1,1%
)
set /a Start100S=%H%*360000+%M%*6000+%S%*100+%U%

:: 
:: Add your script functionality here
::

:: Get the end time
set StopTIME=%TIME%
set H=%StopTIME:~0,2%
if "%H:~0,1%"==" " set H=%H:~1,1%
if "%H:~0,1%"=="0" set H=%H:~1,1%
set M=%StopTIME:~3,2%
if "%M:~0,1%"=="0" set M=%M:~1,1%
set S=%StopTIME:~6,2%
if "%S:~0,1%"=="0" set S=%S:~1,1%
set U=%StopTIME:~9,2%
if "%U:~0,1%"=="0" set U=%U:~1,1%
)

set /a Stop100S=%H%*360000+%M%*6000+%S%*100+%U%

:: Test midnight rollover. If so, add 1 day=8640000 1/100ths secs
if %Stop100S% LSS %Start100S% set /a Stop100S+=8640000
set /a TookTime=%Stop100S%-%Start100S%

echo Started: %StartTime%
echo Stopped: %StopTime%
echo Elapsed: %TookTime:~0,-2%.%TookTime:~-2% seconds
Run Code Online (Sandbox Code Playgroud)

或者 #1:Windows Server 2k3 资源工具包包括 timeit.exe。您可以使用它来显示脚本的各种性能统计数据。

或者#2:您可以比上面发布的脚本简单得多,然后执行以下操作:

echo %time% 
::
:: Your script functionality
::
echo %time%
Run Code Online (Sandbox Code Playgroud)

然而,这不会给你以秒为单位的执行时间。