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.