Управление процессами с помощью командлетов 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 также поставляется с командлетами для запуска (или перезапуска), отладки процесса и ожидания завершения процесса перед выполнением команды. Дополнительные сведения об этих командлетах см. в разделах справки по каждому из них.
См. также
PowerShell