Hantera processer med Process-cmdletar
Du kan använda process-cmdlets i Windows PowerShell för att hantera lokala processer och fjärrprocesser i Windows PowerShell.
Hämta processer (Get-Process)
Kör en utan parametrar för att köra processerna på den Get-Process lokala datorn.
Du kan hämta specifika processer genom att ange deras processnamn eller process-ID:er. 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 cmdlets inte returnerar några data i vissa situationer, genererar när du anger en process med dess ProcessId ett fel om den inte hittar några matchningar, eftersom den vanliga avsikten är att hämta en känd process som Get-Process körs. Om det inte finns någon process med detta ID är det troligt att ID:t är felaktigt eller att den intressanta processen 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 Name för Get-Process cmdleten för att ange en delmängd av processer baserat på processnamnet. Parametern Namn kan ta flera namn i en kommaavgränsad lista och den 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 Windows PowerShell processer följer den några av konventionerna 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 namnet på den körbara filen.
Get-Process accepterar också flera värden för parametern 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
Du kan använda parametern ComputerName för Get-Process 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 är inte uppenbara i den här visningen, men de lagras i egenskapen MachineName för processobjekten som Get-Process returneras. Följande kommando använder cmdleten för att visa Format-Table 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 till Get-Process standardvisningen.
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 (stop-process)
Windows PowerShell ger dig flexibilitet för att lista processer, men hur är det med att stoppa en process?
Stop-ProcessCmdleten 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 felmeddelande:
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å tvinga fram uppmaningar 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 kan matcha 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öjligt med hjälp av några av cmdletarna för objektfiltrering. Eftersom ett Process-objekt har egenskapen Svarar 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 sessions-ID:t 0, så du kan stoppa alla instanser av processen som finns i andra sessioner med hjälp av och Where-Object processen SessionId:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
Stop-ProcessCmdleten har inte parametern ComputerName. Om du vill köra ett stoppprocesskommando på en fjärrdator måste du därför använda Invoke-Command cmdleten . Om du till exempel vill stoppa PowerShell-processen på fjärrdatorn Server01 skriver du:
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Stoppa alla andra Windows PowerShell sessioner
Ibland kan det vara bra att kunna stoppa alla körningar Windows PowerShell andra sessioner än den aktuella sessionen. Om en session använder för många resurser eller inte är tillgänglig (den kan köras via en 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 Windows 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
Windows PowerShell levereras också med cmdlets 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 cmdlets finns i cmdlet-hjälpavsnittet för varje cmdlet.