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


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

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

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

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

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

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

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 -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

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

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

Вы также можете принудительно запрашивать параметр "Подтвердить ". Этот параметр особенно полезен, если при указании имени процесса используется подстановочный знак, так как вы можете случайно сопоставить некоторые процессы, которые вы не хотите остановить:

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

См. также