サイトアイコン IT NEWS

Windowsのパフォーマンスモニターをコマンドで確認する方法

Windowsでリソースやプロセスの使用量など、様々な値を数値やグラフでリアルタイムに可視化したり、ログに出力したりできるパフォーマンスモニターというものがありますが、今回はそのパフォーマンスモニターで表示されるパフォーマンスカウンターの値をWindowsコマンドPowerShellで取得する方法をご紹介します。

【例題】CPU使用率を確認する

今回、パフォーマンスモニターで表示される以下のカウンターの値をコマンドPowerShellで取得するのですが、値だけでなく日付と一緒に一定間隔で取得し続けるので、ここでは[_Total]の値(数値)のみを1つだけ取得するのが目標です。

カウンターインスタンスオブジェクト
% Processor Time_TotalProcessor 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プロンプトを表示せずに、すべての質問に「はい」と回答します。
/?コマンド プロンプトにヘルプを表示します。
引用:typeperf | Microsoft Learn

コマンドでパフォーマンスカウンターの値のみ取得

上記のコマンド結果では、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> 内のファイル名のそれぞれを二重引用符で囲めるように指定します。
引用:対象 | Microsoft Learn

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の方が比較的簡単ですね!
さすが新しいだけあります。
特に以下のような場合に重宝しています!ぜひ、参考までに。

モバイルバージョンを終了