誰かがWindowsバッチファイルにタイマーを追加する方法を教えてもらえますか?バッチが最初から実行される時間を追跡する必要があります。
経過時間を計算するためにコードをリファクタリングしました。
再利用可能なコード:
: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
呼び出しコード:
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
ゼロが埋め込まれた値の8進値(08および09)としての解釈エラーを回避するための「1」プレフィックス、および適切な定数による修正に注意してください。これはコア計算を理解するのを混乱させる可能性があるため、1行の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
経過時間が秒単位のミニマルバージョン。
@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.
私の知る限り、バッチファイルで使用できる明示的な「timer」コマンドはありませんが、かなり単純な解決策があります。バッチファイルの先頭に現在の時刻(開始時刻)を記録し、バッチファイルの最後に現在の時刻(終了時刻)を記録してから、2つを比較します。このような何かがそれを行う必要があります(それは過度に複雑に見えますが、ほとんどの時間の癖を処理します):
:: 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
または、#1:Windows Server2k3リソースキットにはtimeit.exeが含まれています。これを使用して、スクリプトのさまざまなパフォーマンス統計を表示できます。
または、#2:上記のスクリプトよりもはるかに簡単に実行できます。
echo %time%
::
:: Your script functionality
::
echo %time%
ただし、これでは実行時間が秒単位で表示されるわけではありません。
このタイマーはかなり正確で、5からカウントダウンします。ただし、これをコードに追加する方法はわかりません。注:これは非常に基本的なバッチタイマーであり、他の答えの方がおそらく優れていますが、これは単純なコードで独自のバッチタイマーを設計するための簡単な方法です。
_@echo off
cls
set /a time=5
:hi
cls
echo Time:%time%
ping localhost -n 2 >nul
set /a time=%time%-1
if %time%==0 (
goto timeup
)else goto :hi
:timeup
cls
echo Time is up!
pause
_
また、このタイマーの開始時刻を変更するには、_set /a time=5
_をset /a time=(whatever time you want to start at)
に変更するだけです。
プログラムを次のように構成します。
@echo off
setlocal enabledelyedexpansion
set T[1]=%time%
::
:: Your program goes here...
::
set T[2]=%time%
call TIMER
TIMER.BATプログラムのコードは次のとおりです。パスのどこかに別のファイルとして保存します。
for /l %%t in (1,1,2) do for /f "tokens=1-4 delims=:." %%a in ("!T[%%t]!") do (
set "T[%%t]=!T[%%t]: =0!"
set "h[%%t]=%%a" & if "!h[%%t]:~0,1!"=="0" set "h[%%t]=!h[%%t]:~1!"
set "m[%%t]=%%b" & if "!m[%%t]:~0,1!"=="0" set "m[%%t]=!m[%%t]:~1!"
set "s[%%t]=%%c" & if "!s[%%t]:~0,1!"=="0" set "s[%%t]=!s[%%t]:~1!"
set "c[%%t]=%%d" & if "!c[%%t]:~0,1!"=="0" set "c[%%t]=!c[%%t]:~1!"
set /a T[%%t]=!h[%%t]!*360000+!m[%%t]!*6000+!s[%%t]!*100+!c[%%t]!
)
set /a c=!T[2]!-!T[1]!
set /a h=!c!/360000 & set /a c%%=360000 & if !h! lss 10 set "h= !h!"
set /a m=!c!/6000 & set /a c%%=6000 & if !m! lss 10 set "m=0!m!"
set /a s=!c!/100 & set /a c%%=100 & if !s! lss 10 set "s=0!s!"
echo !h!:!m!:!s!.!c!
これを試すことができます(短い..)
@echo off
:loop
set TA=%time% & echo %time%--A
echo Put Your Code Here...
set TB=%time% & echo %time%--B
call:Timediff %TA% %TB% Tab
for /f "tokens=1-3 delims=:" %%a in ("%TAB%")do echo Time difference: %%a hours %%b minutes and %%c seconds
pause
goto:loop
:: /* ---------- Timediff ---------------
:Timediff [%t1%] [%t2%] [par|0]
for %%a in (+%1 +%2 +%3)do if "%%a"=="+" echo No Parameters!!&exit/b
setlocal enabledelayedexpansion
:timediff_1
set P2=%~1&set "P2=!P2::=!"
set/a P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%)
if not "%3"=="" set P1=!P2!&shift&goto:timediff_1
if !P2! geq !P1! (set/a df=!P2!-!P1!) else set/a df=!P2!-!P1!+8640000
set/a h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100
if %pt% leq 9 set pt=0%pt%
endlocal&if %2.==0. (echo\%h%:%m%:%s%.%pt%) else set %2=%h%:%m%:%s%.%pt%&goto:eof
:: ------------- Timediff ------------- */