Dela via


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.

Se även