コマンドラインツールの時間を測定する最も簡単な方法


9

コマンドラインツールの時間を測定する最も簡単で迅速な方法は何ですか?

私はこれが数分または1時間以上かかることを期待しているので、それは超正確である必要はありません(+/-秒は大丈夫です)。また、バッチファイルの書き込みも問題ありません。また、時間どおりに計算する必要はなく、開始時刻と終了時刻を表示するだけです。


Stackoverflowに属している可能性があります。
ジョーイ

2
これを機能させるために何かを「プログラミング」する必要がある場合...ソリューションは複雑すぎます。これには、コマンドラインツールまたは単純なバッチソリューションが必要です。
slolife 2009

Serverfaultの可能性が高いです。
キリルV.リヤドビンスキー2009

一般に、OSはそれが使用したCPU時間だけを考慮します。以下の私の答えはあなたが望むことをします。ログファイルを使用して情報を保存するだけです。
Axxmasterr 2009

回答:


19

私は通常使用しています

echo.|time & my_command & echo.|time

手元に他に何もないとき。これにより、次のような出力が発生します。

> echo。| time&ping -n 4 localhost> nul&echo。| time
現在の時刻は次のとおりです。18:42:34,63
新しい時間を入力してください:
現在の時刻は次のとおりです。18:42:37,68
新しい時間を入力してください:

きれいではなく、findstrにパイプすることできれいにすることができます。

echo.|time|findstr current & ping -n 4 localhost > nul & echo.|time|findstr current

デフォルトで拡張が有効になっている(または/v:on引数としてcmdを開始した)場合はecho !time!、入力リダイレクトによる醜いハックに頼る必要なく、単に使用することもできます。

バッチファイルを使用する場合は、次のようにします。

@echo Start time: %time%
@%*>nul 2>nul
@echo End time: %time%

ここでは、stdoutとstderrの両方のリダイレクトをnulに追加しました。そうしないと、開始行と終了行を見つけるのが難しい場合があるためです。これが問題にならない場合は、これを削除できます。

しかし、最近は主にTimeThisを使用していますが、これは残念ながら削除されています。

PowerShellにも方法があります。

Measure-Command { my_command }

ただし、作業ディレクトリまたはリダイレクトに依存することに注意する必要があります。それらが正しく機能するためには、ちょっとしたトリックが必要かもしれません:

@echo off
setlocal enableextensions

rem Prepare current directory and command line so they
rem can be stuck into a single-quoted PowerShell string.
set "Dir=%CD:'=''%"
set "Cmd=%*"
set "Cmd=%Cmd:'=''%"

rem Prepare command to pass to PowerShell
set Command=
set "Command=&{"
set "Command=%Command%  Set-Location '%Dir%'"
set "Command=%Command%; [Environment]::CurrentDirectory = '%Dir%'"
set "Command=%Command%; $start = Get-Date"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host"
set "Command=%Command%; iex 'cmd /c %Cmd%'"
set "Command=%Command%; $end = Get-Date"
set "Command=%Command%; Write-Host"
set "Command=%Command%; Write-Host '    Command line : %Cmd%'"
set "Command=%Command%; Write-Host ('    Start time   : ' + $start.ToString())"
set "Command=%Command%; Write-Host ('    End time     : ' + $end.ToString())"
set "Command=%Command%; Write-Host ('    Elapsed time : ' + ($end - $start).ToString())"
set "Command=%Command%; }"

powershell -noprofile -command "%Command%"

endlocal

これはと同じように実行できます。コマンドラインでtimethis二重引用符\"が必要な場合は、必ず二重引用符でエスケープしてください(timethis同様に)。生成される出力は似ています。ただし、リダイレクトは機能しません。


TimeThisはWindows 2000リソースキットからのものであり、利用できなくなりました。2003年のリソースキットはTimeItで、私の64ビットWin7では動作しませんでした。PowerShellソリューションについては、superuser.com
questions / 228056 /…を

それは最低だ。ただし、実行可能ファイルは昔からまだここにあります。
Joey

@pesche:のドロップイン代替として機能するバッチファイルを追加しましたtimethis
Joey

4

システムスケジューラを使用して、コマンドを実行できます。

コントロールパネル->スケジュールされたタスク->新規作成...

スケジュールされたタスクを実行したいコマンドに向けるだけで、必要なことが実行されます。

時状態情報を格納するログファイルを作成したい場合は、上記のスクリプトと同様のことを行うことを検討してください。

日付と時刻をエコーするので、「今」というユーティリティを使用します。これは、ログファイルで追跡したいが、日付/時刻をネイティブに含めるための賢い機能がないコマンドラインスクリプトにとって非常に便利です。応答を気にせず、使い終わったら消えてしまうので非常に便利です。

ここでユーティリティを見つけることができます

スクリプトの例は...

echo -------------- >>logfile.txt
now Process Starting>> logfile.txt
<commandhere> <target> >> logfile.txt
now process Ending >> logfile.txt
echo -------------- >> logfile.txt

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

--------------
Mon Mar 06 14:58:48 2009 Process Starting
GNU Super Duper Process PID 12345! Success
Mon Mar 06 21:47:01 2009 Process Ending
--------------

4

もう1つのオプションは、現在のタイムアウトをコンソールに送信する(またはログにリダイレクトする)timeコマンドを使用/tすることです。これにより、設定する時間の入力を求められることはありません。時間、分を提供しますが、秒とミリ秒は提供しないという制限があります。

call time /t  > myLog.log
call mybat   >> myLog.log
call time /t >> myLog.log

残念ながら、 "time / t"は秒を出力せず、 "hour:minute am / pm"のみを出力します。
slolife 09

そうです、私は答えを更新しました。
akf 2009

1

powershellを使用している場合は、これを実行できます(読みやすくするためにすべて1行に分割)。

PS C:\> $startTime=Get-Date;ping /n 4 localhost;$endTime=Get-Date;
        echo "Finished in $(($endTime-$startTime).ToString())"

または、これをファイルに保存して、簡単に再利用できます。

# usage: .\timer.ps1 program [arguments]

$startTime = Get-Date;
$prog = $args[0];
$progargs = $args[1..($args.length-1)];

&$prog $progargs

$endTime = Get-Date;

echo "Finished in $(($endTime - $startTime).ToString())";

1
In command prompt:
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime
 wmic path win32_operatingsystem get LocalDateTime

Output:
C:\Users\Steini> wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.370000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.525000+000

C:\Users\Steini>wmic path win32_operatingsystem get LocalDateTime
LocalDateTime
20180113135409.627000+000

クリップボードからCtrl + vを使用して15,5msおよび10,2ms


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