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.

Zobacz też