Mit den Process-Cmdlets in Windows PowerShell können Sie lokale und Remoteprozesse in Windows PowerShell verwalten.
Abrufen von Prozessen (Get-Process)
Zum Abrufen der auf dem lokalen Computer ausgeführten Prozesse führen Sie Get-Process ohne Parameter aus.
Sie können bestimmte Prozesse abrufen, indem Sie deren Prozessnamen oder Prozess-IDs angeben. Mit dem folgenden Befehl wird der Idle-Prozess abgerufen:
PS> Get-Process -id 0 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 0 0 0 16 0 0 Idle
Auch wenn Cmdlets in manchen Situationen keine Daten zurückgeben, generiert Get-Process bei Angabe der Prozess-ID einen Fehler, wenn keine Übereinstimmungen gefunden werden, da das Ziel darin besteht, einen ausgeführten bekannten Prozess abzurufen. Wenn kein Prozess mit dieser ID vorhanden ist, ist die ID wahrscheinlich falsch, oder der infrage kommende Prozess wurde bereits beendet:
PS> Get-Process -Id 99 Get-Process : No process with process ID 99 was found. At line:1 char:12 + Get-Process <<<< -Id 99
Mit dem Name-Parameter des Cmdlet "Get-Process" kann ein Teil der Prozesse anhand des Prozessnamens angegeben werden. Der Name-Parameter akzeptiert mehrere Namen als durch Kommas getrennte Liste und unterstützt die Verwendung von Platzhaltern, daher können Sie Typnamenmuster verwenden.
Mit dem folgenden Befehl werden z. B. Prozesse abgerufen, deren Namen mit "ex" beginnen.
PS> Get-Process -Name ex* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 234 7 5572 12484 134 2.98 1684 EXCEL 555 15 34500 12384 134 105.25 728 explorer
Da Windows PowerShell-Prozesse auf der .NET System.Diagnostics.Process-Klasse aufbauen, folgt diese einigen von "System.Diagnostics.Process" verwendeten Konventionen. Eine dieser Konventionen besagt, dass der Prozessname für eine ausführbare Datei am Ende des Dateinamens nicht die Endung ".exe" enthält.
Get-Process akzeptiert auch mehrere Werte für den Name-Parameter.
PS> Get-Process -Name exp*,power* Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 540 15 35172 48148 141 88.44 408 explorer 605 9 30668 29800 155 7.11 3052 powershell
Mit dem ComputerName-Parameter von "Get-Process" können Sie Prozesse auf Remotecomputern abrufen. Mit dem folgenden Befehl rufen Sie z. B. die PowerShell-Prozesse auf dem lokalen Computer (mit "localhost" dargestellt) und zwei Remotecomputern ab.
PS> Get-Process -Name PowerShell -ComputerName localhost, Server01, Server02 Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 258 8 29772 38636 130 3700 powershell 398 24 75988 76800 572 5816 powershell 605 9 30668 29800 155 7.11 3052 powershell
Die Computernamen sind in dieser Anzeige nicht offensichtlich, sie werden jedoch in der MachineName-Eigenschaft der von Get-Process zurückgegebenen Prozessobjekte gespeichert. Im folgenden Befehl werden mit dem Cmdlet "Format-Table" die Prozess-ID, die ProcessName-Eigenschaft und die MachineName-Eigenschaft (ComputerName) der Prozessobjekte angezeigt.
PS> Get-Process -Name PowerShell -ComputerName localhost, Server01, Server01 | Format-Table -Property ID, ProcessName, MachineName Id ProcessName MachineName -- ----------- ----------- 3700 powershell Server01 3052 powershell Server02 5816 powershell localhost
Mit diesem etwas komplexeren Befehl wird die MachineName-Eigenschaft der Standardanzeige von Get-Process hinzugefügt. Das Graviszeichen (`, ASCII 96) stellt das Fortsetzungszeichen von Windows PowerShell dar.
get-process powershell -computername localhost, Server01, Server02 | format-table -property Handles, ` @{Label="NPM(K)";Expression={[int]($_.NPM/1024)}}, ` @{Label="PM(K)";Expression={[int]($_.PM/1024)}}, ` @{Label="WS(K)";Expression={[int]($_.WS/1024)}}, ` @{Label="VM(M)";Expression={[int]($_.VM/1MB)}}, ` @{Label="CPU(s)";Expression={if ($_.CPU -ne $()` {$_.CPU.ToString("N")}}}, ` Id, ProcessName, MachineName -auto Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName MachineName ------- ------ ----- ----- ----- ------ -- ----------- ----------- 258 8 29772 38636 130 3700 powershell Server01 398 24 75988 76800 572 5816 powershell localhost 605 9 30668 29800 155 7.11 3052 powershell Server02
Beenden von Prozessen (Stop-Process)
Windows PowerShell stellt mehrere Möglichkeiten zum Auflisten von Prozessen bereit. Wie aber kann ein Prozess beendet werden?
Das Cmdlet Stop-Process akzeptiert die Angabe des Namens oder der ID für den zu beendenden Prozess. Die Möglichkeit zum Beenden von Prozessen ist an Berechtigungen gebunden. Einige Prozesse können nicht beendet werden. Wenn Sie beispielsweise den Leerlaufprozess beenden möchten, wird folgende Fehlermeldung erzeugt:
PS> Stop-Process -Name Idle Stop-Process : Process 'Idle (0)' cannot be stopped due to the following error: Access is denied At line:1 char:13 + Stop-Process <<<< -Name Idle
Sie können die Aufforderung auch mit dem Confirm-Parameter erzwingen. Dieser Parameter ist besonders hilfreich, wenn Sie beim Angeben des Prozessnamens Platzhalter verwenden, da möglicherweise auch Prozesse gefunden werden, die nicht beendet werden sollen:
PS> Stop-Process -Name t*,e* -Confirm Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "explorer (408)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):n Confirm Are you sure you want to perform this action? Performing operation "Stop-Process" on Target "taskmgr (4072)". [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):n
Mit einigen Objektfilterungs-Cmdlets sind umfangreichere Prozessbearbeitungen möglich. Prozessobjekte verfügen über die Responsive-Eigenschaft. Wenn der Prozess nicht mehr reagiert, weist diese den Wert "True" auf, sodass alle Anwendungen, die nicht mehr reagieren, mit dem folgenden Befehl beendet werden können:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
Sie können diesen Ansatz auch in anderen Situationen verwenden. Angenommen, eine sekundäre Anwendung im Infobereich wird automatisch ausgeführt, wenn eine andere Anwendung gestartet wird. Möglicherweise stellen Sie fest, dass dies in Terminaldienste-Sitzungen nicht ordnungsgemäß ausgeführt wird, möchten diese Funktion jedoch für Sitzungen beibehalten, die auf der physischen Computerkonsole ausgeführt werden. Sitzungen, die mit dem Desktop des physischen Computers verbunden sind, weisen stets die Sitzungs-ID 0 auf, sodass Sie alle Instanzen der Prozesse in anderen Sitzungen mit Where-Object und der dem Prozess SessionId beenden können:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
Das Cmdlet "Stop-Process" verfügt nicht über einen ComputerName-Parameter. Wenn Sie auf einem Remotecomputer einen Befehl zum Beenden eines Prozesses ausführen möchten, müssen Sie daher das Cmdlet "Invoke-Command" verwenden. Um zum Beispiel den PowerShell-Prozess auf dem Remotecomputer "Server01" zu beenden, geben Sie Folgendes ein:
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Beenden aller anderen Windows PowerShell-Sitzungen
Mitunter kann es hilfreich sein, alle Windows PowerShell-Sitzungen außer der aktuellen Sitzung beenden zu können. Wenn für eine Sitzung zu viele Ressourcen erforderlich sind oder der Zugriff darauf nicht möglich ist (z. B. bei Remoteausführung oder Ausführung in einer anderen Desktopsitzung), kann eine Sitzung möglicherweise nicht unmittelbar beendet werden. Wenn Sie nun versuchen, alle zu diesem Zeitpunkt ausgeführten Sitzungen zu beenden, wird möglicherweise stattdessen die aktuelle Sitzung beendet.
Alle Windows PowerShell-Sitzungen verfügen über die Umgebungsvariable PID, die die ID des Windows PowerShell-Prozesses enthält. Sie können die $PID mit der ID der einzelnen Sitzungen vergleichen und nur Windows PowerShell-Sitzungen beenden, die eine abweichende ID aufweisen. Dazu verwenden Sie den folgenden Pipelinebefehl, mit dem außerdem (anhand des PassThru-Parameters) eine Liste der beendeten Sitzungen zurückgegeben wird:
PS> Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} | Stop-Process - PassThru Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 334 9 23348 29136 143 1.03 388 powershell 304 9 23152 29040 143 1.03 632 powershell 302 9 20916 26804 143 1.03 1116 powershell 335 9 25656 31412 143 1.09 3452 powershell 303 9 23156 29044 143 1.05 3608 powershell 287 9 21044 26928 143 1.02 3672 powershell
Starten und Debugging von und Warten auf Prozesse
Windows PowerShell wird auch mit Cmdlets ausgeliefert, mit denen ein Prozess gestartet (oder erneut gestartet) und debuggt werden kann und mit denen vor der Ausführung eines Befehls auf den Abschluss eines Prozesses gewartet werden kann. Informationen zu diesen Cmdlets finden Sie im Cmdlet-Hilfethema zum jeweiligen Cmdlet.
Siehe auch