Windows PowerShell で CPU の割合とメモリ使用量を表示する

Windows PowerShell で CPU の割合とメモリ使用量を表示する

私は答えを使うことができますCPU パーセンテージ

While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls; 
$p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}

現在、コンピューター上のタスクのメモリ使用量と CPU パーセンテージを同時に表示できないという問題が発生しています。Get-Counter "\Process(*)\Working Set - Private"メモリは取得できるとわかっていますが、タスク、CPU %、メモリ使用量を同時に表示したいです。

更新1:理想的には、これを PowerShell でコマンド セットとして実行できるようにしたいと思います。出力は次のように表示されるようにしたいと思います。

Process Name CPU (%) Memory (MB) ------------ ------- -----------

PowerShell で 3 つの項目を表示できるだけで、処理できる表示に関しては、取得できるものを取得します。

更新2:このコードセクションは私が望むものを提供します

while (1) {cls; Get-WmiObject Win32_PerfFormattedData_PerfProc_Process |
  select-object -property Name, PercentProcessorTime, IDProcess, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} |
  ? {$_.Name -notmatch "^(idle|_total|system)$"} |
  Sort-Object -Property PercentProcessorTime -Descending|
  ft -AutoSize |
  Select-Object -First 15; start-sleep 5}

結果は次のようになります。

Name                   PercentProcessorTime IDProcess                   WSP(MB)
----                    -------------------- ---------                   -------
MicrosoftEdgeCP#3                          6     18972                        6 WmiPrvSE#3                                 6     27300                        7
svchost#22                                 0      7316                        1

これの唯一の欠点は、情報を一度表示した後に失敗することであり、その理由はわかりません。これについて何か助けはありますか?

更新:3

$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
while ($true) {
    $tmp = Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | 
    select-object -property Name, @{Name = "CPU"; Expression = {($_.PercentProcessorTime/$cores)}}, @{Name = "PID"; Expression = {$_.IDProcess}}, @{"Name" = "Memory(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} |
    Where-Object {$_.Name -notmatch "^(idle|_total|system)$"} |
    Sort-Object -Property CPU -Descending|
    Select-Object -First 15;
    cls;
    $tmp | Format-Table -Autosize -Property Name, CPU, PID, "Memory(MB)";
    Start-Sleep 5
}

必要なことはすべて達成され、将来構築するための出発点が与えられます。テーブル フォーマッタで私が抱えていた問題は、それがformat-table最後になければならないことです。

答え1

WMI 経由でパフォーマンス カウンターをクエリする方法がもう 1 つあり、これが目的の成果をもたらすと思います。出力にはプロセス ID も含まれており、複数のインスタンスを持つプロセスを追跡するときに役立ちます。また、内部で「計算プロパティ」と呼ばれるものを使用して、select-objectワーキング セット値をバイトからメガバイトに変換します。また、4 コア システムの最大 CPU は 100 ではなく 400 であることに注意してください。したがって、全体の使用率 (最大 100) を取得するには、各プロセスの CPU 値をコア数で割る必要があります。

$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
while ($true) {
    Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | 
    Where-Object {$_.Name -notmatch "^(idle|_total|system)$" -and $_.PercentProcessorTime -gt 0} |
    Format-Table -Autosize -Property @{Name = "CPU"; Expression = {[int]($_.PercentProcessorTime/$cores)}}, Name, @{Name = "PID"; Expression = {$_.IDProcess}}, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}}
    Start-Sleep 5
}

CPU Name            PID WSP(MB)
--- ----      --------- -------
  1 chrome        12476      64
  2 wuauclt        7504       0
  3 SearchIndexer 10128      22
  4 TIworker      11380     102

答え2

while (1) {cls; Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | select-object -property Name, PercentProcessorTime, IDProcess, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} | ? {$_.Name -notmatch "^(idle|_total|system)$"} | Sort-Object -Property PercentProcessorTime -Descending| Select-Object -First 15 | ft Name, PercentProcessorTime, IDProcess, "WSP(MB)" -AutoSize; start-sleep 5}

これこそ私が探していたものです。素晴らしい出発点を提供してくれた @Clayton に感謝します。各パーツの機能についての説明は次のとおりです。

while(1)=> 常に実行中

cls=> 現在の画面をクリアする

Get-WmiObject=> 現在のプロセス情報をすべて取得するために使用されます

select-object=> 必要なデータの列のみを選択します

? {$_.Name -notmatch "^(idle|_total|system)$"}=> プロセス名の最初の部分にidle、_total、またはsystemが含まれるプロセス名を削除します

Sort-Object=> プロセスをCPU使用率の降順で並べ替える

Select-Object=> 最初の 15 項目のみを選択します (上位 15 個の CPU プロセス)

ft=> 列タイトルと画面全体を使用した表の書式設定を提供します

start-sleep=> ループをスリープさせて約5秒ごとに実行する

関連情報