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.