Hantera processer med process-cmdletar
Det här exemplet gäller endast för Windows PowerShell 5.1.
Du kan använda process-cmdletar i PowerShell för att hantera lokala processer och fjärrprocesser i PowerShell.
Hämta processer
Kör en Get-Process
utan parametrar för att få igång processerna på den lokala datorn.
Du kan hämta specifika processer genom att ange deras processnamn eller process-ID:n. Följande kommando hämtar inaktivitetsprocessen:
Get-Process -id 0
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 0 0 16 0 0 Idle
Även om det är normalt att cmdletar inte returnerar några data i vissa situationer, genererar när du anger en process med dess ProcessIdGet-Process
ett fel om den inte hittar några matchningar, eftersom den vanliga avsikten är att hämta en känd process som körs. Om det inte finns någon process med det ID:t är det troligt att ID:t är felaktigt eller att intresseprocessen redan har avslutats:
Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process <<<< -Id 99
Du kan använda parametern Namn för cmdleten Get-Process
för att ange en delmängd av processer baserat på processnamnet. Parametern Namn kan ta flera namn i en kommaavgränsad lista och stöder användning av jokertecken, så att du kan skriva namnmönster.
Följande kommando hämtar till exempel en process vars namn börjar med "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
Eftersom klassen .NET System.Diagnostics.Process är grunden för PowerShell-processer följer den några av de konventioner som används av System.Diagnostics.Process. En av dessa konventioner är att processnamnet för en körbar fil aldrig innehåller .exe
i slutet av det körbara namnet.
Get-Process
accepterar också flera värden för parametern Namn.
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
Du kan använda parametern Get-Process
ComputerName för för att hämta processer på fjärrdatorer. Följande kommando hämtar till exempel PowerShell-processerna på den lokala datorn (representeras av "localhost") och på två fjärrdatorer.
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
Datornamnen visas inte i den här visningen, men de lagras i egenskapen MachineName för processobjekten som Get-Process
returneras. Följande kommando använder cmdleten Format-Table
för att visa process-ID,ProcessName- och MachineName-egenskaperna (ComputerName) för processobjekten.
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
Det här mer komplexa kommandot lägger till egenskapen MachineName i standardvisningen 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
Stoppa processer
PowerShell ger dig flexibilitet för att lista processer, men hur är det med att stoppa en process?
Cmdleten Stop-Process
tar ett namn eller ID för att ange en process som du vill stoppa. Din möjlighet att stoppa processer beror på dina behörigheter. Vissa processer kan inte stoppas. Om du till exempel försöker stoppa inaktivitetsprocessen får du ett fel:
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
Du kan också framtvinga frågor med parametern Bekräfta . Den här parametern är särskilt användbar om du använder ett jokertecken när du anger processnamnet, eftersom du av misstag matchar vissa processer som du inte vill stoppa:
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
Komplex processmanipulering är möjlig med hjälp av några av cmdletarna för objektfiltrering. Eftersom ett processobjekt har en svararegenskap som är sann när det inte längre svarar, kan du stoppa alla program som inte svarar med följande kommando:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
Du kan använda samma metod i andra situationer. Anta till exempel att ett sekundärt meddelandeområdesprogram körs automatiskt när användare startar ett annat program. Du kanske upptäcker att detta inte fungerar korrekt i Terminal Services-sessioner, men du vill fortfarande behålla det i sessioner som körs på den fysiska datorkonsolen. Sessioner som är anslutna till den fysiska datorns skrivbord har alltid ett sessions-ID på 0, så du kan stoppa alla instanser av processen som finns i andra sessioner med hjälp Where-Object
av och processen, SessionId:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
Cmdleten Stop-Process
har ingen Parameter för ComputerName . Därför måste du använda cmdleten Invoke-Command
för att köra ett stoppprocesskommando på en fjärrdator. Om du till exempel vill stoppa PowerShell-processen på server01-fjärrdatorn skriver du:
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Stoppa alla andra PowerShell-sessioner
Det kan ibland vara användbart att kunna stoppa alla powershell-sessioner som körs förutom den aktuella sessionen. Om en session använder för många resurser eller är otillgänglig (den kan köras via fjärranslutning eller i en annan skrivbordssession) kanske du inte kan stoppa den direkt. Om du försöker stoppa alla sessioner som körs kan dock den aktuella sessionen avslutas i stället.
Varje PowerShell-session har en miljövariabel-PID som innehåller ID :t för Windows PowerShell-processen. Du kan kontrollera $PID mot ID:t för varje session och endast avsluta Windows PowerShell-sessioner som har ett annat ID. Följande pipelinekommando gör detta och returnerar listan över avslutade sessioner (på grund av användningen av parametern 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
Starta, felsöka och vänta på processer
PowerShell levereras också med cmdletar för att starta (eller starta om), felsöka en process och vänta tills en process har slutförts innan du kör ett kommando. Information om dessa cmdletar finns i cmdlet-hjälpavsnittet för varje cmdlet.