Processen beheren met proces-cmdlets

Dit voorbeeld is alleen van toepassing op Windows PowerShell 5.1.

U kunt de proces-cmdlets in PowerShell gebruiken om lokale en externe processen in PowerShell te beheren.

Processen verkrijgen

Voer een Get-Process zonder parameters uit om de processen op de lokale computer uit te voeren.

U kunt bepaalde processen ophalen door hun procesnamen of proces-id's op te geven. Met de volgende opdracht wordt het niet-actieve proces ophaalt:

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

Hoewel het normaal is dat cmdlets in sommige situaties geen gegevens retourneren, genereert wanneer u een proces opgeeft op basis van de ProcessId, Get-Process een fout als er geen overeenkomsten worden gevonden, omdat de gebruikelijke bedoeling is om een bekend actief proces op te halen. Als er geen proces met die id is, is de id waarschijnlijk onjuist of is het interesseproces al afgesloten:

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

U kunt de parameter Naam van de Get-Process cmdlet gebruiken om een subset van processen op te geven op basis van de procesnaam. De parameter Naam kan meerdere namen aannemen in een door komma's gescheiden lijst en ondersteunt het gebruik van jokertekens, zodat u naampatronen kunt typen.

Met de volgende opdracht wordt bijvoorbeeld verwerkt waarvan de namen beginnen met 'ex'.

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

Omdat de klasse .NET System.Diagnostics.Process de basis vormt voor PowerShell-processen, volgt deze enkele conventies die worden gebruikt door System.Diagnostics.Process. Een van deze conventies is dat de procesnaam voor een uitvoerbaar bestand nooit de .exe naam van het uitvoerbare bestand bevat aan het einde van de uitvoerbare naam.

Get-Process accepteert ook meerdere waarden voor de parameter Name.

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

U kunt de parameter Get-Process ComputerName gebruiken om processen op externe computers op te halen. Met de volgende opdracht worden bijvoorbeeld de PowerShell-processen op de lokale computer opgehaald (vertegenwoordigd door 'localhost') en op twee externe computers.

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

De computernamen zijn niet zichtbaar in deze weergave, maar worden opgeslagen in de eigenschap MachineName van de procesobjecten die Get-Process worden geretourneerd. De volgende opdracht gebruikt de Format-Table cmdlet om de eigenschappen proces-id, ProcessName en MachineName (ComputerName) van de procesobjecten weer te geven.

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

Met deze complexere opdracht wordt de eigenschap MachineName toegevoegd aan de standaardweergave Get-Process .

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

Processen stoppen

PowerShell biedt u flexibiliteit voor het weergeven van processen, maar hoe zit het met het stoppen van een proces?

De Stop-Process cmdlet gebruikt een naam of id om een proces op te geven dat u wilt stoppen. Uw mogelijkheid om processen te stoppen, is afhankelijk van uw machtigingen. Sommige processen kunnen niet worden gestopt. Als u bijvoorbeeld het niet-actieve proces probeert te stoppen, krijgt u een foutmelding:

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

U kunt ook vragen forceren met de parameter Bevestigen . Deze parameter is met name handig als u een jokerteken gebruikt bij het opgeven van de procesnaam, omdat u mogelijk per ongeluk overeenkomt met bepaalde processen die u niet wilt stoppen:

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

Complexe procesmanipulatie is mogelijk met behulp van een aantal cmdlets voor objectfiltering. Omdat een procesobject een eigenschap Reageren heeft die waar is wanneer het niet meer reageert, kunt u alle niet-reagerende toepassingen stoppen met de volgende opdracht:

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

U kunt dezelfde benadering gebruiken in andere situaties. Stel dat een secundaire toepassing voor het systeemvak automatisch wordt uitgevoerd wanneer gebruikers een andere toepassing starten. Mogelijk vindt u dat dit niet correct werkt in Terminal Services-sessies, maar u wilt deze toch bewaren in sessies die worden uitgevoerd op de console van de fysieke computer. Sessies die zijn verbonden met het bureaublad van de fysieke computer hebben altijd een sessie-id van 0, zodat u alle exemplaren van het proces die zich in andere sessies bevinden, kunt stoppen met behulp van Where-Object en het proces, SessionId:

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

De Stop-Process cmdlet heeft geen computernaamparameter . Als u daarom een opdracht voor een stopproces wilt uitvoeren op een externe computer, moet u de Invoke-Command cmdlet gebruiken. Als u bijvoorbeeld het PowerShell-proces op de externe Server01-computer wilt stoppen, typt u:

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

Alle andere PowerShell-sessies stoppen

Het kan af en toe handig zijn om alle actieve PowerShell-sessies te stoppen, behalve de huidige sessie. Als een sessie te veel resources gebruikt of niet toegankelijk is (deze kan extern of in een andere bureaubladsessie worden uitgevoerd), kunt u deze mogelijk niet rechtstreeks stoppen. Als u alle actieve sessies probeert te stoppen, kan de huidige sessie echter worden beëindigd.

Elke PowerShell-sessie heeft een omgevingsvariabele PID die de id van het Windows PowerShell-proces bevat. U kunt de $PID controleren op basis van de id van elke sessie en alleen Windows PowerShell-sessies met een andere id beëindigen. De volgende pijplijnopdracht doet dit en retourneert de lijst met beëindigde sessies (vanwege het gebruik van de parameter PassThru ):

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, foutopsporing en wachten op processen

PowerShell wordt ook geleverd met cmdlets om te starten (of opnieuw te starten), fouten in een proces op te sporen en te wachten tot een proces is voltooid voordat een opdracht wordt uitgevoerd. Zie het Help-onderwerp voor cmdlets voor elke cmdlet voor meer informatie over deze cmdlets.

Zie ook