Správa procesů pomocí rutin Process

Tato ukázka platí jenom pro Windows PowerShell 5.1.

Rutiny Process v PowerShellu můžete použít ke správě místních a vzdálených procesů v PowerShellu.

Získávání procesů

Pokud chcete získat procesy spuštěné na místním počítači, spusťte Get-Process příkaz bez parametrů.

Konkrétní procesy můžete získat zadáním jejich názvů procesů nebo ID procesů. Následující příkaz získá proces nečinnosti:

Get-Process -id 0
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         16     0               0 Idle

I když je normální, aby rutiny v některých situacích nevracely žádná data, když zadáte proces podle id procesu, vygeneruje chybu, Get-Process pokud nenajde žádné shody, protože obvyklým záměrem je načíst známý spuštěný proces. Pokud neexistuje žádný proces s tímto ID, je pravděpodobné, že ID je nesprávné nebo že proces zájmu již ukončil:

Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process  <<<< -Id 99

Pomocí parametru Name rutiny Get-Process můžete zadat podmnožinu procesů na základě názvu procesu. Parametr Name může mít v seznamu odděleném čárkami několik názvů a podporuje použití zástupných znaků, takže můžete zadat vzory názvů.

Například následující příkaz získá proces, jehož názvy začínají na "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

Vzhledem k tomu, že třída .NET System.Diagnostics.Process je základem pro procesy PowerShellu, řídí se některými konvencemi používanými system.Diagnostics.Process. Jednou z těchto konvencí je, že název procesu spustitelného souboru nikdy neobsahuje .exe na konci názvu spustitelného souboru.

Get-Process také přijímá více hodnot pro parametr 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

Pomocí parametru Get-Process ComputerName můžete získat procesy na vzdálených počítačích. Následující příkaz například získá procesy PowerShellu na místním počítači (reprezentované "localhost") a na dvou vzdálených počítačích.

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

Názvy počítačů nejsou v tomto zobrazení zřejmé, ale jsou uloženy ve vlastnosti MachineName objektů procesu, které Get-Process vrací. Následující příkaz používá rutinu Format-Table k zobrazení ID procesu, ProcessName a MachineName (ComputerName) vlastností procesních objektů.

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

Tento složitější příkaz přidá vlastnost MachineName do standardního Get-Process zobrazení.

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

Zastavení procesů

PowerShell nabízí flexibilitu pro výpis procesů, ale co zastavení procesu?

Rutina Stop-Process vezme název nebo ID k určení procesu, který chcete zastavit. Vaše schopnost zastavit procesy závisí na vašich oprávněních. Některé procesy nelze zastavit. Pokud se například pokusíte zastavit nečinný proces, zobrazí se chyba:

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

Můžete také vynutit zobrazení výzvy pomocí parametru Confirm . Tento parametr je užitečný zejména v případě, že při zadávání názvu procesu použijete zástupný znak, protože se může omylem shodovat s některými procesy, které nechcete zastavit:

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

Složitá manipulace s procesy je možná pomocí některých rutin filtrování objektů. Vzhledem k tomu, že objekt Process má reagující vlastnost, která je true, když už nereaguje, můžete zastavit všechny nereagující aplikace pomocí následujícího příkazu:

Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process

Stejný přístup můžete použít i v jiných situacích. Předpokládejme například, že aplikace sekundární oznamovací oblasti se automaticky spustí, když uživatelé spustí jinou aplikaci. Možná zjistíte, že to nefunguje správně v relacích Terminálové služby, ale přesto ho chcete zachovat v relacích, které běží v konzole fyzického počítače. Relace připojené k ploše fyzického počítače mají vždy ID relace 0, takže můžete zastavit všechny instance procesu, které jsou v jiných relacích pomocí Where-Object a procesu, Id relace:

Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process

Rutina Stop-Process nemá parametr ComputerName . Proto ke spuštění příkazu pro zastavení procesu na vzdáleném počítači musíte rutinu Invoke-Command použít. Pokud chcete například zastavit proces PowerShellu na vzdáleném počítači Serveru01, zadejte:

Invoke-Command -ComputerName Server01 {Stop-Process Powershell}

Zastavení všech ostatních relací PowerShellu

Někdy může být užitečné zastavit všechny spuštěné relace PowerShellu kromě aktuální relace. Pokud relace používá příliš mnoho prostředků nebo je nepřístupná (může běžet vzdáleně nebo v jiné relaci plochy), je možné, že ji nebudete moct přímo zastavit. Pokud se ale pokusíte zastavit všechny spuštěné relace, může se místo toho ukončit aktuální relace.

Každá relace PowerShellu má proměnnou prostředí PID, která obsahuje ID procesu Windows PowerShellu. Můžete zkontrolovat $PID s ID každé relace a ukončit pouze relace Windows PowerShellu, které mají jiné ID. Následující příkaz kanálu to provede a vrátí seznam ukončených relací (kvůli použití parametru 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

Spuštění, ladění a čekání na procesy

PowerShell obsahuje také rutiny pro spuštění (nebo restartování), ladění procesu a čekání na dokončení procesu před spuštěním příkazu. Informace o těchto rutinách najdete v tématu nápovědy k rutinám pro každou rutinu.

Viz také