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
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor