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

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

Откройте для себя возможности переключателя PowerShell Expand Property (-ExpandProperty) на примерах в этом учебнике.

Требования

Этот учебник будет практическим демонстрационным. Если вы хотите следовать за ним, вам понадобится компьютер с Windows с PowerShell 5.1 и выше. В этой статье используется компьютер с Windows 10 и PowerShell 5.1.

Извлечение значений объектов свойства с помощью PowerShell Expand Property

Войдите на ваш компьютер под учетной записью Windows и запустите терминал PowerShell. В этом разделе вы познакомитесь с командой Select-Object и ее переключателем ExpandProperty.

1. Запустите команду Get-Service, чтобы получить список всех служб на вашей системе. Перенаправьте вывод на команду Select-Object, чтобы выбрать и отобразить только свойство name каждого объекта службы, как показано ниже.

Get-Service | Select-Object -Property Name

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

Selecting the names of the existing system services

2. Запустите команду Get-Member в конце предыдущего конвейера, чтобы подтвердить тип объектов, которые возвращает select-object, как показано ниже. Знание типа объекта помогает создавать функции или cmdlet’ы для расширения ваших конвейеров.

Get-Service | Select-Object -Property Name | Get-Member

Обратитесь к скриншоту ниже, и вы заметите, что несмотря на то, что ключ -Property выводит то, что кажется списком строк, это выбранный список объектов System.ServiceProcess.ServiceController.

Viewing the type of a ServiceController object with Get-Member

3. Замените команду Get-Members на mkdir, чтобы автоматически создать папку для каждой службы. Ключ -first 5 ограничивает количество возвращаемых объектов. В свою очередь функция mkdir создаст только пять папок на основе объектов в конвейере.

Get-Service | Select-Object -Property Name -First 5 | mkdir

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

Creating a folder for the services on your system

4. Удалите папки, заменив mkdir на rmdir, как показано в отрывке ниже. Включите ключ -Verbose, чтобы показать подробный вывод в вашем терминале.

Get-Service | Select-Object -Property Name -First 5 | rmdir -Verbose

Команда rmdir ожидает строки и не может обрабатывать представление объектов ServiceController в виде хэш-таблицы. Ваша попытка должна завершиться несколькими ошибками, как показано на скриншоте ниже.

Demonstrating that some cmdlets expect string values instead of hashtables

5. Измените переключатель -Property на переключатель -ExpandProperty, как показано в следующем фрагменте кода. Это позволяет получить значение свойства в виде строки, когда вам нужна только строка.

Get-Service | Select-Object -ExpandProperty Name -First 5 | rmdir -Verbose

Совместно с rmdir вы должны видеть, что ваша попытка автоматически удалить папки проходит успешно без ошибок, как показано на скриншоте ниже.

Deleting folders named after the services expanded

Создание набора выбранных объектов с определенными свойствами

Для сокращения фрагментов кода в разделах создайте переменную для первых 20 служб на вашем компьютере следующим образом.

Выполните команду Get-Service, выберите первые 20 объектов с помощью команды Select-Object и сохраните объекты в переменной с именем $testServices. Выберите только свойства Name, Status и DependentServices, как показано ниже.

$testServices = Get-Service | Select-Object -Property Name,Status,DependentServices -First 20

Переключатель PowerShell Expand Property может расширить только одно свойство за раз, в отличие от переключателя Property, который может выбирать несколько свойств одновременно.

Выполните переменную $testServices, чтобы просмотреть структуру ее содержимого.

$testServices

Вы должны увидеть таблицу, отображающую свойства отобранных сервисов, аналогично скриншоту ниже.

Displaying the contents of $testServices

Расширение свойства коллекции с помощью PowerShell Expand Property

A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.

Выполните командлет Select-Object для переменной $testServices и раскройте свойство DependentServices для каждого сервиса.

$testServices | Select-Object -ExpandProperty DependentServices

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

Expanding the DependentServices property

Комбинирование свойства с PowerShell Expand Property для категоризированного вывода

Теперь у вас есть список зависимых сервисов, но как узнать, от какого сервиса они зависят? В этом разделе вы узнаете, как использовать переключатель -Property для категоризации расширенного свойства.

Запустите команду ниже, чтобы категоризировать свойства DependentServices по Name.

$testServices | Select-Object -ExpandProperty DependentServices -Property Name

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

Ошибка ниже сообщает вам, что начальный список сервисов (в $testServices) уже имеет свойство Name, конфликтующее с собственным свойством Name в расширенном свойстве DependentServices.

Attempting to group an expanded property by the parent object name

Один из способов обойти это – создать Вычисляемые свойства, чтобы переименовать свойство идентификатора следующим образом.

Сохраните измененный предыдущий вывод команды, указав вычисляемое свойство с именем Depends On в переменной с именем $depServ. Depends on будет содержать значение Name для каждой службы в $testService.

Имя свойства, Зависит от, было произвольно выбрано в этом учебнике и может быть любым выражением по вашему выбору.

$depServ = $testServices | Select-Object -ExpandProperty DependentServices -Property @{name="Depends On"; expr={$_.Name}}

Передайте объект в $depServ через Select-Object, чтобы выбрать зависимые свойства службы Name, Status и Depends On.

$depServ | Select-Object -Property Name,Status,"Depends On"

Теперь вы можете определить, какие службы зависят от служб в $testServices, как показано ниже.

Grouping an expanded property using a calculated property

Комбинирование Format-List с PowerShell Expand Property для подробности

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

Запустите cmdlet Get-Process ниже, чтобы извлечь все модули, которые использует процесс explorer. Включите ключ -ExpandProperty, чтобы отобразить свойства модулей.

Get-Process explorer | select-object -ExpandProperty Modules

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

Viewing the truncated output of an expanded property

Подключите объекты к cmdlet Format-List, чтобы просмотреть все значения объектов модуля в более удобном списке.

Get-Process explorer | select-object -ExpandProperty Modules | Format-List

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

Converting the output of an expanded property to a list with Format-List

Заключение

Достигнув этой точки успешно, вы увидели, как воспользоваться переключателем PowerShell Expand Property (-ExpandProperty) cmdlet Select-Object. PowerShell предоставляет целый набор полезных cmdlet для многих общих задач. Вы можете усилить свои новые знания, изучив, как быстро отображать файлы с помощью PowerShell Cat.

Source:
https://adamtheautomator.com/powershell-expand-property/