Windowsコマンドラインでコマンドの実行時間を測定するにはどうすればよいですか?


回答:


113

Windows 2003を使用している場合(Windows Server 2008以降はサポートされていないことに注意)、詳細な実行統計を表示するtimeit.exeが含まれているWindows Server 2003リソースキットを使用できます。次に、コマンド「timeit-?」のタイミングを示す例を示します。

C:\>timeit timeit -?
Invalid switch -?
Usage: TIMEIT [-f filename] [-a] [-c] [-i] [-d] [-s] [-t] [-k keyname | -r keyname] [-m mask] [commandline...]
where:        -f specifies the name of the database file where TIMEIT
                 keeps a history of previous timings.  Default is .\timeit.dat
              -k specifies the keyname to use for this timing run
              -r specifies the keyname to remove from the database.  If
                 keyname is followed by a comma and a number then it will
                 remove the slowest (positive number) or fastest (negative)
                 times for that keyname.
              -a specifies that timeit should display average of all timings
                 for the specified key.
              -i specifies to ignore non-zero return codes from program
              -d specifies to show detail for average
              -s specifies to suppress system wide counters
              -t specifies to tabular output
              -c specifies to force a resort of the data base
              -m specifies the processor affinity mask

Version Number:   Windows NT 5.2 (Build 3790)
Exit Time:        7:38 am, Wednesday, April 15 2009
Elapsed Time:     0:00:00.000
Process Time:     0:00:00.015
System Calls:     731
Context Switches: 299
Page Faults:      515
Bytes Read:       0
Bytes Written:    0
Bytes Other:      298

TimeItはWindows 2003リソースキットで入手できます。こちらからダウンロードして ください


7
このキットには、Windows 2008 64ビットの問題があり、2008 R2では動作しません
Artem

カーネル時間および/または生成されたサブプロセスによって使用される時間を測定する方法はありますか?
rogerdpack、2011

38
FYI-私はtimeitがWindows 7 64ビットで動作するとは思いません。あなたは「。、代わりに、クエリシステムのパフォーマンス・データにできません(c0000004)のPowerShellの使用『のエラーが表示されますCasey.Kが示唆のように』 Measure-Commandコマンドを:stackoverflow.com/questions/673523/...
マイケル・ラVoie

6
Windows 7では、「 'timeit'は内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。」と表示されます。
大佐パニック

3
Windows 10でコマンドが表示されません。また、Win 10用のリソースキットも簡単に見つかりません。これを10で取得する方法を知っている人はいますか?
ジェイイマーマン2018年

469

あるいは、Windows PowerShellには、Bashの「time」コマンドに似た組み込みコマンドがあります。これは「測定コマンド」と呼ばれます。PowerShellを実行するマシンにPowerShellがインストールされていることを確認する必要があります。

入力例:

Measure-Command {echo hi}

出力例:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 1318
TotalDays         : 1.52546296296296E-09
TotalHours        : 3.66111111111111E-08
TotalMinutes      : 2.19666666666667E-06
TotalSeconds      : 0.0001318
TotalMilliseconds : 0.1318

21
timeit.exeがWindows 7をサポートしていないように見えるため、これはWindows 7ユーザーにとって最適なソリューションです
Michael La Voie

14
内部のdosコマンド(例:dir、echo、delなど)を使用する場合は、忘れずに "cmd / c"を挿入してください:Measure-Command {cmd / c dir / sc:\ windows> nul}
LietKynes、2012年

7
.exe現在のディレクトリでをベンチマークする場合は、これを使用しますMeasure-Command { .\your.exe }pwd明示的に指示されない限り、PowerShellはどうやらそれを実行しません。
クリスティアンディアコネスク2013

13
厄介なことに、それはstdoutを隠します。
Zitrax、2015

13
これは、「Bashのtimeコマンドに似た」ツールではありません。ただし、知っておくと便利ですが、実行されず、中括弧で囲まれたコマンドの結果に戻ります。<stdout>
カートPfeifle

287

お望みならば

  1. 100分の1秒までの実行時間を測定するには(hh:mm:ss.ff形式)
  2. リソースパックをダウンロードしてインストールする必要がない
  3. 巨大なDOSオタクのように見える(そうではない)

次のスクリプトを新しいバッチファイル(timecmd.batなど)にコピーしてみてください。

@echo off
@setlocal

set start=%time%

:: Runs your command
cmd /c %*

set end=%time%
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100

set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%

:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)

使用法

パスのディレクトリにtimecmd.batを配置すると、次のようにどこからでも呼び出すことができます。

timecmd [your command]

例えば

C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18

出力のリダイレクトを行う場合は、次のようにコマンドを引用できます。

timecmd "dir c:\windows /s > nul"

これは、午前0時前から深夜後まで実行されるコマンドを処理する必要がありますが、コマンドが24時間以上実行される場合、出力は正しくありません。


9
コマンドが別のバッチファイルでない限り、cmd / c%*%*に置き換えても機能します。次に、timecmd call other.bat
Jesse Chisholm

2
@JesseChisholm Windows 8(およびWindows 7でも読みました)では、.batを呼び出す必要はありません
ブライアンJ

4
何らかの理由で、これは私に1秒単位でしか出力を与えません...私にとってそれは役に立たないです。つまり、を実行するtimecmd pauseと、常に1.00秒、2.00秒、4.00秒、さらには0.00秒になります。Windows 7
Camilo Martin

9
@CamiloMartin&これを持っている他の人(私のように)-10進数にDOTではなくCOMMAを使用するロケールがあるかもしれません。したがって、このスクリプトでは、に変更delims=:.するとdelims=:.,、「全面的に」機能するはずです。
Tomasz Gandor 2014

5
そのスクリプトに深刻な算術エラーがあります:試してみてください: set start=10:10:10.10 set end=10:11:10.09そして、出力されます: command took 0:1:-1.99 (59.99s total) "lss 0"比較を行う4行の順序を逆にして、桁上げが下位から上位へと正しく進むようにします。その後、出力は次のようになります。 command took 0:0:59.99 (59.99s total)
Jean-FrançoisLarvoire、2014

230

へへ、最も簡単な解決策は次のようになるでしょう:

echo %time%
YourApp.exe
echo %time%

これはすべてのWindowsでそのまま動作します。


コンソール出力を使用するアプリケーションの場合、一時変数に開始時刻を格納すると便利な場合があります。

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%

163
ばかじゃないの?!それはあなたの脳のように、数学をすることを含みます。これが私たちがコンピューターを発明した理由です。そのため、そのようなことをするのを避けることができました。
ルークサンプソン

1
鮮やかさ!それでも、CPU時間についてはあまり効果がありません
Elijah Saounkine

10
さらに良い(アプリがコンソールに出力を出力する場合):(set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time% 申し訳ありませんが、コメントで改行を取得できませんでした)
Jono

1
@LukeSampson、あなたsetは数学を行うために使用することができます。;-)ちょっと待って、気にしないで、あなたはすでにそれを下でやった
Synetech 2013

2
いいえ、これは悪いオプションです。これは、CPU時間ではなく、実時間を示します。したがって、コマンドラインにかかる時間がわずか100ミリ秒であっても、CPUを占有している別のアプリケーションがある場合、アプリケーションは数秒かかることがあります(100倍以上オフ)。実際、マシンがスラッシングしている場合は、100msの小さなアプリが実行されるまで1分待つことさえできます。実時間ではなく、CPU時間を追跡します!
Ryan Shillington、

102

from PowerShellの使用に関するCasey.Kからの回答のほんの少し拡大:Measure-Command

  1. 次のように、標準のコマンドプロンプトからPowerShellを呼び出すことができます。

    powershell -Command "Measure-Command {echo hi}"
    
  2. これは標準出力| Out-Defaultを消費しますが、PowerShellから次のように追加することで防止できます。

    Measure-Command {echo hi | Out-Default}
    

    または、コマンドプロンプトから:

    powershell -Command "Measure-Command {echo hi | Out-Default}"
    

もちろん、これをスクリプトファイル*.ps1またはで自由にラップできます*.bat


1
測定したいコマンドに引用符がある場合はどうなりますか?その場合、これを.batスクリプトに変換できますか?例measureTime.bat "c:\program files\some dir\program.exe"
GetFree

53

Windows Server 2008 R2で使用するワンライナーは次のとおりです。

cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"

mycommandが引用符を必要としない限り(これはcmdの引用処理に影響します)。これ/v:onは、コマンドの実行時に一度ではなく、2つの異なるTIME値を個別に評価できるようにするためです。


これは「spam」バッチでも機能しません。これは、最初のラベルを上書きし、stackoverflow.com / questions / 673523
Val

通常^、cmdで引用符をエスケープできます(など^"
2013年

2
2番目のタイミングでcmd / v:onを繰り返すと、mycommandに引用符を含めることもできます。例:cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!
Maarten Pennings 2015

8
シンプル:echo %time% & *mycommand* & call echo %^time%この回答も参照してください。
Aacini 2017年

:あなたのコマンドの出力があまりにも多くの場合、多分それは簡単にだけ一緒に2時間入れていますcmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
ZHANG Zikai

49

コマンドウィンドウを開いて手動でコマンドを呼び出す場合、各プロンプトにタイムスタンプを表示できます。

prompt $d $t $_$P$G

それはあなたに次のようなものを与えます:

23.03.2009 15:45:50,77

C:\>

コマンドを実行する小さなバッチスクリプトがある場合は、各コマンドの前に空行を入れます。

(空行)

myCommand.exe

(次の空行)

myCommand2.exe

プロンプトの時間情報により、各コマンドの実行時間を計算できます。おそらく、さらに分析するために出力をテキストファイルにパイプするのが最善でしょう。

MyBatchFile.bat > output.txt

3
プロンプトコマンドを共有してくれてありがとうございます。CMDのトリックはたくさん見ましたが(bashの方が多いです)、これは気付かなかったです。
スティーブハワード

シンプルでエレガント、インストール不要、ワンショットコマンドのバッチファイルの書き込みなし、バッチファイルの各ステップの時間を計ることができます。
マット

26

他の人はフリーウェアやPowerShellなどのインストールを推奨しているため、Cygwinをインストールすることもできます。これにより、timeなどの多くの基本的なUnixコマンドにアクセスできます。

abe@abe-PC:~$ time sleep 5

real    0m5.012s
user    0m0.000s
sys 0m0.000s

Cygwinがどれほどのオーバーヘッドを追加するかわかりません。


41
Windowsの質問に答えるとき、Cygwinは不正行為と見なされます:-)
mivk

14
彼は、ResourceKit、TimeMem、ptime.exe、PowerShell、およびその他のユーティリティユーザーが最初にチートを開始することを規定しています。したがって、あなたがコメントを書く前に、著者があなたのコメントを不適切にしています。
Val

無料のプログラムCmderにbashが含まれているので、これが最も簡単な解決策だと思ったので、これにも賛成しました。cmder.net bashでスペースをエスケープする必要がある場合は、「引用符」の代わりにスペースの直前に\を使用することを覚えておいてください。例:cd / c / Program \ Files /
lukescammell

24

Unixの一部の機能ほどエレガントではありませんが、次のようなcmdファイルを作成します。

@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T

次のように開始時刻と終了時刻が表示されます。

The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:

2
異なる言語間での移植性が必要ない場合は、 "time <nul"の後にfindstr "current"またはそのようなものを配置することもできます(ちなみに、nulの便利な使い方です。私は常にecho。| timeを使用しましたが、それはエレガントに見えません:))。また、「for」を使用して、テキストではなく時間のみを抽出します。
ジョーイ

2
コマンド拡張が有効になっている場合(つまり、デフォルト)、Win XPバージョンのにtime/t、現在のシステム時刻を表示するオプションがあり、新しい時刻の入力を求めるプロンプトは表示されません。ただし、これを行うと、時間と分のみが表示されるため、使用状況によっては十分でない場合があります。(この質問に対するJohn Snowの回答を参照してください。)
martineau '23年

3
time /Tプロセスが数分間実行された場合にのみ使用できます!time < nul醜いですが、より正確です。
PhiLho 2013年

6
echo %time%と同じ形式と精度を提供するを使用することもできますがtime < nulEnter the new time:出力は回避されます...
aschipfl

ロケールに依存しないamdおよびより正確な時間の使用wmic os get LocalDateTime
phuclv 2017

19

「GS Timer」というフリーウェアを使用しています。

次のようなバッチファイルを作成するだけです。

timer
yourapp.exe
timer /s

一連の時間を必要とする場合は、タイマー/ sの出力を.txtファイルにパイプするだけです。

ここから入手できます:Gammadyneの無料DOSユーティリティ


分解能は0.1秒です。


4
サードパーティのアプリケーションを使用することは、「標準的な方法で」それを行うとは考えられないと思います。
martineau

4
質問者は「追加のソフトウェアをインストールせずに」という意味でしたが、トップ(受け入れられた)回答では、Windows 2003リソースキット全体をインストールする必要があります。とにかく、timer.exeは、探していたものにぴったりでした。
Hugo、

1
これは植えられたリンクです。SoftPediaはクリックファームです。
トムA

@トムは「植えられたリンク」とはどういう意味ですか?
ペポリアン2012

10
開発者自身のページへの直接リンクは次のとおり
Hugo

14

Windows XPを使用していますが、何らかの理由でtimeit.exeが機能しません。別の代替案を見つけました-PTIME。これは非常にうまく機能します。

http://www.pc-tools.net/win32/ptime/

例-

C:\> ptime

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

Syntax: ptime command [arguments ...]

ptime will run the specified command and measure the execution time
(run time) in seconds, accurate to 5 millisecond or better. It is an
automatic process timer, or program timer.


C:\> ptime cd

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  cd ===
C:\

Execution time: 0.015 s

Windows 8.1でも動作します。私は名前をtimer.exeに変更しました。これは、ptimeという名前を思い出せないためです。
ブライアンバーンズ

11

TimeMem(2012年3月)もあります。

これは、プログラムを実行し、その実行時間、メモリ使用量、およびIO統計を表示するWindowsユーティリティです。機能的にはUnix時間ユーティリティに似ています。


10

24時間以上持続しない限り...

@echo off

set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)

:TimeThis
ping localhost 

set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)

set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

echo.
echo Took: %timetaken% sec.

5
印象的ですが、開始時刻または終了時刻に08または09がある場合、これらは8進数として解釈されるため、機能しないと思います。私の答えはそれを処理します:)
ルーク・サンプソン

6

がここにあります

Postfixタイマーのバージョン:

使用例:

タイムアウト1 | TimeIt.cmd

Execution took  ~969 milliseconds.

これをコピーして、たとえばNotepad ++などのエディタに貼り付け、TimeIt.cmdとして保存します

:: --- TimeIt.cmd ----
    @echo off
    setlocal enabledelayedexpansion

    call :ShowHelp

    :: Set pipeline initialization time
    set t1=%time%

    :: Wait for stdin
    more

    :: Set time at which stdin was ready
    set t2=!time!


    :: Calculate difference
    Call :GetMSeconds Tms1 t1
    Call :GetMSeconds Tms2 t2

    set /a deltaMSecs=%Tms2%-%Tms1%
    echo Execution took ~ %deltaMSecs% milliseconds.

    endlocal
goto :eof

:GetMSeconds
    Call :Parse        TimeAsArgs %2
    Call :CalcMSeconds %1 %TimeAsArgs%

goto :eof

:CalcMSeconds
    set /a %1= (%2 * 3600*1000) + (%3 * 60*1000) + (%4 * 1000) + (%5)
goto :eof

:Parse

    :: Mask time like " 0:23:29,12"
    set %1=!%2: 0=0!

    :: Replace time separators with " "
    set %1=!%1::= !
    set %1=!%1:.= !
    set %1=!%1:,= !

    :: Delete leading zero - so it'll not parsed as octal later
    set %1=!%1: 0= !
goto :eof

:ShowHelp
    echo %~n0 V1.0 [Dez 2015]
    echo.
    echo Usage: ^<Command^> ^| %~nx0
    echo.
    echo Wait for pipe getting ready... :)
    echo  (Press Ctrl+Z ^<Enter^> to Cancel)
goto :eof

^- 「Daniel Sparks」バージョンに基づいています


5

測定時間の代替は、単に「Get-Date」です。転送出力などの面倒はありません。

$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start

出力:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 506
Ticks             : 15060003
TotalDays         : 1.74305590277778E-05
TotalHours        : 0.000418333416666667
TotalMinutes      : 0.025100005
TotalSeconds      : 1.5060003
TotalMilliseconds : 1506.0003

これは私にとって完璧でした
Brett Rowberry

4

これは、特定のコマンドを妨害する可能性のある拡張の遅延を回避するワンライナーです。

cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "

出力は次のようになります。

14:30:27.58$
...
14:32:43.17$ rem/ 

長期試験のために置き換える$Tことにより、$D, $Tおよび%TIME%によって%DATE%, %TIME%日付が含まれるように。

この内側に使用するには、バッチファイルを置き換える%Zことで%%Z


更新

以下は改良されたワンライナーです拡張の遅延もありません)。

cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"

出力は次のようになります。

2015/09/01, 14:30:27.58$ rem/ 
...
2015/09/01, 14:32:43.17$ prompt

このアプローチにはcmd、結果に新しいインスタンスを作成するプロセスは含まれませんprompt。また、コマンドも含まれません。


4

使用しているWindowsのバージョンに応じて、実行bashするだけでBashモードになります。これにより、PowerShellで直接利用できない一連のコマンド(timeコマンドなど)を使用できます。コマンドのタイミングは、実行するのと同じくらい簡単です。

# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>

注: Bashモードで実行すると、簡単にBashモードを終了してメインストリームシェルに戻ることができexitます。

これは、Measure-Command望ましくない統計を生成することがある他の方法(など)を試した後、完全に機能しました(Windows 10)。これがあなたにとってもうまくいくことを願っています。


2
Windows 10 1607の時点で最良の答えです。
CarpeDiemKopi

2

他の誰かがこの質問への回答を求めてここに来た場合のために、というWindows API関数がありGetProcessTimes()ます。コマンドを開始し、この呼び出しを行い、処理時間を返す小さなCプログラムを作成するのは、それほど面倒ではないようです。


3
コマンドを開始する小さなCプログラムをダウンロードし、この呼び出し(およびはるかに高度な測定)を実行し、処理時間を返すのは、それほど面倒ではないようです。
Elazar Leibovich、2009

@ElazarLeibovich powershell?C#から呼び出すことができます。
KeyWeeUsr 2017

@KeyWeeUsrあなたは、PSからのWindows API IIRCを使用することができますblogs.technet.microsoft.com/heyscriptingguy/2013/06/25/...
Elazar Leibovich

2

これはルークサンプソンさん素敵にコメント/編集であるtimecmd.batとに返信

どういうわけか、これは私に整数秒で出力を与えるだけです...それは私にとって役に立たないです。つまり、timecmd pauseを実行すると、常に1.00秒、2.00秒、4.00秒...でも0.00秒になります。Windows 7. – Camilo Martin 9月25日13:16 "

構成によっては、区切り文字が異なる場合があります。次の変更は、少なくともほとんどの西側諸国を対象としています。

set options="tokens=1-4 delims=:,." (added comma)

%time%ミリ秒「」ことを追加した後に私のシステム上で動作します

(*私は常に同じゲストメールを使用しますが、ipv6 ipとブラウザーのフィンガープリントでパスワードなしで一意に識別するのに十分であるべきですが、サイトはanonコメントを許可せず、アイデンティティを適切に追跡しません)


私はあなたの答えにスクロールダウンする前にそれについてコメントしました。とにかく、ルカのスクリプト可能性ゼロパッド時間、分、秒、(あるだけでなく、サブセカンドセンチところで、およびないミリ秒)。こちらをご覧ください:en.wiktionary.org/wiki/centisecond
Tomasz

2

これが私の方法です、変換もミリ秒もありません。エンコード期間を決定するのに便利です(ただし24時間に制限されています)。

@echo off

:start
REM Start time storage
set ST=%time%
echo Process started at %ST%
echo.
echo.

REM Your commands
REM Your commands
REM Your commands

:end
REM Start Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%ST%") do set /a h1=%%a & set /a m1=%%b & set /a s1=%%c

REM End Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%TIME%") do set /a h2=%%a & set /a m2=%%b & set /a s2=%%c

REM Difference
set /a h3=%h2%-%h1% & set /a m3=%m2%-%m1% & set /a s3=%s2%-%s1%

REM Time Adjustment
if %h3% LSS 0 set /a h3=%h3%+24
if %m3% LSS 0 set /a m3=%m3%+60 & set /a h3=%h3%-1
if %s3% LSS 0 set /a s3=%s3%+60 & set /a m3=%m3%-1

echo Start    :    %ST%
echo End    :    %time%
echo.
echo Total    :    %h3%:%m3%:%s3%
echo.
pause

1
@echo off & setlocal

set start=%time%

REM Do stuff to be timed here.
REM Alternatively, uncomment the line below to be able to
REM pass in the command to be timed when running this script.
REM cmd /c %*

set end=%time%

REM Calculate time taken in seconds, to the hundredth of a second.
REM Assumes start time and end time will be on the same day.

set options="tokens=1-4 delims=:."

for /f %options% %%a in ("%start%") do (
    set /a start_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
    set /a start_hs=100%%d %% 100
)

for /f %options% %%a in ("%end%") do (
    set /a end_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
    set /a end_hs=100%%d %% 100
)

set /a s=%end_s%-%start_s%
set /a hs=%end_hs%-%start_hs%

if %hs% lss 0 (
    set /a s=%s%-1
    set /a hs=100%hs%
)
if 1%hs% lss 100 set hs=0%hs%

echo.
echo  Time taken: %s%.%hs% secs
echo.

動作しません。取得:括弧がアンバランスです。括弧がアンバランスです。オペランドがありません。
Richard Sandoz、2016

@RichardSandoz正しく動作し、括弧の偏りはありません。どのように使用していますか?
MikeM 2016

1

次のスクリプトは「cmd.exe」のみを使用し、パイプラインが作成されてからスクリプトの前のプロセスが終了するまでのミリ秒数を出力します。つまり、コマンドを入力して、スクリプトにパイプします。例:「timeout 3 | runtime.cmd」は「2990」のようなものを生成するはずです。ランタイム出力とstdin出力の両方が必要な場合は、パイプの前にstdinをリダイレクトします-例: "dir / s 1> temp.txt | runtime.cmd"は、 "dir"コマンドの出力を "temp.txt"にダンプしますランタイムをコンソールに出力します。

:: --- runtime.cmd ----
@echo off
setlocal enabledelayedexpansion

:: find target for recursive calls
if not "%1"=="" (
    shift /1
    goto :%1
    exit /b
)

:: set pipeline initialization time
set t1=%time%

:: wait for stdin
more > nul

:: set time at which stdin was ready
set t2=!time!

::parse t1
set t1=!t1::= !
set t1=!t1:.= !
set t1=!t1: 0= !

:: parse t2
set t2=!t2::= !
set t2=!t2:.= !
set t2=!t2: 0= !

:: calc difference
pushd %~dp0
for /f %%i in ('%0 calc !t1!') do for /f %%j in ('%0 calc !t2!') do (
    set /a t=%%j-%%i
    echo !t!
)
popd
exit /b
goto :eof

:calc
set /a t=(%1*(3600*1000))+(%2*(60*1000))+(%3*1000)+(%4)
echo !t!
goto :eof

endlocal

スクリプトを再帰的に呼び出す代わりに、このようにすることを検討してくださいcall :calc。ここでそれをしました。リンクコードは、この方法の方が優れています。:D
Nadu

バグ#1 は12時間目に失敗します。例: " 0:23:19,42" Bug#2 小数点が以外の場合、失敗します。同じ例:「午後12時23分19秒 42」ここに小数点が<__________>まあ、あるが****ダムは、「編集承認委員会でそれを拒否したことが編集しようとした- 5の3は、この編集があまりにも変化し、」投票著者の多くの当初の意図。」運の編集を試してみたい、またはバグをそのままにしたい場合は、「作者の元の意図はそのまま残ります」。facepalm
Nadu

クロックの解像度が1/100秒の解像度にほとんど対応できない場合は、ミリ秒を出力できません。
jwdonahue 2017年

1

driblioの答えは少し短くすることができます(あまり判読できません)

@echo off

:: Calculate the start timestamp
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _started=_hours*60*60*100+_min*60*100+_sec*100+_cs


:: yourCommandHere


:: Calculate the difference in cSeconds
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _duration=_hours*60*60*100+_min*60*100+_sec*100+_cs-_started

:: Populate variables for rendering (100+ needed for padding)
set /a _hours=_duration/60/60/100,_min=100+_duration/60/100%%60,_sec=100+(_duration/100%%60%%60),_cs=100+_duration%%100

echo Done at: %_time% took : %_hours%:%_min:~-2%:%_sec:~-2%.%_cs:~-2%

::prints something like:
::Done at: 12:37:53,70 took: 0:02:03.55

発言ルークサンプソンこのバージョンのタスクは24時間で完了しなければならないのに、オクタル安全です。


動作しません。1桁の時の演算子がありません。
Richard Sandoz、2016

set _time=%time: =0%1桁の時間の問題を修正-両方の場所で置き換えます。
Laur

1
  1. プログラムがあるディレクトリで、と入力しnotepad mytimer.bat、「はい」をクリックして新しいファイルを作成します。

  2. 以下のコードを貼り付け、YourApp.exeプログラムに置き換えて保存します。

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. 入力しmytimer.bat、コマンドラインに入力し、Enterキーを押します。


7
時間/ tは、HH:MMの時間のみを示します。実行可能ファイルの時間を計るには、通常、より高い精度が必要です... 1秒の端数に到達するように設定できるものはありますか?私はJohnWからの溶液をテストしました(時間<nul)、そして実際には1/100秒までの時間を与えます:HH:MM:SS.XX
畏怖

1

私のコードでは、実行時間をミリ秒単位で最大24時間まで提供します。ロケールに依存せず、コードが真夜中に実行される場合は負の値を考慮します。遅延拡張を使用し、cmd / batファイルに保存する必要があります。

コードの前:

SETLOCAL EnableDelayedExpansion

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t1 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t1=!t1!%t:~15,3%

あなたのコードの後:

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t2 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t2=!t2!%t:~15,3%
set /a t2-=t1 && if !t2! lss 0 set /a t2+=24*3600000

HH:mm:ss.000形式で実行時間を必要とする場合は、以下を追加します。

set /a "h=t2/3600000,t2%%=3600000,m=t2/60000,t2%%=60000" && set t2=00000!t2!&& set t2=!t2:~-5!
if %h% leq 9 (set h=0%h%) && if %m% leq 9 (set m=0%m%)
set t2=%h%:%m%:%t2:~0,2%.%t2:~2,3%

ENDLOCAL

変数t2は実行時間を保持し、echo %t2%それを表示することができます。


1

Perlが利用可能な採用ソリューションをインストールしたら、次を実行します。

C:\BATCH>time.pl "echo Fine result"
0.01063
Fine result

STDERRは測定秒数の前に来ます

#!/usr/bin/perl -w

use Time::HiRes qw();
my $T0 = [ Time::HiRes::gettimeofday ];

my $stdout = `@ARGV`;

my $time_elapsed = Time::HiRes::tv_interval( $T0 );

print $time_elapsed, "\n";
print $stdout;

0

100分の1秒単位で時間を返すためにサブを使用する

::tiemeit.cmd
@echo off
Setlocal EnableDelayedExpansion

call :clock 

::call your_command  or more > null to pipe this batch after your_command

call :clock

echo %timed%
pause
goto:eof

:clock
if not defined timed set timed=0
for /F "tokens=1-4 delims=:.," %%a in ("%time%") do ( 
set /A timed = "(((1%%a - 100) * 60 + (1%%b - 100)) * 60 + (1%%c - 100))  * 100 + (1%%d - 100)- %timed%"
)
goto:eof

0

地域のフォーマット、24時間と混在入力をサポートした「リーンと平均」TIMER
する適応型Aaciniの置換方法本体、無IFの、ちょうど1 FOR(私の地域の修正)

1:ファイルtimer.batが%PATH%または現在のディレクトリのどこかに配置されてい ます

@echo off & rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!"     & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof

使用法:
timer &echo start_cmds&timeout / t 3&echo end_cmds& timer
timertimer "23:23:23,00"
timer "23:23:23,00"&timer
timer "13.23.23,00"&timer "03:03:03.00"
timertimer "0:00:00.00" no&cmd / v:on / c echo until midnight =!timer_end!
ありそうもないもののために、入力を混合することができるようになりましたが、実行中に時間形式が変更される可能性があります

2:バッチスクリプトにバンドルされている関数:timer(以下の使用例):

@echo off
set "TIMER=call :timer" & rem short macro
echo.
echo EXAMPLE:
call :timer
timeout /t 3 >nul & rem Any process here..
call :timer
echo.
echo SHORT MACRO:
%TIMER% & timeout /t 1 & %TIMER% 
echo.
echo TEST INPUT:
set "start=22:04:04.58"
set "end=04.22.44,22"
echo %start% ~ start & echo %end% ~ end
call :timer "%start%"
call :timer "%end%"
echo.
%TIMER% & %TIMER% "00:00:00.00" no 
echo UNTIL MIDNIGHT: %timer_end%
echo.
pause 
exit /b

:: テストするには、コードセクションの上と下の両方にコピーして貼り付けます

rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support 
:timer Usage " call :timer [input - optional] [no - optional]" :i Result printed on second call, saved to timer_end 
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!"     & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof

CE、DE、CS、DSは、コロンエンド、ドットエンド、コロンセット、ドットセットを表します-混合フォーマットのサポートに使用されます


0

次のスクリプトは* nixエポック時間をエミュレートしますが、それはローカルおよびリージョナルです。うるう年を含むカレンダーエッジケースを処理する必要があります。Cygwinが使用可能な場合、Cygwinオプションを指定することにより、エポック値を比較できます。

私はESTにいますが、報告される差異は4時間であり、比較的正確です。TZと地域の依存関係を削除する興味深い解決策はいくつかありますが、私が気づいたことは簡単なことではありません。

@ECHO off
SETLOCAL EnableDelayedExpansion

::
::  Emulates local epoch seconds
::

:: Call passing local date and time
CALL :SECONDS "%DATE%" "%TIME%"
IF !SECONDS! LEQ 0 GOTO END

:: Not testing - print and exit
IF NOT "%~1"=="cygwin" (
    ECHO !SECONDS!
    GOTO END
)

:: Call on Cygwin to get epoch time
FOR /F %%c IN ('C:\cygwin\bin\date +%%s') DO SET EPOCH=%%c

:: Show the results
ECHO Local Seconds: !SECONDS!
ECHO Epoch Seconds: !EPOCH!

:: Calculate difference between script and Cygwin
SET /A HOURS=(!EPOCH!-!SECONDS!)/3600
SET /A FRAC=(!EPOCH!-!SECONDS!)%%3600

:: Delta hours shown reflect TZ
ECHO Delta Hours: !HOURS! Remainder: !FRAC!

GOTO END

:SECONDS
SETLOCAL  EnableDelayedExpansion

    :: Expecting values from caller
    SET DATE=%~1
    SET TIME=%~2

    :: Emulate Unix epoch time without considering TZ
    SET "SINCE_YEAR=1970"

    :: Regional constraint! Expecting date and time in the following formats:
    ::   Sun 03/08/2015   Day MM/DD/YYYY
    ::   20:04:53.64         HH:MM:SS
    SET VALID_DATE=0
    ECHO !DATE! | FINDSTR /R /C:"^... [0-9 ][0-9]/[0-9 ][0-9]/[0-9][0-9][0-9][0-9]" > nul && SET VALID_DATE=1
    SET VALID_TIME=0
    ECHO !TIME! | FINDSTR /R /C:"^[0-9 ][0-9]:[0-9 ][0-9]:[0-9 ][0-9]" > nul && SET VALID_TIME=1
    IF NOT "!VALID_DATE!!VALID_TIME!"=="11" (
        IF !VALID_DATE! EQU 0  ECHO Unsupported Date value: !DATE! 1>&2
        IF !VALID_TIME! EQU 0  ECHO Unsupported Time value: !TIME! 1>&2
        SET SECONDS=0
        GOTO SECONDS_END
    )

    :: Parse values
    SET "YYYY=!DATE:~10,4!"
    SET "MM=!DATE:~4,2!"
    SET "DD=!DATE:~7,2!"
    SET "HH=!TIME:~0,2!"
    SET "NN=!TIME:~3,2!"
    SET "SS=!TIME:~6,2!"
    SET /A YEARS=!YYYY!-!SINCE_YEAR!
    SET /A DAYS=!YEARS!*365

    :: Bump year if after February  - want leading zeroes for this test
    IF "!MM!!DD!" GEQ "0301" SET /A YEARS+=1

    :: Remove leading zeros that can cause octet probs for SET /A
    FOR %%r IN (MM,DD,HH,NN,SS) DO (
        SET "v=%%r"
        SET "t=!%%r!"
        SET /A N=!t:~0,1!0
        IF 0 EQU !N! SET "!v!=!t:~1!"
    )

    :: Increase days according to number of leap years
    SET /A DAYS+=(!YEARS!+3)/4-(!SINCE_YEAR!%%4+3)/4

    :: Increase days by preceding months of current year
    FOR %%n IN (31:1,28:2,31:3,30:4,31:5,30:6,31:7,31:8,30:9,31:10,30:11) DO (
        SET "n=%%n"
        IF !MM! GTR !n:~3! SET /A DAYS+=!n:~0,2!
    )

    :: Multiply and add it all together
    SET /A SECONDS=(!DAYS!+!DD!-1)*86400+!HH!*3600+!NN!*60+!SS!

:SECONDS_END
ENDLOCAL & SET "SECONDS=%SECONDS%"
GOTO :EOF

:END
ENDLOCAL

反対票に興味があります。ありがとう。
bvj 2018年

0

純粋なPHP for cmdと1つの環境を使用するソリューション。変数:

@echo off
setlocal enableextensions

REM set start time env var
FOR /F "tokens=* USEBACKQ" %%F IN (`php -r "echo microtime(true);"`) DO ( SET start_time=%%F )

## PUT_HERE_THE_COMMAND_TO_RUN ##

REM echo elapsed time
php -r "echo 'elapsed: ' . (round(microtime(true) - trim(getenv('start_time')), 2)) . ' seconds' . mb_convert_encoding('&#13;&#10;', 'UTF-8', 'HTML-ENTITIES');"
  • cygwinや信頼できないユーティリティは必要ありません。PHPがローカルで利用可能な場合に役立ちます

  • 精度と出力フォーマットは簡単に調整できます

  • 同じアイデアをPowerShellに移植できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.