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

См. также




Содержание