Windowsでリソースやプロセスの使用量など、様々な値を数値やグラフでリアルタイムに可視化したり、ログに出力したりできるパフォーマンスモニターというものがありますが、今回はそのパフォーマンスモニターで表示されるパフォーマンスカウンターの値をWindowsのコマンドやPowerShellで取得する方法をご紹介します。
【例題】CPU使用率を確認する
今回、パフォーマンスモニターで表示される以下のカウンターの値をコマンドやPowerShellで取得するのですが、値だけでなく日付と一緒に一定間隔で取得し続けるので、ここでは[_Total]の値(数値)のみを1つだけ取得するのが目標です。
カウンター | インスタンス | オブジェクト |
---|---|---|
% Processor Time | _Total | Processor Information |
コマンドでパフォーマンスカウンターを取得
まずは、Windowsのコマンドプロンプトでパフォーマンスカウンターを普通に取得してみます。
コマンドプロンプトで取得するには、typeperf
コマンドを使用します。
> typeperf "\Processor(_Total)\% Processor Time" "(PDH-CSV 4.0)","\\USER-PC\Processor(_Total)\% Processor Time" "10/22/2022 16:19:46.017","21.695354" "10/22/2022 16:19:47.031","18.858545" "10/22/2022 16:19:48.031","16.765932" ・・・
約1秒おきくらいに値が連続して取れるのがわかると思います。Processor(_Total)
としていますが、CPUのコア別の値をすべて取得したい場合は、半角括弧の中を*
(アスタリスク)にしてください。
それでは、ここから加工していきます!
値を1回だけ取得
上記のコマンドだけでは、[Ctrl]+[C]キーで終了しない限り値を連続して取得してしまいます。
そこで-sc
オプションを追加して値を1回だけ取得します。
> typeperf -sc 1 "\Processor(_Total)\% Processor Time" "(PDH-CSV 4.0)","\\USER-PC\Processor(_Total)\% Processor Time" "10/22/2022 17:18:34.430","6.852448" コマンドは、正しく完了しました。
その他のコマンドについては、Microsoft公式サイトの方法をご覧ください。
オプション | 説明 |
---|---|
-f <CSV | TSV | BIN | SQL> | 出力ファイルの形式を指定します。 既定値は CSV です。 |
-cf <filename> | 監視するパフォーマンス カウンターの一覧 (1 行につき 1 つのカウンター) を含むファイルを指定します。 |
-si <[[hh:]mm:]ss> | サンプル間隔を指定します。 既定値は 1 秒です。 |
-o <filename> | 出力ファイルまたは SQL データベースのパスを指定します。 既定値は STDOUT (コマンド ウィンドウへの書き込み) です。 |
-q [object] | インストールされているカウンターの一覧を表示します (インスタンスなし)。 1 つのオブジェクトのカウンターを一覧表示するには、オブジェクト名を含めます。 ***例 |
-qx [object] | インストールされているカウンターの一覧をインスタンスと一緒に表示します。 1 つのオブジェクトのカウンターを一覧表示するには、オブジェクト名を含めます。 |
-sc <samples> | 収集するサンプルの数を指定します。 既定では、CTRL + C キーが押されるまでデータが収集されます。 |
-config <filename> | コマンド オプションを含む設定ファイルを指定します。 |
-s <computer_name> | カウンター パスにコンピューターが指定されていない場合、監視するリモート コンピューターを指定します。 |
-y | プロンプトを表示せずに、すべての質問に「はい」と回答します。 |
/? | コマンド プロンプトにヘルプを表示します。 |
コマンドでパフォーマンスカウンターの値のみ取得
上記のコマンド結果では、CSV形式で2行表示されます。
今回で取得したいのは、パフォーマンスカウンターの値のみですので、上記の実行結果で言うところの2行目の2列目のみを取得します。
これをfor
コマンドを使用して実現します!
まずは完成形から。
> for /f "skip=2 delims=, tokens=2" %p in ('typeperf -sc 1 "\Processor(_Total)\% Processor Time"') do @echo %~p 25.006281
for
コマンドの後に色々オプションが付いていますが、最後に/f
オプションの各パラメーターについて、またまた公式サイトからご紹介しておきます。
Keyword | 説明 |
---|---|
eol=<c> | 行末文字 (1 文字のみ) を指定します。 |
skip=<n> | ファイルの先頭からスキップする行数を指定します。 |
delims=<xxx> | 区切り記号セットを指定します。 これは、既定のスペースとタブの区切り記号セットを置き換えます。 |
tokens=<x,y,m–n> | 各反復処理の for ループに渡す各行のトークンを指定します。 結果として、追加の変数名が割り当てられます。 m-n は、m 番目から n 番目までのトークンの範囲を指定します。 tokens= 文字列内の最後の文字がアスタリスク (*) の場合は、追加の変数が割り当てられ、解析された最後のトークンの後ろの行にある残りのテキストを受け取ります。 |
usebackq | 逆引用符で囲まれた文字列をコマンドとして実行し、一重引用符で囲まれた文字列をリテラル文字列として使用するように指定するか、スペースを含む長いファイル名の場合は、<set> 内のファイル名のそれぞれを二重引用符で囲めるように指定します。 |
PowerShellでパフォーマンスカウンターを取得
PowerShellでパフォーマンスカウンターのデータを取得するには、Get-Counter
コマンドを使用します。
コマンドプロンプトとは異なり、オプションを付けなければ繰り返し取得することはありませんので、下記のコマンドをそのまま流用します。
> Get-Counter "\Processor(_Total)\% Processor Time" Timestamp CounterSamples --------- -------------- 2022/10/22 22:20:21 \\user-pc\processor(_total)\% processor time : 13.2573156797266
PowerShellでパフォーマンスカウンターの値のみ取得
あとは、上記の実行結果から値のみを取得する処理を後ろに|
(パイプ)で繋げてあげれば完成です!
実行結果もコマンドプロンプトとは異なりCSV形式ではありませんが、要領は同じです。
ここでは、Foreach-Object
コマンドを使用して実現します。
PowerShellの完成形はこちら。
> Get-Counter "\Processor(_Total)\% Processor Time" | Foreach-Object {$_.CounterSamples[0].CookedValue} 21.9595039459738
こちらは、先程のコマンド実行結果から、[CounterSamples]の値だけ取得する方法でした。Foreach-Object
コマンドの詳しい使い方については、これまた公式サイトをご覧ください。
まとめてみると、コマンドプロンプトよりPowerShellの方が比較的簡単ですね!
さすが新しいだけあります。
特に以下のような場合に重宝しています!ぜひ、参考までに。
- Original:https://minory.org/windows-get-counter.html
- Source:Minory
- Author:管理者