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

См. также