Verwalten von Prozessen mit Process-Cmdlets

Dieses Beispiel gilt nur für Windows PowerShell 5.1.

Sie können die Process-Cmdlets in PowerShell verwenden, um lokale und Remoteprozesse in PowerShell zu verwalten.

Abrufen von Prozessen

Um die Prozesse abzurufen, die auf dem lokalen Computer ausgeführt werden, führen Sie Get-Process ohne Parameter aus.

Sie können bestimmte Prozesse abrufen, indem Sie deren Prozessnamen oder Prozess-IDs angeben. Der folgende Befehl ruft den Prozess „Idle“ ab:

Get-Process -id 0
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         16     0               0 Idle

Obwohl es für Cmdlets normal ist, dass sie in einigen Fällen keine Daten zurückgeben, generiert Get-Process einen Fehler, wenn Sie einen Prozess über seine ProcessId angeben, das Cmdlet aber keine Übereinstimmung finden kann. Dies ist darin begründet, dass die eigentliche Absicht ist, einen bekannten aktiven Prozess abzurufen. Gibt es keinen Prozess mit dieser ID, ist es sehr wahrscheinlich, dass die ID falsch ist oder der Prozess bereits beendet wurde:

Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process  <<<< -Id 99

Sie können den „Name“-Parameter des Get-Process-Cmdlets verwenden, um eine Teilmenge von Prozessen basierend auf dem Prozessnamen anzugeben. Der „Name“-Parameter akzeptiert mehrere Namen in einer durch Kommas getrennten Liste und unterstützt die Verwendung von Platzhaltern, sodass Sie Namensmuster eingeben können.

Beispielsweise ruft der folgende Befehl Prozesse ab, deren Namen mit „ex“ beginnen.

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 die .NET-Klasse System.Diagnostics.Process die Grundlage für PowerShell-Prozesse ist, gelten für diese einige der Konventionen, die von System.Diagnostics.Process verwendet werden. Eine dieser Konventionen ist, dass der Prozessname für eine ausführbare Datei nie das .exe am Ende des Namens der ausführbaren Datei enthält.

Get-Process akzeptiert auch mehrere Werte für den „Name“-Parameter.

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

Sie können den „ComputerName“-Parameter von Get-Process verwenden, um Prozesse auf Remotecomputern abzurufen. Beispielsweise ruft der folgende Befehl die PowerShell-Prozesse auf dem lokalen Computer (dargestellt durch „localhost“) und auf zwei Remotecomputern ab.

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 zu sehen, sie sind jedoch in der MachineName-Eigenschaft der Prozessobjekte gespeichert, die Get-Process zurückgibt. Im folgenden Befehl wird das Format-Table-Cmdlet verwendet, um die Eigenschaften „process ID“ , „ProcessName“ und „MachineName“ (ComputerName) der Prozessobjekte anzuzeigen.

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

Dieser komplexere Befehl fügt der standardmäßigen Get-Process-Anzeige die „MachineName“ -Eigenschaft hinzu.

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

PowerShell gibt Ihnen die Flexibilität zum Auflisten von Prozessen, aber wie sieht es mit dem Beenden eines Prozesses aus?

Das Cmdlet Stop-Process akzeptiert einen Namen oder eine ID als Angabe für den Prozess, den Sie beenden möchten. Inwieweit Sie Prozesse beenden können, hängt von Ihren Berechtigungen ab. Einige Prozesse können nicht beendet werden. Wenn Sie beispielsweise versuchen, den Prozess „idle“ zu beenden, erhalten Sie einen Fehler:

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

Mit dem Force-Parameter können Sie auch eine Eingabeaufforderung erzwingen. Dieser Parameter ist insbesondere nützlich, wenn Sie für die Angabe des Prozessnamens einen Platzhalter verwenden, denn möglicherweise ergibt sich versehentlich eine Übereinstimmung für einige Prozesse, die Sie nicht beenden möchten:

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

Komplexe Prozessverarbeitung ist möglich, indem Sie einige der Cmdlets zur Objektfilterung verwenden. Da ein Prozessobjekt eine Responding-Eigenschaft hat, die FALSE ist, wenn das Prozessobjekt nicht mehr reagiert, können Sie alle nicht reagierenden Anwendungen mit dem folgenden Befehl beenden:

Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process

Sie können die gleiche Vorgehensweise in anderen Situationen verwenden. Nehmen Sie beispielsweise an, dass automatisch eine sekundäre Anwendung für den Infobereich ausgeführt wird, wenn der Benutzer eine andere Anwendung startet. Sie stellen möglicherweise fest, dass dies in Terminaldienstesitzungen nicht ordnungsgemäß funktioniert, aber Sie möchten es in Sitzungen beibehalten, die an der Konsole des physischen Computers ausgeführt werden. Sitzungen, die mit dem Desktop eines physischen Computers verbunden sind, haben immer die Sitzungs-ID „0“, also können Sie alle Instanzen des Prozesses, die sich in anderen Sitzungen befinden, beenden, indem Sie Where-Object und die Prozesssitzungs-ID (SessionId) verwenden:

Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process

Das Cmdlet Stop-Process besitzt keinen ComputerName-Parameter. Daher müssen Sie das Invoke-Command-Cmdlet verwenden, um auf einem Remotecomputer den Befehl zu einem Stop-Process zu geben. Wenn Sie beispielsweise den PowerShell-Prozess auf dem Remotecomputer „Server01“ beenden möchten, geben Sie Folgendes ein:

Invoke-Command -ComputerName Server01 {Stop-Process Powershell}

Beenden alle anderen PowerShell-Sitzungen

Gelegentlich kann es nützlich sein, alle aktiven PowerShell-Sitzungen mit Ausnahme der aktuellen Sitzung zu beenden. Wenn eine Sitzung zu viele Ressourcen verwendet, oder wenn nicht mehr auf sie zugegriffen werden kann (sie wird möglicherweise remote oder in einer anderen Desktopsitzung ausgeführt), kann es sein, dass Sie sie nicht direkt beenden können. Wenn Sie aber versuchen, alle aktiven Sitzungen zu beenden, wird möglicherweise stattdessen die aktuelle Sitzung beendet.

Jede PowerShell-Sitzung hat die Umgebungsvariable „PID“, die die ID des jeweiligen PowerShell-Prozesses enthält. Sie können die $PID mit der ID jeder Sitzung abgleichen und nur die Windows PowerShell-Sitzungen beenden, die eine andere ID haben. Im folgenden Pipelinebefehl wird dies ausgeführt und die Liste der beendeten Sitzungen zurückgegeben (weil der PassThru-Parameter verwendet wird):

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 Debuggen von Prozessen sowie Warten auf Prozesse

PowerShell umfasst auch Cmdlets zum Starten (oder Neustarten) von Prozessen, zum Debuggen von Prozessen sowie zum Warten, bis ein Prozess abgeschlossen ist, bevor ein Befehl ausgeführt wird. Informationen zu diesen Cmdlets finden Sie im Cmdlet-Hilfethema für jedes Cmdlet.

Siehe auch