![Windows PowerShell で CPU の割合とメモリ使用量を表示する](https://rvso.com/image/1558677/Windows%20PowerShell%20%E3%81%A7%20CPU%20%E3%81%AE%E5%89%B2%E5%90%88%E3%81%A8%E3%83%A1%E3%83%A2%E3%83%AA%E4%BD%BF%E7%94%A8%E9%87%8F%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B.png)
私は答えを使うことができます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秒ごとに実行する