В языке Windows PowerShell все крутится вокруг объектов. Это должен знать, как «отче наш», любой ИТ-специалист, работающий с PowerShell. Ясность языка PowerShell зависит по большей части от того, как вы работаете с объектами в конвейере. Поэтому вам просто необходимо овладеть техникой использования команды Select-Object. Эта команда делает ровно то, о чем говорит ее название: она выбирает объекты. На самом деле, она может выбирать объекты несколькими способами, которые я продемонстрирую и объясню. Для примера я буду использовать оболочку PowerShell 3.0.

Выбор нескольких объектов

Первый способ применения команды Select-Object (псевдоним Select) заключается в выборе определенного числа первых или последних объектов. Данный подход особенно удобен, если вам нужно получить только образец или подмножество данных. Параметр -First используется для выбора, начиная с начала массива данных, а параметр -Last — для выбора, начиная с конца массива данных.

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

Get-EventLog -List | Select -First 1 | Get-Member

Эта команда работает следующим образом.

  1. Команда Get-EventLog получает список объектов eventlog.
  2. Список передается (то есть отправляется) команде Select-Object. Параметр -First 1 сообщает оболочке PowerShell, что необходимо выбрать первый объект eventlog из этого списка.
  3. Данный объект передается команде Get-Member, которая отображает список свойств и методов объекта. Должен заметить, что в случае, когда я всего лишь хочу просмотреть информацию о члене массива, нет необходимости использовать команду Select-Object. Но я хотел показать, как применять эту команду. Кроме того, если бы исходная команда возвращала большое количество объектов, данный подход повысил бы производительность.

Когда речь идет об использовании команды Select-Object для выбора нескольких объектов, более распространенный подход заключается в том, чтобы задействовать команду после сортировки объектов. Например, вам нужно найти последний измененный файл в папке Scripts. Чтобы решить эту задачу, вы можете использовать команду:

Dir C:\scripts -File | Sort LastWriteTime | Select -Last 1

Она работает следующим образом.

  1. Команда Get-ChildItem (имеющая псевдоним Dir) с параметром -File формирует список файлов, хранящихся в указанной папке (C:\scripts). Имейте в виду, что параметр -File появился в оболочке PowerShell 3.0. Если вы используете другую версию, то получите ошибку.
  2. Файлы передаются команде Sort-Object (имеющей псевдоним Sort) и сортируются по значениям свойства LastWriteTime. Параметр -Property — это первый позиционный параметр, поэтому указывать его имя (-Property) не обязательно.
  3. Отсортированный список передается команде Select-Object с параметром -Last 1, чтобы выбрать последний объект (то есть последний измененный сценарий).

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

Dir $env:USERPROFILE\Documents -File |
Sort Length -Descending |
Select -First 5

Хотя здесь строка разрывается, в консоли PowerShell вы должны вводить команду единой строкой. Это относится и к остальным командам, разделенным на несколько строк. Как показано на экране 1, данная команда отображает 5 самых больших файлов в папке Documents. Для этого она получает список всех файлов, сортирует их по убыванию значений свойства Length и выбирает первые пять файлов. Объекты, попавшие в конвейер, не изменяются. Команда лишь сообщает оболочке PowerShell, сколько объектов выбрать, после чего передает выбранные объекты на конвейер

 

Вывод пяти самых больших файлов
Экран 1. Вывод пяти самых больших файлов

Вы можете даже пойти на шаг дальше и подсчитать общий объем пяти самых больших файлов с помощью команды Measure-Object с параметром -Sum. Как видно из следующей команды, пять самых больших файлов передаются команде Measure-Object, с пометкой о необходимости просуммировать значения поля Length:

Dir $env:USERPROFILE\documents -File |
Sort Length -Descending |
Select -First 5 | Measure-Object Length -Sum

В моем случае команда вернула сумму 10834708 байт.

Выбор свойств

Многие объекты языка PowerShell имеют больше свойств, чем вы видите по умолчанию, а вам может понадобиться просмотреть некоторые из скрытых свойств. Есть и другой способ использования команды Select-Object. Вы можете выбрать свойства, которые хотите увидеть. Для этого используется параметр -Property и разделенный запятыми список имен свойств. Например, вы хотите просмотреть свойства DisplayName и Status службы Background Intelligent Transfer Service (BITS) на своей машине. Вы можете задействовать команду Get-Service для получения информации о службе BITS и передать результаты команде Select-Object, в которой указаны нужные свойства. Например, так:

Get-Service bits | Select -Property DisplayName,Status

Результаты показаны на экране 2.

 

Вывод информации о службе BITS
Экран 2. Вывод информации о службе BITS

Вы можете использовать любое свойство или набор свойств при передаче данных команде Select-Object. Следующая команда использует команду Get-Process для получения информации о процессе Winword.exe и ее передачи команде Select-Object, которая выбирает свойство PSResources:

Get-Process Winword | Select PSResources

Как и параметр -Property команды Sort-Object, параметр -Property команды Select-Object является позиционным, поэтому указывать имя параметра (-Property) не обязательно. Результаты отображены на экране 3.

 

Форматирование вывода командой Format-Table
Экран 3. Получение информации о процессе Winword.exe

Большинство ИТ-специалистов используют команду Select-Object главным образом для выбора свойств. Еще вы можете выбирать свойства с помощью подстановочных знаков, которые позволят сократить объем набираемого текста.

Выбор расширенных свойств

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

Get-Service bits | Select DisplayName,RequiredServices

Заметьте, что в полученных результатах, показанных на экране 4, значение свойства RequiredServices заключено в фигурные скобки. Для просмотра таких значений необходимо расширить свойство с помощью параметра -Expand:

Get-Service bits | Select -Expand RequiredServices

 

Расширенные объекты служб, необходимых для работы службы BITS
Экран 4. Расширенные объекты служб, необходимых для работы службы BITS

К сожалению, вы можете расширить только одно свойство. Результаты выполнения второй команды на экране 4 включают в себя расширенные объекты служб, необходимых для работы службы BITS.

Выбор – это не форматирование

При выборе свойств с помощью команды Select-Object вы заметите, что иногда результаты на выходе отформатированы не очень хорошо. Пример вы видите на экране 5.

 

Неформатированный вывод команды Select-Object
Экран 5. Неформатированный вывод команды Select-Object

Такой результат ожидаем. Выбор и форматирование – это не одно и то же. Оболочка PowerShell делает все, что может. Если хотите навести красоту, можете передать результаты от команды Select-Object команде Format-Table, использующей параметр –AutoSize, как это сделал я (см. экран 6).

 

Форматирование командой Format-Table
Экран 6. Форматирование командой Format-Table

Форматирование необходимо задавать в конце команды, если только вы не передаете результаты в одну из команд Out, например Out-File. Однако в большинстве случаев вы будете выбирать свойства, чтобы получать только необходимые данные, так что сможете обработать результаты, например экспортировать их в файл. csv или конвертировать в формат HTML.

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