2009-04-11 25 views
17

スクリプトを作成してスクリプトの完了に要した時間を計算するにはどうすればよいですか?バッチファイルの実行時間はどのくらいですか?

私はあなたの時間差を計算する外部プログラムが必要になりますいずれかのように、あなたは、バッチスクリプト内で直接時間演算を行うことはできません

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

REM do stuff here 

set /a runtime=%endtime%-%starttime% 
echo Script took %runtime% to complete 
+1

shouldn」あなたは何かをした後で終わりを設定するか?それはタイプミスですか? –

+0

さて、 "time ./myscript" – mpen

+0

@markを在庫しているWindowsのインストールでは、timeは現在の時刻を設定または表示するCMD.EXEに組み込まれたコマンドです。 – RBerteig

答えて

1

..このケースだろうと思ったが、明らかではありません、または時間の各部分を抽出し、そのように算術演算を行います。

後者の方法の例については、this forum threadの下部を見てください。

また、それは入力ミスだと思われますが、 を処理した後には、を設定してください。あなたが実際には、バッチファイルとしてそれを行うにはを持って、あなただけの文字列を引くことができない、あなたが部品として扱う必要がある場合

2

私自身の個人的な好みは、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 
4

これは接線ですが、役立つかもしれません。

マイクロソフトでは、「time」コマンドの拡張バージョンとほぼ同じように動作するtimeit.exeプログラムがあります。それはWindows Server 2003 Resource Kitに入っていて、私があなたが示唆しているもののように何かしたいと思っていたすべての時間をほとんど置き換えています。

これは一見価値があります。

35

元のバッチファイルについて、2つのことが飛び出します。 しかし、どちらも長期的には助けにならないでしょう。操作後

  1. どのようなベンチマーク方法、前に運転開始時刻を取り込むようにしてください、と終了時間。あなたのサンプルはそれをしません。

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

私はそれを行うことができないと言うつもりだったが、バッチ言語は、それがために信用を与えられているよりも多くの強力ですので、ここでTIMER.BATの単純な実装です。

@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 

あなたは算術演算を簡素化し、もう少しのようになります。私の周りいじるし、ヨハネス・ロッセルは、測定領域の外側に算術を動かすことを提案しながら、記録のために、パックスは、文字列の分割を示すの答えに私を打ちます2番目の部分の100分の1を気にしないことで、これの全体的な正確さについて正直です。

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

編集:ここでは、それはあなたがスリープコマンドまたは他のいくつかの時間の無駄を持っていると仮定すると、アクションであるコメントで示唆したように、私はコードとその説明を改訂しました。

私は、NTチームがCOMMAND.COMをCMD.EXEに置き換えたとき、彼らは非常に異なったものにならないと考えていました。しかし、事実上、それはまったく新しい言語です。拡張機能が有効になっていると、古いお気に入りコマンドの多くに新しい機能が追加されています。

これらのうちの1つは、変数が発信者の環境を変更できないようにするSETLOCALです。もう一つはSET /Aであり、これはあなたに驚異的な計算量を与えます。私がここで使用した主なトリックは、新しいサブストリング抽出構文です。%t:~3,2%は、tという変数の値のオフセット3から始まる2文字を意味します。

実際のショッカーの場合は、setの完全な説明を参照してください(プロンプトでSET /?を試してください)。恐れがない場合は、FOR /?を見て、ファイルからテキストを解析できることに気をつけてください。

編集2:08または09を含むタイムフィールドの誤った処理がコメントでFrankieによって報告されました。いくつかのことを微調整し、いくつかのコメントを追加しました。

ここで私は恐らく修正するつもりはないことに注意してください。コマンドが終了する日とは異なる日にコマンドが開始された場合は、動作しません。つまり、時間に関係する数学を行い、違いを報告しますが、その違いはあまり意味がありません。

少なくともこのケースについて警告するのは簡単です。正しいことをするのは難しいです。

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

+0

+1余分に行くために...あなたは説明することができます(Linuxに現在ブートされている)セット/ aビジネス – ojblass

+0

set/aはバッチで算術演算を行います。彼がここで行うことは、すべてを1/100秒に減らすことです。その後、それらは両方とも単なる数なので、単純に減算することができます。 – Joey

+0

あなたのコマンドが実行された後にすべての計算をしたいかもしれませんが... cmdの計算が正確ではないので、コマンドが終了した後に開始時間とフィーリングを保存するだけですコマンドの時刻。それが違いを生むかどうかはっきりしない、 – Joey

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 "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
 set Milisecond=%time:~9,2% 
 set Day=%%A 
 set Hour=%%B 
 set Minute=%%C 
 set Second=%%D 
) 
set /a Start=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100+%Milisecond% 
  
:: 
:: 
:: PUT COMMANDS HERE 
ping www.thesysadminhimself.com 
:: 
:: 
  
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
 set Day=%%A 
 set Hour=%%B 
 set Minute=%%C 
 set Second=%%D 
) 
set Milisecond=%time:~9,2% 
set /a End=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100+%Milisecond% 
set /a Diff=%End%-%Start% 
set /a DiffMS=%Diff%%%100 
set /a Diff=(%Diff%-%DiffMS%)/100 
set /a DiffSec=%Diff%%%60 
set /a Diff=(%Diff%-%Diff%%%60)/60 
set /a DiffMin=%Diff%%%60 
set /a Diff=(%Diff%-%Diff%%%60)/60 
set /a DiffHrs=%Diff% 
  
:: format with leading zeroes 
if %DiffMS% LSS 10 set DiffMS=0%DiffMS!% 
if %DiffSec% LSS 10 set DiffMS=0%DiffSec% 
if %DiffMin% LSS 10 set DiffMS=0%DiffMin% 
if %DiffHrs% LSS 10 set DiffMS=0%DiffHrs% 
  
echo %DiffHrs%:%DiffMin%:%DiffSec%.%DiffMS% 
+0

+1解決策はいいですが、遅いです、各タイムスタンプは〜100ms〜200ms必要です(私のPCの2.4GHz Core2 Duo上で) – jeb

3

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

また、該当する行の重複した 'set'コマンドの1つを削除してください。

地域の設定はTIME関数の形式に影響します。小数はコンマではなく英国のフルストップです。

ライン

レムは、私たちは日を越えた時間を測定している場合があります挟ん日

レムに変更

if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME% 

必要な時間を測定している場合があります

if %ENDTIME% LSS %STARTTIME% set /A DURATION=8640000 - (%STARTTIME% - %ENDTIME%) 
関連する問題