Processen beheren met proces-cmdlets

U kunt de proces-cmdlets in Windows PowerShell lokale en externe processen in de Windows PowerShell.

Processen verkrijgen (Get-Process)

Als u de processen wilt uitvoeren op de lokale computer, moet u een Get-Process uitvoeren zonder parameters.

U kunt bepaalde processen krijgen door de procesnamen of proces-ID's op te geven. Met de volgende opdracht wordt het niet-actieve proces op de haalt:

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 door de ProcessId een fout als er geen overeenkomsten worden gevonden, omdat de gebruikelijke intentie is om een bekend actief proces op te Get-Process halen. Als er geen proces is met die id, is de id waarschijnlijk onjuist of is het proces van belang 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 cmdlet gebruiken om een subset van processen op te geven Get-Process op basis van de procesnaam. De parameter Naam kan meerdere namen in een door komma's gescheiden lijst nemen en ondersteunt het gebruik van jokertekens, zodat u naampatronen kunt typen.

De volgende opdracht haalt bijvoorbeeld het proces op 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 is voor Windows PowerShell-processen, volgt deze een aantal van de conventies die worden gebruikt door System.Diagnostics.Process. Een van deze conventies is dat de procesnaam voor een uitvoerbaar bestand nooit de '.exe' aan het einde van de naam van het uitvoerbare bestand bevat.

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 ComputerName van gebruiken om Get-Process processen op externe computers op te halen. Met de volgende opdracht worden bijvoorbeeld de PowerShell-processen op de lokale computer (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 duidelijk in deze weergave, maar ze worden opgeslagen in de eigenschap MachineName van de procesobjecten die Get-Process worden retourneert. Met de volgende opdracht wordt de Format-Table cmdlet gebruikt om de proces-id, de eigenschappen 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 Get-Process standaardweergave.

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 (stopproces)

Windows PowerShell biedt u flexibiliteit om processen weer te geven, 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 probeert het niet-actieve proces 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 forcen met de parameter Bevestigen. Deze parameter is met name handig als u een jokerteken gebruikt bij het opgeven van de procesnaam, omdat u per ongeluk bepaalde processen kunt vinden 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 procesbewerking is mogelijk door enkele cmdlets voor objectfiltering te gebruiken. Omdat een procesobject een eigenschap Responding 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 bijvoorbeeld dat een secundaire toepassing voor het meldingengebied automatisch wordt uitgevoerd wanneer gebruikers een andere toepassing starten. Mogelijk komt u erachter dat dit niet goed werkt in Terminal Services-sessies, maar u wilt deze wel bewaren in sessies die worden uitgevoerd op de fysieke computerconsole. 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 met en het Where-Object proces, SessionId stoppen kunt:

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

De Stop-Process cmdlet heeft geen ComputerName parameter. Daarom moet u de cmdlet gebruiken om een stopprocesopdracht uit te voeren op een Invoke-Command externe computer. Als u bijvoorbeeld het PowerShell-proces op de externe computer Server01 wilt stoppen, typt u:

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

Alle andere Windows PowerShell stoppen

Het kan af en toe handig zijn om te kunnen stoppen met alle Windows PowerShell andere sessies dan 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 direct stoppen. Als u echter alle lopende sessies wilt stoppen, kan de huidige sessie worden beëindigd.

Elke Windows PowerShell heeft een omgevingsvariabele PID die de id van het Windows PowerShell bevat. U kunt de $PID op 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, debuggen en wachten op processen

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

Zie ook