Поделиться через


Управление процессами с помощью командлетов Process

Этот пример относится только к Windows PowerShell 5.1.

Командлеты process в PowerShell можно использовать для управления локальными и удаленными процессами в PowerShell.

Получение процессов

Чтобы получить процессы, выполняемые на локальном компьютере, запустите без Get-Process параметров.

Отдельные процессы можно получить, указав их имена или идентификаторы. Следующая команда возвращает процесс Idle:

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

Хотя командлеты не возвращают данные в некоторых ситуациях, при указании процесса с помощью ProcessId возникает ошибка, если она не находит совпадений, Get-Process так как обычное намерение — получить известный выполняющийся процесс. Если с этим идентификатором нет процесса, скорее всего, идентификатор неверный или что процесс интереса уже завершился:

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

Параметр Name командлета Get-Process можно использовать для указания подмножества процессов на основе имени процесса. Параметр Name может принимать несколько имен в виде списка с разделителями-запятыми и поддерживает использование подстановочных знаков, что позволяет задавать шаблоны имен.

Например, следующая команда возвращает процессы, имена которых начинаются с "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

Так как класс .NET System.Diagnostics.Process является основой для процессов PowerShell, он следует некоторым соглашениям, используемым System.Diagnostics.Process. Одно из этих соглашений заключается в том, что имя процесса для исполняемого файла никогда не включает .exe в конец имени исполняемого файла.

Get-Process также принимает несколько значений для параметра 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

Параметр ComputerName командлета Get-Process можно использовать для получения процессов на удаленных компьютерах. Например, следующая команда получает процессы PowerShell на локальном (представленным "localhost") и двух удаленных компьютерах.

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

Имена компьютеров не очевидны в этом отображении, но они хранятся в свойстве MachineName объектов процесса, возвращаемых Get-Process . Следующая команда использует командлет Format-Table для отображения свойств ID, ProcessName и MachineName (ComputerName) объектов процесса.

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

Эта более сложная команда добавляет в стандартные отображаемые данные Get-Process свойство MachineName.

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

Остановка процессов

PowerShell обеспечивает гибкость для перечисления процессов, но как насчет остановки процесса?

Командлет Stop-Process принимает имя или идентификатор , чтобы указать процесс, который требуется остановить. Возможность остановки процессов зависит от ваших разрешений. Некоторые процессы не могут быть остановлены. Например, при попытке остановить неактивный процесс возникает ошибка:

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

Можно также принудительно вывести запрос с помощью параметра Confirm. Этот параметр особенно полезен, если вы используете дикую карта при указании имени процесса, так как вы можете случайно сопоставить некоторые процессы, которые вы не хотите остановить:

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

Сложную обработку процессов можно реализовать с помощью командлетов фильтрации объектов. Так как объект Process имеет свойство Responding , которое имеет значение true, если оно больше не отвечает, можно остановить все неответственные приложения с помощью следующей команды:

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

Аналогичный подход возможен и в других ситуациях. Предположим, например, что приложение дополнительной области уведомлений запускается автоматически при открытии другого приложения. Вы можете обнаружить, что это не работает правильно в сеансах служб терминалов, но вы по-прежнему хотите сохранить его в сеансах, работающих на консоли физического компьютера. Сеансы, подключенные к рабочему столу физического компьютера, всегда имеют идентификатор сеанса 0, поэтому можно остановить все экземпляры процесса, которые находятся в других сеансах с помощью Where-Object и процесса, SessionId:

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

Командлет Stop-Process не имеет параметра ComputerName . Поэтому для выполнения команды остановки процесса на удаленном компьютере необходимо использовать командлет Invoke-Command. Например, чтобы остановить процесс PowerShell на удаленном компьютере Server01, введите:

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

Остановка всех других сеансов PowerShell

Иногда может быть полезно остановить все сеансы PowerShell, отличные от текущего сеанса. Если сеанс использует слишком много ресурсов или недоступен (он может выполняться удаленно или в другом сеансе), возможно, остановить его напрямую не получится. При попытке остановить все выполняющиеся сеансы может быть завершен текущий сеанс.

Каждый сеанс PowerShell содержит идентификатор идентификатора идентификатора среды, содержащего идентификатор процесса Windows PowerShell. Вы можете проверка $PID по идентификатору каждого сеанса и завершить только сеансы Windows PowerShell с другим идентификатором. Следующая команда конвейера выполняет это и возвращает список завершенных сеансов (из-за использования параметра 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

Запуск, отладка и ожидание процессов

PowerShell также поставляется с командлетами для запуска (или перезапуска), отладки процесса и ожидания завершения процесса перед выполнением команды. Дополнительные сведения об этих командлетах см. в разделах справки по каждому из них.

См. также