Командлеты с существительным Process можно использовать в Windows PowerShell для управления локальными и удаленными процессами.
Получение процессов (Get-Process)
Для получения списка процессов локального компьютера запустите командлет Get-Process без параметров.
Для получения конкретных процессов можно указывать имена или ИД этих процессов. Следующая команда возвращает процесс Idle.
PS> 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 возвращает ошибку при отсутствии совпадений, потому что предполагается получение известного выполняемого процесса. Если процесс с указанным идентификатором не найден, вполне вероятно, что идентификатор задан неверно или искомый процесс был завершен.
PS> 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".
PS> 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 лежит в основе процессов Windows PowerShell, он следует соглашениям, которые используются процессом System.Diagnostics.Process. Одно из этих соглашений заключается в том, что имя процесса исполняемого файла никогда не включает расширение ".exe" в конце имени исполняемого файла.
Командлет Get-Process позволяет указывать несколько значений параметра Name.
PS> 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") и двух удаленных компьютеров.
PS> 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 используется для вывода свойств process ID, ProcessName и MachineName (ComputerName) объектов процессов.
PS> 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
Эта более сложная команда добавляет свойство MachineName в стандартный вывод Get-Process. Символ (`)(ASCII 96) в Windows PowerShell является знаком продолжения строки.
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
Остановка процессов (Stop-Process)
Оболочка Windows PowerShell предоставляет различные способы получить список процессов. Каким же образом процессы можно останавливать?
Командлету Stop-Process передается имя (свойство Name) или идентификатор (Id), определяющие процесс, который требуется остановить. Возможность остановки процесса зависит от имеющихся у пользователя разрешений. Некоторые процессы не могут быть остановлены. Например, при попытке остановить процесс бездействия системы, будет получена ошибка:
PS> 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 можно установить запрос подтверждения. Этот параметр особенно полезен в тех случаях, когда при указании имени процесса используется подстановочный знак: пользователь может случайно остановить некоторые процессы с похожим именем, которые останавливать не надо.
PS> 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}
Остановка всех других сеансов Windows PowerShell
Иногда становится необходимым остановить все запущенные сеансы Windows PowerShell, кроме текущего. Если в сеансе используется слишком много ресурсов или он недоступен (выполняется удаленно или в другом сеансе рабочего стола), то остановить его напрямую невозможно. Однако при попытке остановить все выполняемые сеансы текущий сеанс может быть просто завершен.
У каждого сеанса Windows PowerShell имеется переменная среды, PID, в которой содержится идентификатор процесса Windows PowerShell. Переменную $PID можно сверять с идентификаторами каждого сеанса и останавливать только сеансы Windows PowerShell с другим ИД. Приведенная ниже команда конвейера выполняет эту задачу и выводит список остановленных сеансов (поскольку используется параметр PassThru):
PS> 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
Запуск, отладка и ожидание процессов
В комплект Windows PowerShell также входят командлеты для запуска (перезапуска) процессов, отладки процессов и ожидания выполнения процессов перед запуском команды. Информацию об этих командлетах можно получить в разделах справки о конкретных командлетах.