Zarządzanie procesami za pomocą poleceń cmdlet procesu
Ten przykład dotyczy tylko programu Windows PowerShell 5.1.
Polecenia cmdlet Procesu w programie PowerShell umożliwiają zarządzanie procesami lokalnymi i zdalnymi w programie PowerShell.
Pobieranie procesów
Aby pobrać procesy uruchomione na komputerze lokalnym, uruchom polecenie Get-Process
bez parametrów.
Określone procesy można uzyskać, określając ich nazwy procesów lub identyfikatory procesów. Następujące polecenie pobiera proces bezczynności:
Get-Process -id 0
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
0 0 0 16 0 0 Idle
Mimo że polecenia cmdlet nie zwracają żadnych danych w niektórych sytuacjach, podczas określania procesu przez jego identyfikator ProcessId generuje błąd, Get-Process
jeśli nie znajdzie dopasowań, ponieważ zwykle celem jest pobranie znanego uruchomionego procesu. Jeśli nie ma procesu z tym identyfikatorem, prawdopodobnie identyfikator jest niepoprawny lub że proces zainteresowania został już zakończony:
Get-Process -Id 99
Get-Process : No process with process ID 99 was found.
At line:1 char:12
+ Get-Process <<<< -Id 99
Możesz użyć parametru Get-Process
Name polecenia cmdlet, aby określić podzbiór procesów na podstawie nazwy procesu. Parametr Name może przyjmować wiele nazw na liście rozdzielanej przecinkami i obsługuje użycie symboli wieloznacznych, dzięki czemu można wpisać wzorce nazw.
Na przykład następujące polecenie pobiera proces, którego nazwy zaczynają się od "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
Ponieważ klasa .NET System.Diagnostics.Process jest podstawą procesów programu PowerShell, jest zgodna z niektórymi konwencjami używanymi przez System.Diagnostics.Process. Jedną z tych konwencji jest to, że nazwa procesu pliku wykonywalnego nigdy nie zawiera .exe
wartości na końcu nazwy pliku wykonywalnego.
Get-Process
Akceptuje również wiele wartości parametru 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
Parametr ComputerName Get-Process
polecenia umożliwia pobieranie procesów na komputerach zdalnych. Na przykład następujące polecenie pobiera procesy programu PowerShell na komputerze lokalnym (reprezentowanym przez "localhost") i na dwóch komputerach zdalnych.
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
Nazwy komputerów nie są widoczne na tym ekranie, ale są przechowywane we właściwości MachineName zwracanych Get-Process
obiektów procesu. Następujące polecenie używa Format-Table
polecenia cmdlet do wyświetlania identyfikatora procesu, właściwości ProcessName i MachineName (ComputerName) obiektów procesu.
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
To bardziej złożone polecenie dodaje właściwość MachineName do standardowego Get-Process
wyświetlania.
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
Zatrzymywanie procesów
Program PowerShell zapewnia elastyczność wyświetlania listy procesów, ale co z zatrzymywaniem procesu?
Polecenie Stop-Process
cmdlet przyjmuje nazwę lub identyfikator, aby określić proces, który chcesz zatrzymać. Możliwość zatrzymywania procesów zależy od uprawnień. Nie można zatrzymać niektórych procesów. Jeśli na przykład spróbujesz zatrzymać proces bezczynności, wystąpi błąd:
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
Możesz również wymusić monit przy użyciu parametru Confirm . Ten parametr jest szczególnie przydatny, jeśli podczas określania nazwy procesu jest używany symbol wieloznaczny, ponieważ może być przypadkowo zgodny z niektórymi procesami, których nie chcesz zatrzymać:
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
Złożone manipulowanie procesami jest możliwe za pomocą niektórych poleceń cmdlet filtrowania obiektów. Ponieważ obiekt Process ma właściwość Odpowiada , która ma wartość true, gdy nie odpowiada, możesz zatrzymać wszystkie nieodpowiadujące aplikacje za pomocą następującego polecenia:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process
Możesz użyć tego samego podejścia w innych sytuacjach. Załóżmy na przykład, że aplikacja obszaru powiadomień pomocniczych jest uruchamiana automatycznie, gdy użytkownicy uruchamiają inną aplikację. Może się okazać, że nie działa to poprawnie w sesjach usług terminalowych, ale nadal chcesz zachować je w sesjach uruchamianych w konsoli komputera fizycznego. Sesje połączone z komputerem fizycznym zawsze mają identyfikator sesji 0, dzięki czemu można zatrzymać wszystkie wystąpienia procesu, które znajdują się w innych sesjach przy użyciu i Where-Object
procesu SessionId:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process
Polecenie Stop-Process
cmdlet nie ma parametru ComputerName . W związku z tym, aby uruchomić polecenie zatrzymania procesu na komputerze zdalnym, należy użyć Invoke-Command
polecenia cmdlet . Aby na przykład zatrzymać proces programu PowerShell na komputerze zdalnym Server01, wpisz:
Invoke-Command -ComputerName Server01 {Stop-Process Powershell}
Zatrzymywanie wszystkich innych sesji programu PowerShell
Czasami przydatne może być zatrzymanie wszystkich uruchomionych sesji programu PowerShell innych niż bieżąca sesja. Jeśli sesja używa zbyt wielu zasobów lub jest niedostępna (może być uruchomiona zdalnie lub w innej sesji pulpitu), możesz nie być w stanie bezpośrednio go zatrzymać. Jeśli jednak spróbujesz zatrzymać wszystkie uruchomione sesje, zamiast tego może zostać zakończona bieżąca sesja.
Każda sesja programu PowerShell ma zmienną środowiskową PID zawierającą identyfikator procesu programu Windows PowerShell. Możesz sprawdzić $PID względem identyfikatora każdej sesji i zakończyć tylko sesje programu Windows PowerShell, które mają inny identyfikator. Następujące polecenie potoku wykonuje to polecenie i zwraca listę zakończonych sesji (ze względu na użycie 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
Uruchamianie, debugowanie i oczekiwanie na procesy
Program PowerShell zawiera również polecenia cmdlet do uruchamiania (lub ponownego uruchamiania), debugowania procesu i oczekiwania na ukończenie procesu przed uruchomieniem polecenia. Aby uzyskać informacje o tych poleceniach cmdlet, zobacz temat pomocy dotyczącej poleceń cmdlet dla każdego polecenia cmdlet.