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.

Se även