Как использовать 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. Если у вас есть вопросы, просто оставьте комментарий ниже.


