Windows Powershell zeigt CPU-Prozentsatz und Speichernutzung an

Windows Powershell zeigt CPU-Prozentsatz und Speichernutzung an

Ich kann die Antwort verwendenCPU-Prozentsatz.

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

Jetzt habe ich Probleme, mir Speichernutzung und CPU-Prozentsatz für eine Aufgabe auf dem Computer gleichzeitig anzeigen zu lassen. Ich weiß, dass ich Get-Counter "\Process(*)\Working Set - Private"den Speicher bekomme, aber ich möchte, dass Aufgabe, CPU-Prozentsatz und Speichernutzung gleichzeitig angezeigt werden.

UPDATE 1:Idealerweise möchte ich dies in Powershell als Befehlssatz ausführen können. Ich möchte, dass die Ausgabe wie folgt angezeigt wird:

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

Ich nehme, was ich kriegen kann, wenn es um die Anzeige geht, die gehandhabt werden kann, nachdem ich in der Lage bin, nur die drei Elemente in Powershell anzuzeigen.

UPDATE 2:Dieser Codeabschnitt bietet, was ich möchte

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}

Es ergibt sich folgende Anzeige:

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

Der einzige Nachteil ist, dass es nach einer Informationsanzeige fehlschlägt und ich weiß nicht, warum. Kann mir jemand dabei helfen?

AKTUALISIERUNG: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
}

Erfüllt alles, was ich brauche, und bietet mir eine Grundlage, auf der ich in Zukunft aufbauen kann. Das Problem, das ich mit dem Tabellenformatierer hatte, ist, dass dieser format-tablezuletzt stehen muss.

Antwort1

Es gibt eine andere Möglichkeit, Leistungsindikatoren über WMI abzufragen, die meiner Meinung nach das liefert, wonach Sie suchen. Die Ausgabe enthält auch die Prozess-ID, die nützlich ist, wenn Sie einen Prozess mit mehreren Instanzen verfolgen. Es wird auch eine sogenannte „berechnete Eigenschaft“ verwendet, select-objectum den Arbeitssatzwert von Bytes in Megabytes umzuwandeln. Beachten Sie auch, dass die maximale CPU-Auslastung auf einem 4-Kern-System 400 und nicht 100 beträgt. Um also die Gesamtauslastung zu erhalten (die maximal 100 beträgt), müssen Sie den CPU-Wert jedes Prozesses durch die Anzahl der Kerne teilen.

$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

Antwort2

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}

Das ist, wonach ich gesucht habe. Vielen Dank, @Clayton, für den tollen Ausgangspunkt. Hier ist eine Erklärung, was jeder Teil macht.

while(1)=> immer am Laufen

cls=> den aktuellen Bildschirm löschen

Get-WmiObject=> wird verwendet, um alle aktuellen Prozessinformationen abzurufen

select-object=> nur die gewünschten Datenspalten auswählen

? {$_.Name -notmatch "^(idle|_total|system)$"}=> Entfernen Sie die Prozessnamen, die im ersten Teil des Prozessnamens „idle“, „_total“ oder „system“ enthalten

Sort-Object=> sortieren Sie die Prozesse nach CPU-Auslastung in absteigender Reihenfolge

Select-Object=> nur die ersten 15 Elemente auswählen (die 15 wichtigsten CPU-Prozesse)

ft=> Tabellenformatierung mit Spaltenüberschriften und Nutzung des gesamten Bildschirms

start-sleep=> schaltet die Schleife so ein, dass sie etwa alle 5 Sekunden ausgeführt wird

verwandte Informationen