バッチファイルの実行にはどれくらい時間がかかりますか?

batch-file executable time

スクリプトが完成するまでにかかった時間を計算するスクリプトを書くにはどうすればいいですか?

私はこれが本当であると思いました、しかし明らかにそうではありません..

@echo off set starttime =%time%set endtime =%time%

REMはここでものをやる

set / a runtime =%endtime% - %starttime%echoスクリプトが完了するまで%runtime%を要しました

  18  3


ベストアンサー

オリジナルのバッチファイルについては、2つのことが起こります。 [line-through] しかしどちらも長期的には役立つことはないだろう

  1. ベンチマーク方法が何であれ、必ず開始時間を記録してください
    _before_操作、および終了時間_after_操作。 あなたのサンプルはそれをしません。

  2. `%time%`は「12:34:56.78」のようなものに評価され、
    `+ SET / A +`コマンドはそれらを減算できません。 単純なスカラタイムスタンプを生成するコマンドが必要です。

私はそれができないと言うつもりでした、しかしバッチ言語はそれが認められているよりはるかに強力です、それでここにTIMER.BATの簡単な実装があります。 記録のために、Paxは私がいじっている間にストリング分割を示す答えに私を打ちました、そしてJohannesRösselは計算された領域の外側に算術を動かすことを提案しました:

@echo off
setlocal

rem Remeber start time. Note that we don't look at the date, so this
rem calculation won't work right if the program run spans local midnight.
set t0=%time: =0%

rem do something here.... but probably with more care about quoting.
rem specifically, odd things will happen if any arguments contain
rem precent signs or carets and there may be no way to prevent it.
%*

rem Capture the end time before doing anything else
set t=%time: =0%

rem make t0 into a scaler in 100ths of a second, being careful not
rem to let SET/A misinterpret 08 and 09 as octal
set /a h=1%t0:~0,2%-100
set /a m=1%t0:~3,2%-100
set /a s=1%t0:~6,2%-100
set /a c=1%t0:~9,2%-100
set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%

rem make t into a scaler in 100ths of a second
set /a h=1%t:~0,2%-100
set /a m=1%t:~3,2%-100
set /a s=1%t:~6,2%-100
set /a c=1%t:~9,2%-100
set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%

rem runtime in 100ths is now just end - start
set /a runtime = %endtime% - %starttime%
set runtime = %s%.%c%

echo Started at %t0%
echo Ran for %runtime%0 ms

100分の2の部分に煩わされないようにすることで、計算を単純化し、全体的な精度についてもう少し正直になることができます。 あなたがsleepコマンドか他の時間の浪費を持っていると仮定して、ここでそれは実行中です:

C:> TIMER SLEEP 3
Script took 3000 ms to complete
C:>

*編集:*コメントに示されているように、コードとその説明を修正しました。

NTチームがCOMMAND.COMをCMD.EXEに置き換えたとき、彼らはそれを非常に異なるものにすることでうまくいかないだろうと彼らは思ったと思います。 しかし実際には、それはほとんどまったく新しい言語です。 拡張機能が有効になっている場合、古いお気に入りのコマンドの多くに新しい機能があります。

それらの1つは変数が呼び出し側の環境を変更することを防ぐ `+ SETLOCAL `です。 もう1つは「 SET / A 」で、これにより驚くほどの算術演算が可能になります。 ここで使用した基本的なトリックは、新しいサブストリング抽出構文です。ここで、「%t:〜3,2%」は、「 t +」という名前の変数の値のオフセット3から始まる2文字を意味します。

実際のショッカーについては、セットの完全な説明を見てください(プロンプトで `+ SET /?`を試してください)。それでも怖くない場合は、 ` FOR /?+`を見て、ファイルからテキストを解析…​

編集2: Frankieがコメントで報告した `+ 08 `または ` 09 +`を含む時間フィールドの誤った処理を修正しました。 いくつかのことを微調整し、そしていくつかのコメントを追加しました。

ここで私はおそらく修正するつもりはないという明白な見落としがあることに注意してください。 コマンドが終了日と異なる日に開始された場合は機能しません。 つまり、時刻に関連した数学を行い、違いを報告しますが、違いはそれほど意味がありません。

少なくともこの問題について警告するように修正するのは簡単です。 正しいことをするためにそれを修正することはより困難です。

編集3:%h%が1桁の時間で正しく設定されていないエラーを修正しました。 これは%time%が “9:01:23.45″を返すためです。 スペースに注意してください。 %time:= 0%を使用すると、スペースが先行ゼロに置き換えられ、%h%が正しく設定されます。 このエラーは、スクリプトが1桁の時から次の時に実行されたときにのみ発生しました。

38


これは一種の接線ですが、助けになるかもしれません。

マイクロソフトは、UNIXの ‘time’コマンドの拡張版のように動作するtimeit.exeプログラムを持っています。 それはhttp://www.microsoft.com/downloads/details.aspx?FamilyID=9D467A69-57FF-4AE7-96EE-B18C4790CFFDに入っています

一見の価値があるかもしれません。

4


優れた小さな日常 ただし、計算が2日間にわたる場合、計算は正しくありません。 結果は24時間(8640000センチ秒)から引く必要があります。

関連行の重複した ‘set’コマンドも削除してください。

地域設定はTIME関数のフォーマットに影響することに注意してください。小数点は英国ではカンマではなくフルストップです。

台詞

日数の間の時間を測定したかもしれない

%ENDTIME%LSS%STARTTIME%が設定されている場合/ A DURATION =%STARTTIME% - %ENDTIME%

に変更する必要があります

私達は何日にもわたる時間を測定したかもしれないrem

%ENDTIME%LSS%STARTTIME%が設定されている場合/ A DURATION = 8640000  - (%STARTTIME% - %ENDTIME%)

3


私個人の好みは、Cygwinをインストールして `+ time +`コマンドを使用することですが、実際にバッチファイルとして実行する場合は、文字列を単に減算することはできず、部分として扱う必要があります。

次のスクリプトは、10秒のpingコマンドで、負の数に拘束されずに1日の境界を越えることができるようにします。 わずかな改善はそれが多くの日の境界を越えることを可能にするでしょう。

@echo off
setlocal enableextensions enabledelayedexpansion
set starttime=%time%
ping -n 11 127.0.0.1 >nul: 2>nul:
set endtime=%time%

set /a hrs=%endtime:~0,2%
set /a hrs=%hrs%-%starttime:~0,2%

set /a mins=%endtime:~3,2%
set /a mins=%mins%-%starttime:~3,2%

set /a secs=%endtime:~6,2%
set /a secs=%secs%-%starttime:~6,2%

if %secs% lss 0 (
    set /a secs=!secs!+60
    set /a mins=!mins!-1
)
if %mins% lss 0 (
    set /a mins=!mins!+60
    set /a hrs=!hrs!-1
)
if %hrs% lss 0 (
    set /a hrs=!hrs!+24
)
set /a tot=%secs%+%mins%*60+%hrs%*3600

echo End     = %endtime%
echo Start   = %starttime%
echo Hours   = %hrs%
echo Minutes = %mins%
echo Seconds = %secs%
echo Total   = %tot%

endlocal

2


このスクリプトをチェックして、WMIから時間を取得し、地域設定に依存しないようにします。

@echo off
::::::::::::::::::::::::::::::::::::::::::
::  TimeDiff v1.00 by LEVENTE ROG       ::
::       www.thesysadminhimself.com     ::
::::::::::::::::::::::::::::::::::::::::::
::[ EULA ]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::  Feel free to use this script. The code can be redistributed  ::
::  and edited, but please keep the credits.                     ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::[ CHANGELOG ]::::::::::::::
::  v1.00 - First Version  ::
:::::::::::::::::::::::::::::
FOR / F "スキップ= 1トークン= 1〜6" %% IN( 'WMICパスWin32_LocalTime取得日^、時間^、分^、秒/形式:表^ | findstr / r "。")DO(設定ミリ秒=%時間:〜9,2%設定日= %%設定時間= %% B設定分= %% C設定秒= %% D)設定/開始=%Day%* 8640000%時%* 360000 %分%* 6000%秒%* 100%ミリ秒%
::
::
:: PUT COMMANDS HERE
ping www.thesysadminhimself.com
::
::
FOR / F "スキップ= 1トークン= 1〜6" %% IN( 'WMICパスWin32_LocalTime取得日^、時間^、分^、秒/形式:表^ | findstr / r "。")DO(設定日= %%セット時間= %% Bセット分= %% Cセット秒= %% D)セットミリ秒=%時間:〜9,2%セット/終了=%日%* 8640000%時間%* 360000 %Minute%* 6000%Second%* 100%ミリ秒%セット/ Diff =%End% - %Start%セット/ DiffMS =%Diff %%% 100セット/ Diff =(%Diff% - %DiffMS%) / 100セット/ Diff Diff =%Diff %%% 60セット/ Diff =(%Diff% - %Diff %%% 60)/ 60セット/ DiffMin =%Diff %%% 60セット/ Diff =(% Diff% - %Diff%60%/ 60セット/ DiffHrs =%Diff%
:: format with leading zeroes
%DiffMS%LSS 10セットDiffMS = 0%DiffMS!%%DiffSec%LSS 10セットDiffMS = 0%%DiffMin%LSS 10セットDiffMS = 0%DiffMin%if%DiffHrs%LSS 10セットDiffMS = 0 %DiffHrs%echo%DiffHrs%:%DiffMin%:%DiffSec%。%DiffMS%

2


バッチスクリプトで直接時間計算を行うことはできません。したがって、時間差を計算するための外部プログラムが必要になるか、時間の各部分を抽出してそのように計算を行うことになります。

後者を行う方法の例については、http://fixunix.com/ms-dos/23271-how-calculate-time-taken-batch-file-run.html [このフォーラムのスレッド]の下部をご覧ください。 。 ここで抜粋:

@echo off
cls
REM ================================================== ======
REM = Setting Date Time Format =
REM ================================================== ======
set DT=%DATE% %TIME%
set year=%DT:~10,4%
set mth=%DT:~4,2%
set date=%DT:~7,2%
set hour=%DT:~15,2%
set min=%DT:~18,2%
set sec=%DT:~21,2%
set newDT=%year%_%mth%_%date% %hour%%min%%sec%

set hour=14
set min=10

REM ===============================
REM = Getting End Time =
REM ===============================
set EndTime=%TIME%
set EndHour=%EndTime:~0,2%
set EndMin=%EndTime:~3,2%


REM ===============================
REM = Finding Difference =
REM ===============================
set /a Hour_Diff=EndHour - hour >nul
set /a Min_Diff=EndMin - min >nul


REM ===============================
REM = Hour Hand Change? =
REM ===============================
IF [%Hour_Diff]==[0] (

Set Duration=%Min_Diff%
) ELSE (

Set /a Duration=60-%Min_Diff% >nul
)


echo Start Time = %hour% : %min%
echo End Time = %EndHour% : %EndMin%
echo.
echo Min Diff = %Min_Diff%
echo.
echo time difference (mins) = %Duration%

また、それはタイプミスであると仮定しますが、必ず + endtime + _after_処理を設定する必要があります。

0


タイトルとURLをコピーしました