Поиск по сайту:

Управление процессами Windows с помощью PowerShell


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

Вы можете отобразить список доступных командлетов управления процессами в Windows 10 следующим образом:

Get-Command -Noun Process

  • Get-Process - получить список запущенных процессов Windows;

  • Start-Process - запустить процесс/программу;

  • Stop-Process - принудительно остановить (убить) процесс;

  • Debug-Process - отладка процесса;

  • Wat-Process - дождаться завершения процесса.

Get-Process: получение списка запущенных процессов

Командлет Get-Process отображает список процессов, запущенных на локальном компьютере.

По умолчанию отображаются следующие свойства запущенных процессов:

  • Дескрипторы - количество файловых дескрипторов (дескрипторов) ввода-вывода, открытых данным процессом;

  • NPM(K) - невыгружаемая память (невыгружаемый пул). Это размер данных процесса (в КБ), которые никогда не выгружаются на диск;

  • PM(K) - размер памяти процесса, которая может быть выгружена;

  • WS(K) - размер физической памяти (в КБ), используемой процессом (Рабочий набор);

  • ЦП - время процессора, используемое процессом (учитывается время на всех процессорах);

  • ID - уникальный идентификатор процесса;

  • SI (Session ID) - идентификатор сеанса процесса (0 означает запуск для всех сеансов, 1 - запуск для первого вошедшего в систему пользователя, 2 - запуск для второго вошедшего в систему пользователя и т.д.);

  • Имя процесса

Чтобы вывести список всех свойств нескольких процессов:

Get-Process cmd,excel,notep* | Format-List *

Вы можете отображать только конкретные свойства процесса, например имя (

ProcessName

), время начала (

StartTime

), заголовок окна процесса (

MainWindowTitle

), имя исполняемого файла (

Path

) и имя разработчика (

Company

):

Get-Process winword, notep* | Select-Object ProcessName, StartTime, MainWindowTitle, Path, Company|ft

Чтобы отобразить список запущенных пользовательских процессов с помощью графического интерфейса (фоновые и системные процессы отображаться не будут):

Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle

С помощью опции IncludeUserName вы можете отобразить имя пользователя (владельца), запустившего процесс:

Get-Process -Name winword -IncludeUserName

С использованием

Where-Object

, вы можете выбирать процессы по некоторым критериям. Например, выведем все процессы, использующие более 300 МБ ОЗУ, отсортируем их по убыванию использования памяти и покажем размер памяти в МБ, а не в КБ:

Get-Process| where-object {$_.WorkingSet -GT 300000*1024}|select processname,@{l="Used RAM(MB)"; e={$_.workingset / 1mb}} |sort "Used RAM(MB)" -Descending

Как мы говорили ранее, командлет Get-Process в параметре CPU содержит время процессора, используемое конкретным процессом в секундах. Чтобы отобразить процент использования процессора процессами (аналогично Диспетчеру задач), используйте эту функцию:

function Get-CPUUsagePercent
{
$CPUPercent = @{
Name = 'CPUPercent'
Expression = {
$TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
[Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
}
}
Get-Process | Select-Object -Property Name, $CPUPercent, Description | Sort-Object -Property CPUPercent -Descending | Select-Object -First 20
}
Get-CPUUsagePercent

Чтобы найти зависшие процессы (которые не отвечают), выполните следующую команду:

Get-Process | where-object {$_.Responding -eq $false}

Start-Process, Stop-Process: как запустить или остановить процессы с помощью PowerShell

Чтобы запустить новый процесс с помощью PowerShell, используется эта команда:

Start-Process -FilePath notepad

Если в папке нет исполняемого файла

$env:path

В переменной среды укажите полный путь к файлу:

Start-Process -FilePath 'C:\distr\app.exe'

Вы можете запустить программу и передать ей аргументы:

Start-Process -FilePath ping -ArgumentList "-n 10 10.1.56.21"

С помощью опции WindowStyle вы можете установить режим запуска окна процесса (обычный, свернутый, развернутый, скрытый). Например, чтобы запустить программу в развернутом окне и дождаться завершения процесса, выполните следующую команду:

Start-Process -FilePath tracert -ArgumentList "10.1.56.21" -wait -windowstyle Maximized

Используя командлет Stop-Process, вы можете остановить любой процесс. Например, чтобы закрыть все запущенные процессы блокнота:

Stop-Process -Name notepad

По умолчанию вам не предлагается подтвердить завершение процесса. Все процессы, соответствующие указанным критериям, будут остановлены. Чтобы иметь возможность подтвердить остановку процессов, добавьте параметр -Confirm:

Stop-Process -Name notepad.exe -Confirm

Кроме того, вы можете убить процесс следующим образом:

(Get-Process -Name cmd).Kill()

Из PowerShell вы можете принудительно остановить все приложения, которые не отвечают на диспетчер процессов Windows:

Get-Process | where-object {$_.Responding -eq $false}| Stop-Process

Используя PowerShell, вы можете автоматически перезапустить зависший или закрытый процесс.

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

Вы можете использовать

ComputerName

опция командлета Get-Process для управления процессами на удаленных компьютерах (должен быть включен и настроен WinRM).

Get-Process -ComputerName srv01, srv02, srv03| Format-Table -Property ProcessName, ID, MachineName

Мы занимаемся встроенными возможностями Get-Process для управления процессами на удаленных компьютерах. Функции удаленного взаимодействия PowerShell, доступные в

Invoke-Command

и

Enter-PSSession

командлеты здесь не рассматриваются.

Если вы хотите завершить процесс на удаленном компьютере, обратите внимание, что в командлете Stop-Process нет параметра -ComputerName. Чтобы остановить процесс на удаленном компьютере, вы можете использовать следующий код PowerShell:

$RemoteProcess = Get-Process -Name cmd -ComputerName srv01
Stop-Process -InputObject $RemoteProcess

Статьи по данной тематике