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

Как использовать Select-Object в PowerShell


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

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

В этой статье мы рассмотрим, как использовать Select-Object, различные параметры выбора, и я покажу вам несколько примеров.

Команда Select-Object в PowerShell

Командлет Select-Object всегда используется после другого командлета в PowerShell. Он позволяет выбирать или изменять свойства объектов, которые поступают по конвейеру. Выбранные свойства затем отображаются только в результатах или могут, например, быть экспортированы в CSV-файл с помощью командлета Export-CSV.

Для выбора свойств у нас есть несколько вариантов, которые мы можем использовать:

-Property

Свойства для выбора. Выберите несколько, используя запятую для разделения.

-ExcludeProperty

Исключить свойства из результатов.

-First

Выберите первые x объектов из результатов

-Last

Выберите последние x объектов из результатов

-Skip

Пропустить x количество объектов

-SkipLast

Пропустите последние x записей

-Index

Выберите первые x объектов из результатов

-SkipIndex

Пропустить выбранные объекты из результатов.

-Unique

Выберите уникальные результаты

Давайте начнем с основ, и по ходу дела углубимся в возможности PowerShell Select-Object. Чтобы просто выбрать несколько свойств из объекта, мы можем использовать список с именами свойств, разделенный запятыми:

Get-Process | Select-Object -Property Name, CPU

You can also leave out the parameter -Property
Get-Process | Select-Object Name, CPU

Мы не всегда должны использовать полное имя свойств, также возможно использовать подстановочные знаки при выборе свойств. Например, если мы хотим вернуть все свойства, которые заканчиваются на слово "Размер", то мы можем сделать это:

Get-Process | Select-Object Name, CPU, *Size

Исключая свойства

Вместо выбора свойств, которые нам нужны, мы также можем исключить свойства, которые нам не нужны, с помощью параметра -ExcludeProperty. Так же, как и при выборе свойств, мы можем использовать подстановочный знак, чтобы исключить все свойства, которые начинаются или заканчиваются на определенную строку.

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

Get-ChildItem -Path c:\temp | Select-Object -ExcludeProperty Attributes, PS*

Ограничение количества результатов

Однако общий вопрос заключается в том, как узнать, какие свойства доступны? Чтобы получить все возможные свойства, мы можем использовать параметр -first команды Select-Object в комбинации с подстановочным знаком. Подстановочный знак вернет все свойства, а -first 1 обеспечит возвращение только одного объекта:

Get-Process | Select-Object * -First 1

Параметры -first и -last позволяют вам выбрать первые или последние x объектов из результатов. Хорошо знать, что вы можете использовать оба параметра одновременно, поэтому вы можете, например, выбрать первые 3 и последние 3 объекта из результатов:

Get-Process | Select-Object -First 3 -Last 3

Пропуск товаров

Кроме выбора первых или последних x элементов, мы также можем пропустить определенное количество элементов с помощью параметра -skip. Хорошо знать, что вы можете комбинировать пропуск с первыми или последними элементами. Итак, предположим, что мы хотим вернуть объекты с 11 по 15:

$numberArray = 1..20
$numberArray | Select-Object -Skip 10 -First 5

Пропуск всегда будет начинаться с начала результатов, что имеет смысл. Но что если вы хотите пропустить последние 10 элементов результата? В этом случае вы можете использовать параметр -SkipLast, который пропустит последние x результатов из списка:

$numberArray = 1..20
$numberArray | Select-Object -SkipLast 10

Выбор конкретных результатов с индексом

Если вы знаете, какие конкретные объекты вы хотите вернуть, вы можете также использовать параметр -index, чтобы выбрать их. Я не часто использую -index, но хороший пример - это когда вы читаете содержимое файла. Если вы знаете, какую строку вам нужно из файла, тогда вы можете использовать -index, чтобы выбрать строку(и). Имейте в виду, что индекс начинается с 0.

Select the 3 row from the CSV file
Get-Content -Path c:\temp\example.csv | Select-Object -index 2

Вы также можете использовать -SkipIndex, чтобы пропустить конкретный объект (или строку в приведённом выше примере) из результатов.

Выбрать уникальные

Когда вы получите все запущенные процессы на вашем компьютере, вы, вероятно, увидите, что некоторые процессы встречаются несколько раз в результатах, например, Chrome (если вы, конечно, используете его как браузер). Чтобы получить все уникальные процессы, мы можем использовать параметр -unique.

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

 Get-Process | Select-Object -Property Name -Unique

Другим хорошим примером является ситуация, когда вы хотите получить все возможные названия должностей, используемые в вашей Active Directory. Для этого мы получим всех пользователей с атрибутом 'title', выберем только названия должностей и извлечем уникальные значения из них:

Get-Aduser -Filter * -Properties title | Select Title -Unique

Выбрать объект: Расширенные функции

Команда Select-Object в PowerShell также имеет некоторые продвинутые функции, которые вам действительно стоит знать. Эти функции основаны на хеш-таблице, что позволяет нам переименовывать свойства и создавать вычисляемые свойства.

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

Get-Service | Select-Object @{Name="ServiceName"; Expression={$_.DisplayName}}

Как вы видите, мы получаем все услуги и собираемся выбрать объект из этого. Давайте посмотрим, что делает каждая часть хеш-таблицы:

  • @{Name="ServiceName"; Expression={$_.DisplayName}} – Это параметр на основе хеш-таблицы. Он определяет собственное свойство с именем “Servicename”, которое представлено в оригинальных объектах службы.
  • Имя="ServiceName" - Указывает новое настраиваемое свойство, которое будет добавлено к выходным данным.
  • Expression={$_.DisplayName} – Выражение, которое вычисляет значение нового пользовательского свойства. В данном случае мы возьмем свойство DisplayName каждого объекта и вернем его как ServiceName.

Переименование свойств

Чтобы переименовать свойства, мы можем использовать приведенный выше пример. Мы добавим новое пользовательское свойство, а для выражения возьмем значение свойства DisplayName. Вы также можете добавить и другие свойства.

Get-Service | Select-Object Status, @{Name="ServiceName"; Expression={$_.DisplayName}}

Получение вложенных свойств

Мы также можем использовать метод переименования для того, чтобы получить вложенные свойства с помощью Select-Object. Например, мы хотим получить последние 5 событий из журнала событий и добавить длину сообщения к результату. Мы можем создать новое пользовательское свойство MessageLength, а в выражении выбрать свойство length из свойства message:

Get-EventLog -LogName Application -Newest 5 | Select-Object TimeGenerated, EntryType, @{Name="MessageLength"; Expression={$_.Message.Length}}

Вычисляемые свойства

Часть выражения в параметре на основе хеш-таблицы позволяет нам выполнять вычисления. Принцип остается прежним. Сначала мы определяем новое пользовательское свойство, и в выражении мы можем выполнять любые расчеты, которые захотим.

Например, чтобы получить свободное место на вашем диске в гигабайтах, мы можем использовать командлет Get-WmiObject, чтобы получить информацию о дисках. Но он вернет свободное место в байтах, поэтому мы собираемся рассчитать его в гигабайтах:

Get-WmiObject Win32_LogicalDisk | Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}

Выражение вычисляет доступное свободное пространство на диске, деля свойство FreeSpace на 1GB (гигабайты). Оно также использует оператор форматирования -f, чтобы отформатировать результат с двумя десятичными знаками, используя спецификатор формата {0:N2}.

Расширить свойство

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

$myObject = [PSCustomObject]@{
    Name = "John"
    Age = 30
    Address = @{
        Street = "123 Main St"
        City = "Anytown"
        State = "CA"
    }
}

Мы можем получить улицу, используя метод вложенного свойства:

$myObject | Select-Object Name,@{Name="Street"; Expression={$_.Address.Street}}

Result
Name Street
---- ------
John 123 Main St

Но чтобы получить результаты в виде отдельных объектов, нам нужно будет использовать параметр -ExpandProperty вот так:

$myObject | Select-Object Name, @{Name="Street"; Expression={$_.Address.Street}} -ExpandProperty Street

Result
John
123 Main St

Заключение

Командлет PowerShell Select-Object позволяет вам выбирать необходимые результаты. Параметры -First и -Last - отличный способ проверить результаты перед выводом всех результатов. Если вы хотите узнать больше о PowerShell, ознакомьтесь с этим руководством для начинающих.

Надеюсь, эта статья помогла вам лучше понять, как работает cmdlet. Если у вас есть вопросы, просто оставьте комментарий ниже.