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




Inhaltsverzeichnis