Перейти к содержимому

Как задать параметр starttime powershell

  • автор:

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

date

27.07.2021

user

itpro

directory

PowerShell, Windows 10, Windows Server 2016

comments

комментариев 7

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

Список доступных командлетов управления процессами в Windows 10 можно вывести так:

Get-Command –Noun Process

командлеты управления процессами в powershell

  • Get-Process – получить список запущенных процессов;
  • Start-Process – запустить процесс/программу;
  • Stop-Process – принудительно остановить процесс;
  • Debug-Process – используется для отладки процессов;
  • Wait-Process – используется для ожидания окончания процесса.

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

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

Get-Process список запушенных процессов

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

  • Handles – количество дескрипторов ввода — вывода, которые отрыл данный процесс;
  • NPM(K) — Non-paged memory (невыгружаемый пул). Размер данных процесса (в Кб.), которые никогда не попадают в файл подкачки на диск;
  • PM(K) – размер памяти процесса, которая может быть выгружена на диск;
  • WS(K) – размер физической памяти в Кб, используемой процессом (working set).
  • CPU(s) – процессорное время, использованное процессом (учитывается время на всех CPU);
  • ID — идентификатор процесса;
  • SI (Session ID) – идентификатор сеанса процесса (0 — запущен для всех сессий, 1 – для первого залогиненого пользователя, 2 — для второго и т.д.);
  • ProcessName – имя процесса.

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

Get-Process winword, notep* | Format-List *

Можно вывести только определенный свойства процессов. Например, имя (ProcessName) время запуска (StartTime), заголовок окна процесса (MainWindowTitle), имя исполняемого файла (Path) и наименование разработчика (Company):

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

вывести подроюную информацию о запущенных процессах

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

Get-Process | Where-Object | Format-Table Id, Name, mainWindowtitle

Get-Process | Where-Object <<img decoding=

.mainWindowTitle — процессы с графическими окнами» width=»» />.mainWindowTitle — процессы с графическими окнами» width=»» />

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

Get-Process -Name winword -IncludeUserName

С помощью Where-Object можно выбрать процессы в соответствии с заданными критериями. Например, выведем все процессы, которые используются более 200 Мб оперативной памяти, отсортируем процессы в порядке убывания используемого объема RAM, размер памяти из Кб преобразуем в Мб:

Get-Process найти процессы, которые занимают более 200 Мб оперативной памяти

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

function Get-CPUPercent
$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
>

PowerShellс скрипт с Get-Process выводит процент использования CPU процессами

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

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

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

Start-Process -FilePath tracert -ArgumentList «192.168.1.11» –wait -windowstyle Maximized

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

Stop-Process -Name notepad

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

Stop-Process -Name notepad.exe -Confirm

Stop-Process завершить процесс powershell

Также завершить процесс можно так:

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

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

Get-Process | where-object | Stop-Process

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

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

Get-Process -ComputerName dc01, dc02| Format-Table -Property ProcessName, ID, MachineName

Мы рассматриваем встроенные возможности комнадлета Get-Process для управления процессами на удаленных компьютерах. Здесь не учитываются возможности PowerShell Remoting, которые доступны в командлетах Invoke-Command и Enter-PSSession.

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

$RProc = Get-Process -Name notepad -ComputerName dc01
Stop-Process -InputObject $RProc

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Что такое Windows PowerShell и с чем его едят? Часть 4: Работа с объектами, собственные классы

Текстовый вывод команд в окне интерпретатора PowerShell — всего лишь способ отображения информации в пригодном для человеческого восприятия виде. На самом деле среда ориентирована на работу с объектами: командлеты и функции получают их на входе и возвращают на выходе, а доступные в интерактивном режиме и в сценариях типы переменных базируются на классах .NET. В четвертой статье цикла мы изучим работу с объектами более детально.

Оглавление:

Объекты в PowerShell

Напомним, что объект — это совокупность полей данных (свойств, событий и т.д.) и способов их обработки (методов). Его структура задается типом, который как правило базируется на использующихся в унифицированной платформе .NET Core классах. Также есть возможность работать с объектами COM, CIM (WMI) и ADSI. Свойства и методы нужны для выполнения различных действий над данными, кроме того в PowerShell объекты можно передавать как аргументы в функции и командлеты, присваивать их значения переменным, а также существует механизм композиции команд (конвейер или pipeline). Каждая команда в конвейере передает свой вывод следующей поочередно — объект за объектом. Для обработки можно использовать скомпилированные командлеты или создавать собственные расширенные функции, чтобы производить различные манипуляции с объектами в конвейере: фильтрацию, сортировку, группировку и даже изменение их структуры. Передача данных в таком виде имеет серьезное преимущество: принимающей команде не нужно заниматься синтаксическим разбором потока байтов (текста), вся нужная информация легко извлекается с помощью обращения к соответствующим свойствам и методам.

Просмотр структуры объектов

Для примера запустим командлет Get-Process, позволяющий получить информацию о работающих в системе процессах:

Он выведет на экран некие отформатированные текстовые данные, не дающие представления о свойствах возвращаемых объектов и их методах. Для тонкого препарирования вывода необходимо научиться исследовать структуру объектов и в этом нам поможет командлет Get-Member:

Get-Process | Get-Member

Здесь мы уже видим тип и структуру, а с помощью дополнительных параметров можем, например, вывести только свойства попавшего на вход объекта:

Get-Process | Get-Member -MemberType Property

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

Фильтрация объектов

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

Where-Object

Результатом выполнения блока сценария в операторных скобках должно быть логические значение. Если оно истинно ($true) попавший на вход командлету Where-Object объект будет передан по конвейеру дальше, в противном случае (значение $false) он будет удален. Для примера выведем список остановленных служб Windows Server, т.е. таких, у которых свойство Status имеет значение «Stopped»:

Get-Service | Where-Object

Здесь мы снова видим текстовое представление, но при желании понять тип и внутреннее устройство проходящих через конвейер объектов нетрудно:

Get-Service | Where-Object | Get-Member

Сортировка объектов

При конвейерной обработке объектов часто возникает необходимость их сортировки. В командлет Sort-Object передаются имена свойств (ключей сортировки), а он возвращает упорядоченные по их значениям объекты. Вывод запущенных процессов несложно отсортировать по затраченному процессорному времени (свойство cpu):

Get-Process | Sort-Object –Property cpu

Параметр -Property при вызове командлета Sort-Object можно не указывать — он используется по умолчанию. Для обратной сортировки применяется параметр -Descending:

Get-Process | Sort-Object cpu -Descending

Выделение объектов и их частей

Командлет Select-Object позволяет выделить определенное количество объектов в начале или в конце конвейера с помощью параметров -First или -Last. С его помощью можно выбрать единичные объекты или определенные свойства, а также создать на их основе новые объекты. Разберем работу командлета на простых примерах.

Следующая команда выводит информацию о 10 процессах, потребляющих максимальный объем оперативной памяти (свойство WS):

Get-Process | Sort-Object WS -Descending | Select-Object -First 10

Можно выделить только определенные свойства проходящих через конвейер объектов и создать на их основе новые:

Get-Process | Select-Object ProcessName, Id -First 1

В результате работы конвейера мы получим новый объект, структура которого будет отличаться от структуры возвращаемых командлетом Get-Process. Убедимся в этом при помощи Get-Member:

Get-Process | Select-Object ProcessName, Id -First 1 | Get-Member

Обратите внимание, что Select-Object возвращает единичный объект (-First 1), у которого всего два указанных нами поля: их значения были скопированы из первого переданного в конвейер командлетом Get-Process объекта. На использовании Select-Object основан один из способов создания объектов в сценариях PowerShell:

$obj = Get-Process | Select-Object ProcessName, Id -First 1 $obj.GetType()

С помощью Select-Object можно добавлять объектам вычисляемые свойства, которые необходимо представить в виде хэш-таблицы. При этом значение ее первого ключа соответствует имени свойства, а значение второго — значению свойства для текущего элемента конвейера:

Get-Process | Select-Object -Property ProcessName, @>

Посмотрим на структуру проходящих через конвейер объектов:

Get-Process | Select-Object -Property ProcessName, @> | Get-Member

ForEach-Object, Group-Object и Measure-Object

Для работы с объектами существуют и другие командлеты. Для примера расскажем о трех наиболее полезных:

ForEach-Object позволяет выполнить код на языке PowerShell для каждого объекта в конвейере:

ForEach-Object

Group-Object группирует объекты по значению свойства:

Group-Object PropertyName

Если запустить его с параметром -NoElement, можно узнать количество элементов в группах.

Measure-Object агрегирует различные сводные параметры по значениям полей объектов в конвейере (вычисляет сумму, а также находит минимальное, максимальное или среднее значение):

Measure-Object -Property PropertyName -Minimum -Maximum -Average -Sum

Обычно рассмотренные командлеты используются в интерактивном режиме, а в скриптах чаще создаются функции с блоками Begin, Process и End.

Создание объектов .NET и COM (New-Object)

Есть множество программных компонентов с интерфейсами .NET Core и COM, которые пригодятся системным администраторам. С помощью класса System.Diagnostics.EventLog можно управлять системными журналами непосредственно из Windows PowerShell. Разберем пример создания экземпляра этого класса при помощи командлета New-Object с параметром -TypeName:

New-Object -TypeName System.Diagnostics.EventLog

Поскольку мы не указали определенный журнал событий, полученный экземпляр класса не содержит данных. Чтобы это изменить, необходимо во время его создания вызвать специальный метод-конструктор при помощи параметра -ArgumentList. Если мы хотим получить доступ к журналу приложений, в конструктор следует передать строку «Application» в качестве аргумента:

$AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application $AppLog

Обратите внимание: выходные данные команды мы сохранили в переменной $AppLog. Хотя в интерактивном режиме обычно используются конвейеры, написание сценариев часто требует сохранения ссылки на объект. Кроме того основные классы .NET Core содержатся в пространстве имен System: PowerShell по умолчанию ищет в нем указанные типы, поэтому написание Diagnostics.EventLog вместо System.Diagnostics.EventLog вполне корректно.

Для работы с журналом можно обращаться к соответствующим методам:

$AppLog | Get-Member -MemberType Method

Скажем очищается он методом Clear() при наличии прав доступа:

$AppLog.Clear()

Командлет New-Object применяется и для работы с СОМ-компонентами. Их довольно много — от поставляемых с сервером сценариев Windows библиотек до приложений ActiveX, таких, например, как Internet Explorer. Чтобы создать СОМ-объект, требуется задать параметр -ComObject с программным идентификатора ProgId нужного класса:

New-Object -ComObject WScript.Shell New-Object -ComObject WScript.Network New-Object -ComObject Scripting.Dictionary New-Object -ComObject Scripting.FileSystemObject

Для создания собственных объектов с произвольной структурой использование New-Object выглядит слишком архаичным и громоздким, этот командлет используется для работы с внешними по отношению к PowerShell программными компонентами. В следующих статьях этот вопрос будет разобран более подробно. Помимо объектов .NET и COM мы также изучим объекты CIM (WMI) и ADSI.

Вызов статических методов

Экземпляры некоторых классов .NET Core создать невозможно: к их числу относятся System.Environment и System.Math. Они являются статическими и содержат только статические свойства и методы. По сути это справочные библиотеки, которые используются без создания объектов. Сослаться на статический класс можно через литерал, заключив имя типа в квадратные скобки. При этом если посмотреть на структуру объекта с помощью Get-Member, мы увидим тип System.RuntimeType вместо System.Environment:

[System.Environment] | Get-Member

Для просмотра только статических элементов нужно вызвать Get-Member с параметром -Static (обратите внимание на тип объекта):

[System.Environment] | Get-Member -Static

Для доступа к статическим свойствам и методам используются два идущих подряд двоеточия вместо точки после литерала:

[System.Environment]::OSVersion
$test=[System.Math]::Sqrt(25) $test $test.GetType()

Тип PSCustomObject

Среди многочисленных доступных в PowerShell типов данных отдельно стоит упомянуть PSCustomObject, предназначенный для хранения объектов с произвольной структурой. Создание такого объекта с помощью командлета New-Object считается классическим, но громоздким и устаревшим способом:

$object = New-Object –TypeName PSCustomObject -Property @

Посмотрим на структуру объекта:

$object | Get-Member

Начиная с PowerShell 3.0 доступен и другой синтаксис:

$object = [PSCustomObject]@

Получить доступ к данным можно одним из эквивалентных способов:

$object.Name $object.'Name' $value = 'Name' $object.$value 

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

$hash = @ $hash.GetType() $object = [pscustomobject]$hash $object.GetType() 

Один из недостатков объектов этого типа — порядок их свойств может поменяться. Чтобы этого избежать, необходимо использовать атрибут [ordered]:

$object = [PSCustomObject][ordered]@

Есть и другие варианты создания объекта: выше мы рассмотрели использование командлета Select-Object. Осталось разобраться с добавлением и удалением элементов. Сделать это для объекта из предыдущего примера довольно просто:

$object | Add-Member –MemberType NoteProperty –Name Age –Value 33 $object | Get-Member 

Командлет Add-Member позволяет добавлять ранее созданному объекту $object не только свойства, но и методы посредством использования конструкции «-MemberType ScriptMethod»:

$ScriptBlock = < # код >$object | Add-Member -Name "MyMethod" -MemberType ScriptMethod -Value $ScriptBlock $object | Get-Member 

Обратите внимание: для хранения кода нового метода мы использовали переменную $ScriptBlock типа ScriptBlock.

Для удаления свойств используется соответствующий метод:

$object.psobject.properties.remove('Name')

Создание собственных классов

В PowerShell 5.0 появилась возможность определения классов с использованием характерного для объектно-ориентированных языков программирования синтаксиса. Для этого предназначено служебное слово Class, после которого следует задать имя класса и описать его тело в операторных скобках:

class MyClass

Это настоящий тип .NET Core, в теле которого описываются его свойства, методы и другие элементы. Рассмотрим пример определения простейшего класса:

class MyClass

Для создания объекта (экземпляра класса) используется командлет New-Object, либо литерал типа [MyClass] и псевдостатический метод new (конструктор по умолчанию):

$object = New-Object -TypeName MyClass
$object = [MyClass]::new()

Проанализируем структуру объекта:

$object | Get-Member

Не стоит забывать про область видимости: нельзя ссылаться на имя типа в виде строки или использовать литерал типа за пределами скрипта или модуля, в котором определен класс. При этом функции могут возвращать экземпляры класса (объекты), которые будут доступны вне модуля или скрипта.

После создания объекта заполним его свойства:

$object.Name = 'Ivan Danko' $object.City = 'Moscow' $object.Country = 'Russia' $object 

Отметим, что в описании класса задаются не только типы свойств, но и их значения по умолчанию:

class Example

Описание метода класса напоминает описание функции, но без использования служебного слова function. Как и в функции, в методы при необходимости передаются параметры:

class MyClass < [string]$Name [string]$City [string]$Country #описание метода Smile([bool]$param1) < If($param1) < Write-Host ':)' >> > 

Теперь представитель нашего класса умеет улыбаться:

$object = [MyClass]::new() $object.Smile($true) 

Методы можно перегружать, кроме того у класса бывают статические свойства и методы, а также конструкторы, имена которых совпадают с именем самого класса. Определенный в скрипте или модуле PowerShell класс может служить базовым для другого — так реализуется наследование. При этом в качестве базовых допускается использование существующих классов .NET:

class MyClass2 : MyClass < #тело нового класса, базовым для которого является MyClass >[MyClass2]::new().Smile($true) 

Наше описание работы с объектами в PowerShell трудно назвать исчерпывающем. В следующих публикациях попробуем его углубить на практических примерах: пятая статья цикла будет посвящена вопросам интеграции PowerShell со сторонними программными компонентами. Прошлые части можно найти по ссылкам ниже.

  • PowerShell
  • разработка под Windows
  • системное администрирование
  • системное программирование
  • Блог компании RUVDS.com
  • Системное администрирование
  • Системное программирование
  • PowerShell
  • Разработка под Windows

PowerShell: системное администрирование и программирование

Всё о PowerShell в Windows и на Linux. Системное администрирование Windows

Тонкая настройка вывода с Format-Table

Командлет Format-Table для вывода данных в виде таблицы

Командлет Format-Table форматирует выходные данные команды в виде таблицы с выбранными свойствами объекта в каждом столбце. Тип объекта определяет макет по умолчанию и свойства, которые отображаются в каждом столбце. Вы можете использовать параметр -Property, чтобы выбрать свойства, которые вы хотите отобразить.

По умолчанию многие командлеты выводят данные оформленные в виде таблицы. В этом случае перенаправление вывода в Format-Table ничего не меняет.

Например, этот командлет выведет содержимое текущей папки:

Get-ChildItem

И следующие набор команд также выведет содержимое текущей папки, при этом данные будут идентичными, в том числе по оформлению:

Get-ChildItem | Format-Table

Но Format-Table не является бесполезным командлетом, поскольку с помощью его опций можно:

1. Изменять набор выводимых данных

2. Изменять внешний вид выводимых данных

Подробности смотрите в статьях:

  • Как в PowerShell менять набор выводимых по умолчанию данных
  • В PowerShell таблица не помещается на экран — как исправить (РЕШЕНО)

Опции Format-Table

-AutoSize

Указывает, что командлет регулирует размер столбца и количество столбцов в зависимости от ширины данных. По умолчанию размер и количество столбцов определяются используемым шаблоном (так называемый «вид», view). Таблица, выведенная с использованием параметра -AutoSize может быть более компактной за счёт уменьшения пространства между столбцами.

-DisplayError False|True

Указывает, что командлет отображает ошибки в командной строке. Этот параметр можно использовать в качестве вспомогательного средства отладки, когда вы форматируете выражения в команде Format-Table и вам необходимо устранить неполадки с выражениями.

-Force

Указывает, что командлет предписывает командлету отображать всю информацию об ошибках. Используйте с параметром -DisplayError или -ShowError. По умолчанию, когда объект ошибки записывается в потоки ошибок или отображения, отображается только некоторая информация об ошибках.

Задаёт отсортированный вывод в отдельных таблицах на основе значения свойства. Например, вы можете использовать -GroupBy для перечисления служб в отдельных таблицах в зависимости от их статуса.

Введите выражение или свойство. Параметр -GroupBy предполагает, что объекты отсортированы. Используйте командлет Sort-Object перед использованием Format-Table для группировки объектов.

Значение параметра -GroupBy может быть новым вычисляемым свойством. Чтобы создать вычисляемое свойство, используйте хеш-таблицу. Допустимые ключи следующие:

-HideTableHeaders

Пропускает заголовки столбцов из таблицы.

-InputObject

Указывает объекты для форматирования. Введите переменную, содержащую объекты, или введите команду или выражение для получения объектов.

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

Get-Process notepad | Format-Table @>, @>

и на идентичную предыдущей эту команду:

Format-Table -InputObject (Get-Process notepad) @>, @>

-Property

Задаёт свойства объекта, отображаемые на дисплее, и порядок их появления. Введите одно или несколько имён свойств, разделённых запятыми, или используйте хеш-таблицу для отображения вычисляемого свойства. Подстановочные знаки разрешены.

Если вы опустите этот параметр, свойства, отображаемые на дисплее, будут зависеть от свойств первого объекта. Например, если у первого объекта есть PropertyA и PropertyB, а у последующих объектов есть PropertyA , PropertyB и PropertyC , то будут отображаться только заголовки PropertyA и PropertyB.

Параметр -Property является необязательным. Вы не можете использовать параметры -Property и -View в одной и той же команде.

Значение параметра -Property может быть новым вычисляемым свойством. Чтобы создать вычисляемое свойство, используйте хеш-таблицу. Допустимые следующие ключи:

-RepeatHeader

Повторяет отображение заголовка таблицы после каждого заполнения экрана. Повторяющийся заголовок полезен, когда вывод направляется на программу, разделяющую вывод на страницы, такие как «less» или «more», или пейджинг с помощью программы чтения с экрана.

-ShowError

Этот параметр отправляет ошибки через конвейер. Этот параметр можно использовать в качестве средства отладки, когда вы форматируете выражения в команде Format-Table и вам необходимо устранить неполадки с выражениями.

-Wrap

Отображает текст, превышающий ширину столбца, на следующей строке. По умолчанию текст, превышающий ширину столбца, обрезается.

Примеры использования Format-Table

Пример 1: Подстройка размера таблицы под выводимые данные.

В этом примере в виде таблицы отображаются сведения о хост программе для PowerShell.

Get-Host | Format-Table -AutoSize

Командлет Get-Host получает объекты System.Management.Automation.Internal.Host.InternalHost, представляющие хост. Объекты передаются по конвейеру в Format-Table и отображаются в таблице. Параметр -AutoSize регулирует ширину столбцов, чтобы свести к минимуму усечение.

Пример 2: Форматирование процессов по BasePriority

В этом примере процессы отображаются в группах с одинаковым свойством BasePriority.

Get-Process | Sort-Object -Property BasePriority | Format-Table -GroupBy BasePriority -Wrap

Командлет Get-Process получает объекты, представляющие каждый процесс на компьютере, и отправляет их по конвейеру в Sort-Object. Объекты сортируются в порядке их свойства BasePriority.

Отсортированные объекты отправляются по конвейеру в Format-Table. Параметр -GroupBy упорядочивает данные процесса в группы на основе значения их свойства BasePriority. Параметр -Wrap гарантирует, что данные не будут усечены.

Пример 3: Форматирование процессов по дате запуска

В этом примере отображается информация о процессах, запущенных на компьютере. Объекты сортируются, и Format-Table использует представление для группировки объектов по дате их запуска.

Get-Process | Sort-Object StartTime | Format-Table -View StartTime

Командлет Get-Process получает объекты System.Diagnostics.Process, представляющие процессы, запущенные на компьютере. Объекты отправляются по конвейеру в Sort-Object и сортируются на основе свойства StartTime.

Отсортированные объекты отправляются по конвейеру в Format-Table. Параметр -View указывает представление StartTime, определённое в файле PowerShell DotNetTypes.format.ps1xml для объектов System.Diagnostics.Process. Представление StartTime преобразует время начала каждого процесса в короткую дату, а затем группирует процессы по дате начала.

Файл DotNetTypes.format.ps1xml содержит представление Priority для процессов. Вы можете создавать свои собственные файлы format.ps1xml с настроенными представлениями.

Пример 4: Использование свойств для вывода таблицы

В этом примере параметр -Property используется для отображения всех служб компьютера в таблице с двумя столбцами, в которой показаны свойства Name и DependentServices.

Get-Service | Format-Table -Property Name, DependentServices

Get-Service получает все службы на компьютере и отправляет объекты System.ServiceProcess.ServiceController по конвейеру. Format-Table использует параметр -Property, чтобы указать, что в таблице нужно отображать только свойства Name и DependentServices.

Name и DependentServices — это два свойства типа объекта. Чтобы просмотреть все свойства, выполните команду:

Get-Service | Get-Member -MemberType Properties

Пример 5: Форматирование вывода о процессе и расчёт времени его выполнения

В этом примере отображается таблица с именем процесса и общим временем выполнения для запущенных процессов программы Блокнот на локальном компьютере. Общее время выполнения рассчитывается путём вычитания времени запуска каждого процесса из текущего времени.

Get-Process notepad | Format-Table ProcessName, @>
ProcessName Время работы ----------- ------------ Notepad 06:08:18.9581686 Notepad 03:28:00.6712161 Notepad 00:14:33.2983814

Командлет Get-Process получает все процессы блокнота локального компьютера и отправляет объекты по конвейеру. Format-Table отображает таблицу с двумя столбцами: «ProcessName» (свойство Get-Process), и «Время работы» (вычисляемое свойство).

Свойство «Время работы» задаётся хэш-таблицей с двумя ключами: Label и Expression. Ключ Label задаёт имя свойства. Expression задаёт вычисление. Выражение получает свойство StartTime каждого объекта процесса и вычитает его из результата команды Get-Date, которая получает текущую дату и время.

При желании, заголовок первого столбца также можно русифицировать:

Get-Process notepad | Format-Table @>, @>

Пример 6: Форматирование вывода информации о процессе

В этом примере командлет Get-CimInstance используется для получения времени выполнения всех процессов блокнота на локальном компьютере. Командлет Get-CimInstance можно использовать с параметром -ComputerName для получения информации с удалённых компьютеров.

$Processes = Get-CimInstance -Class win32_process -Filter "name='notepad.exe'" $Processes | Format-Table ProcessName, @< Label = "Total Running Time"; Expression=>
ProcessName Total Running Time ----------- ------------------ notepad.exe 03:39:39.6260693 notepad.exe 00:19:56.1376922

Get-CimInstance получает экземпляры класса WMI Win32_Process, который описывает все процессы локального компьютера с именем notepad.exe. Объекты процесса хранятся в переменной $Processes.

Объекты процесса в переменной $Processes отправляются по конвейеру в Format-Table, которая отображает свойство ProcessName и новое вычисляемое свойство Total Running Time.

Команда присваивает имя нового вычисляемого свойства Total Running Time ключу Label. Блок сценария ключа Expression вычисляет, как долго выполняется процесс, вычитая дату создания процесса из текущей даты. Командлет Get-Date получает текущую дату. Дата создания вычитается из текущей даты. Результатом является значение Total Running Time.

Пример 6: Устранение ошибок формата

В следующих примерах показаны результаты добавления к выражению параметров -DisplayError или -ShowError.

Get-Date | Format-Table DayOfWeek, < $_ / $null >-DisplayError
DayOfWeek $_ / $null --------- ------------ Wednesday #ERR

Ещё один пример:

Get-Date | Format-Table DayOfWeek, < $_ / $null >-ShowError
DayOfWeek $_ / $null --------- ------------ Wednesday InvalidArgument: Failed to evaluate expression " $_ / $null ".

Как работать с процессами в Powershell используя Get и Start-Proccess

Работа с процессами Powershell Start-Process и управление ими на примерах

Процессы — это один из основных компонентов Windows и чаще всего мы работаем с ними через Task Manager (диспетчер задач), но эта возможность становится весомее если мы используем команды по управлению процессами в Powershell. Основные команды по управлению запущенными задачами можно увидеть так:

Get-Command -Noun Process

Мы получим следующий вывод:

  • Debug-Process — возможность мониторинга и отладки процессов. Для его работы нужно загрузить дополнительное ПО.
  • Get-Process — получение в Powershell списка процессов.
  • Start-Process — запуск процессов.
  • Stop-Process — убивает (завершает) процесс.
  • Wait-Process — ожидание окончания процесса.

Таких команд и вариантов их использования очень много. Например мы можем работать с процессами через WMI или использовать их в связке с мониторингом сетевых подключений через Get-NetTCPConnection.

Получив список процессов в Powershell можно увидеть что значения отображаются в Кб:

Get-Process

Изменить это можно через выражения:

# В чем отображать значения 1MB,1GB,1TB и т.д. $size = 1MB Get-Process | Format-Table ` @>, @>, @>, @>>, Id, ProcessName -AutoSize

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

Get-Process | Get-Member -MemberType Properties

Powershell свойства процессов

Каждое это свойство можно вызвать так:

Get-Process | SELECT Id # или Get-Process | FT id

Можно вызвать все свойства всех процессов или по одному выбранному:

Get-Process | SELECT * # или Get-Process -Name 'notepad' | SELECT *

Кроме свойств есть еще методы .NET, которые выводятся без дополнительных ключей или с указанием:

Get-Process | Get-Member -MemberType Method

Методы полезны тем, что ими можно воспользоваться не прибегая к дополнительным командам. Для примера так мы можем остановить процесс notepad (блокнот) тремя разными способами:

# Удаление процесса используя метод .NET $process = Get-Process -Name "notepad" $process.Kill() # Закрытие процесса используя командлет PS Stop-Process -Name "notepad" # Остановка процесса используя алиас PS kill kill -Name "Notepad" # Если мы хотим убить процесс по его идентификатору kill -ID 332

Методы .NET не всегда так очевидны, как командлеты поэтому к ним нужно прибегать с осторожностью.

При получении списка процессов есть параметр, который выводит путь откуда запущен процесс и версию файла:

Get-Process -FileVersionInfo

В варианте выше у нас будет много не критичных ошибок:

  • Get-Process : Не удалось перечислить информацию о версиях файла для процесса «svchost».
  • Get-Process : Cannot enumerate the file version information of the «csrss» process.

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

Get-Process -FileVersionInfo -ErrorAction SilentlyContinue

Или запросить информацию о конкретном процессе:

Get-Process -Name 'notepad' -FileVersionInfo

powershell процессы

Ключ FileVersionInfo это три свойства: Product, FileVersion и Path каждый из которых можно вывести отдельно. Получим процессы в Powershell со свойством времени запуска и отсортируем их:

Get-Process | select StartTime,Path,Name | sort StartTime

Если нужно выяснить когда и кто запустил процесс нужно добавить параметр IncludeUserName. В моем примере это два процесса:

Get-Process -Name 'notepad','explorer' -IncludeUserName | ft starttime,ProcessName,UserName

Эти же команды можно выполнять удаленно. Во всех командах Powershell, где есть ключ ComputerName можно указать минимум один удаленный компьютер:

Get-Process -ComputerName 'AD1','localhost'

Выполняя удаленную команду вы можете получить две ошибки. Первую, если у вас не настроена возможность удаленного управления в Powershell. И вторая, если вы укажете ключ -IncludeUserName, почему-то он не работает совместно с ComputerName:

  • Get-Process : Parameter set cannot be resolved using the specified named parameters.

Запуск процессов с Powershell Start-Process

На примере запуска блокнота команда выполняется так:

Start-Process -FilePath 'notepad'

Если исполняемый файл находится в другом месте нужно указать путь:

Start-Process -FilePath 'C:\Users\Administrator\Desktop\test.txt'

Если в программа может принимать аргументы их так же можно добавить:

Start-Process -FilePath tracert -ArgumentList "-d -4 fixmypc.ru"

По умолчанию окно процесса разворачивается. Если хотите запустить свернутым, то добавьте ключ WindowStyle:

Start-Process -FilePath tracert -ArgumentList "-d -4 fixmypc.ru" -WindowStyle minimized

Ключ WindowStyle принимает 4 значения:

  • minimized — свернутый вариант.
  • hidden — скрытый режим.
  • normal — обычный.
  • maximized — полностью развернутый.

Добавив ключ NoNewWindow, в случае с tracert, команда выполнится в текущем окне:

Start-Process -FilePath tracert -ArgumentList "-d -4 fixmypc.ru" -WindowStyle minimized

powershell start process

Если мы запускаем процесс, который подразумевает вывод, но не хотим открывать окно программы, то нам понадобится перенаправить вывод команд. Для этого есть два ключа:

  • RedirectStandardOutput — перенаправляет вывод
  • RedirectStandardError — перенаправляет ошибки
  • RedirectStandardInput — перенаправляет ввод

Воспользоваться этими ключами можно так:

Start-Process tracert -ArgumentList "-d -4 fixmypc.ru" -RedirectStandardOutput c:\success.txt -RedirectStandardError c:\error.txt -WindowStyle minimized

Если нужно открыть файл в определенной программе, то это делается так:

Start-Process -FilePath "C:\Windows\notepad.exe" "C:\Users\Administrator\Desktop\test.txt"

Отмечу, что ни одна команда PS не позволяет запускать процессы в интерактивном сеансе пользователя (например открыть пользователю Excel). Если вы хотите использовать такой метод, то вам нужно использовать psexec от SysInternals либо помещать задачи в планировщик и выполнять оттуда.

Пример по работе с процессами в Powershell

Директории, откуда работает основная часть программ относятся к Windows и Program Files. Работа программ из Application Data, например, всегда подозрительна. Мы можем мониторить запуск процессов из этой директории. Нам нужно объявить переменные с путями, которые не будут вызывать подозрений и проверять путь процессов на вхождение:

# Директория для проверки $path = '*C:\Users*' # Список компьютеров $computers = 'AD1','localhost' # Получение и фильтрация процессов $process = $computers |% # Вывод результатов $process # Завершение процессов (закоментирован от случайного убийства нужных задач) #$process | kill

process powershell

Второй пример выполнения — это запуск всех файлов из папки. Обычно скрипты применяются через групповые политики в момент входа пользователя. Если таких скриптов 10, то мы можем поместить их в определенную папку и запускать из планировщика задач указывая только директорию и расширение запускаемого файла и перенаправлять ошибки в индивидуальный файл:

# Директория для поиска файлов $path = 'C:\dd\*' # Поиск файлов и включение нужных и исключение ненужных $items = Get-ChildItem -Path $path -Include '*exe*' -Exclude '*txt*' # Сетевой путь, куда будут сохраняться ошибки $error_path = '\\localhost\SYSVOL\' $items |% + 'error.txt')>

Обратите внимание, что все файлы с ошибками будут сохраняться с именем компьютеров на котором запущен скрипт. В каждом из скриптов я так же ставил знак *, это связано не с точным вхождением. Например в первом случае после пути C:\Users* мы ожидаем еще символы и установив звездочку мы это указали. В случае Get-ChildItem ситуация похожая, но более подробно мы обсуждали в статье поиск файлов в Powershell.

Мы можем использовать поиск процессов не относящихся к производителям ПО, которые мы устанавливали на ПК пользователей. Для этого есть свойство Company. Не все объекты имеют имя компании, они связаны с задачами операционной системы:

$company = 'microsoft' Get-Process | where | Sort Company | Select ID,Name,WS,VM,Company | format-table -AutoSize

powershell список процессов

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

function Get-CPUPercent < $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 10 > Get-CPUPercent

Далее эту функцию можно запускать на удаленных компьютерах:

$computers = 'AD1','localhost' Invoke-Command -ComputerName $computers -ScriptBlock $ | ft

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *