Найти тему
ProPowershell.ru

Основы Powershell. Конвейер и форматирование вывода

Оглавление

Что такое конвейер в Powershell?

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

В powershell все, с чем можно взаимодействовать – это объекты с набором свойств. И даже текстовый файл технически представляет из себя набор строковых объектов. А каждая строка функционирует как уникальный и независимый объект. Объекты можно передавать от одной команды к другой бесконечно, пока Вы не получите нужный результат.

Итак, все, что выполняется в powershell, выполняется по конвейеру. Он может состоять из одной или множества команд. И эти команды выполняются слева на право, а разделяются они символом “|”. Большинство командлетов на выходе не генерируют читабельный вывод (таблицы, списки и т.д.). Но генерируют список объектов с их свойствами. В связи с чем в powershell существуют команды, которые отвечают за формирование удобно читаемого вывода.

Форматируем вывод: Select-Object

Каждый объект любого типа имеет определенный набор свойств, который отображается по умолчанию. То есть, объект имеет множество свойств, но отображается только несколько основных. Чтобы просмотреть полный список свойств объекта и их значений необходимо в конвейер добавить команду “Select-Object *”. Символ * является подстановочным, что означает – показать все что есть. Если Вам нужно посмотреть только какое-то одно свойство, тогда вместо * необходимо указать его название. Так же возможен смешанный вариант, когда требуется отобразить свойства по маске. Например – Select-Object *quota* выведет все свойства, в названии которых присутствует слово “quota”

С помощью Select-Object Вы можете определить только те свойства, которые Вам интересны, перечислив их через запятую. Этот принцип действует для всех команд форматирования вывода. Для примера Get-Service по умолчанию выводит свойства Status, Name и DisplayName. Уберем из вывода DisplayName и добавим StartType, который не отображается по умолчанию:

Get-Service | Select-Object Status, Name, StartType

Пример работы Select-Object
Пример работы Select-Object

Несколько полезных ключей для Select-Object:

  • -First n, ключ выводит только первые n объектов из всего вывода;
  • -Last n, выводит только последние n объектов из всего вывода;
  • -Skip n, позволяет пропустить\убрать из вывода первые n объектов;
  • -Unique, выводит только уникальные сочетания тех свойств, что указаны в Select-Object, без их повторений. Это хороший способ для фильтрации повторяющихся объектов.

Format-Table

С виду вывод Format-Table и Select-Object кажется похожим, но все же у них разное назначение. Select-Object может использоваться как для форматирования так и для фильтрации объектов. В то время как Format-Table позволяет только лишь редактировать вывод в консоль. Для этой задачи он обладает бОльшими возможностями.

Некоторые полезные ключи:

  • -AutoSize, выравнивает ширину колонок в выводе по самому широкому значению в колонке;
  • -GroupBy, группирует вывод по заданному свойству в отдельные таблицы;
  • -RepeatHeader, повторяет заголовки колонок на каждом экране консоли при прокрутке;
  • -HideTableHeaders, скрывает названия колонок из вывода;
  • -Wrap, выполняет перенос значения свойства на новую строку, если оно не умещается на одной строке. В противном случае значения обрезаются по ширине колонки
Пример работы Format-Table
Пример работы Format-Table

Format-List

Если Format-Table трансформирует вывод в табличный вид, то Format-List выводит значения свойств списком по каждому объекту. Командлет так же имеет возможность группировки списков по заданному значению с помощью ключа -GroupBy.

Пример работы Format-List
Пример работы Format-List

Format-Wide

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

Пример работы Format-Wide
Пример работы Format-Wide

Format-Hex

Так же существует возможность форматирования вывода в HEX. Мне не доводилось находить ему практическое применение. Просто знайте, что такая возможность есть. При желании можете обратиться к официальной документации по этому командлету.

Сортировка вывода: Sort-Object

Здесь все просто! Для выполнения сортировки необходимо лишь указать по какому свойству это сделать. По умолчанию сортировка выполняется по увеличению, что равносильно указанию ключа -Accending. Чтобы сделать сортировку по убыванию, существует ключ -Descending

Пример работы Sort-Object
Пример работы Sort-Object

Конвертирование вывода

Одним из способов форматирования так же является конвертирование вывода в какой-либо формат представления. Например Csv, HTML, JSON, XML. Эта возможность представлена командами ConvertTo-Csv, ConvertTo-HTML, ConvertTo-JSON, ConvertTo-XML соответственно. Но работу этих команд мы рассмотрим в будущем – в отдельной статье, посвященной работе с файлами определенных типов.

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

Все способы форматирования кроме конвертирования, поддерживают возможность определения кастомных вычисляемых свойств. О чем вообще речь? – спросите Вы. Powershell предоставляет возможность определять свои любые значения на основе существующих свойств объекта. Например, командлет Get-Volume показывает список имеющихся на ПК разделов и некоторую информацию по ним. В частности нас будет интересовать информация о текущей заполненности раздела. Но, Get-Volume выводит информацию только по общему объему раздела – Size и оставшемуся свободному месту – SizeRemaining. Можно, конечно, посчитать и в уме, но что делать если у Вас 48 дисков в сервере?!

Пример работы Get-Volume
Пример работы Get-Volume

В такой ситуации Вы можете определить свое свойство со своим именем, например “CurrentSize”. И описать как оно должно высчитываться.

Get-Volume | Format-Table DriveLetter, SizeRemaining, Size, @{Name="CurrentSize"; Expression={$_.Size - $_.SizeRemaining}}

Вычисляемое свойство объявляется символами @{}. Внутри скобок необходимо определить имя свойства, присвоив значение для Name. И через “;” описать выражение, с помощью которого это свойство будет вычисляться. Текст выражения присваивается значению Expression и указывается в фигурных скобках.

Пример вычисляемого свойства
Пример вычисляемого свойства