А АMonday, 22 May 2017

Как создать дополнительное поле в выводе Powershell?

Всем привет.

Я рассказывал что форматирование результатов в Out-GridView весьма полезная штука. Но иногда для отчета надо создать дополнительное поле по свойству объекта которого не существует.

Как создать такое дополнительное поле в выводе Powershell?

Для того чтобы добавить пользовательские (custom) свойства к объекту, используется команда Select-Object. Например, чтобы добавить атрибут ComputerName к элементу Computer, у которого уже есть атрибут Name, можно запустить команду:

Get-ADComputer –filter * |
Select *,@{Label='ComputerName';Expression={$_.Name}

Команда Select-Object обеспечивает доступ ко всем свойствам компьютеров, которые были определены с помощью Get-ADComputer и группового символа *. Помимо этого, Select-Object добавляет новые свойства этим компьютерам. В данном случае новое свойство имеет ярлык ComputerName, что в командной конструкции обозначено с помощью команды Label. Такая часть конструкции как Expression показывает значение, которое содержит данное свойство. Expression сопровождается скриптовым блоком, заключенным в фигурные скобки. Внутри этого скриптового блока структурный нуль $_ указывает, на что направлена команда Select-Object – в данном случае, это компьютеры. Точка после $_ указывает на то, что вы хотите обратиться к существующему свойству, в данном случае, Name.

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

Get-ADComputer –filter * |
Ft DnsHostName,Enabled,@{Label='ComputerName';Expression={$_.Name}}

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

В чем же разница?

Правило следующее - если вам необходимо изменить элемент в конвейере, а затем передать его в другой командлет, вы можете использовать опцию Select-Object для добавления новых свойств элементу. Если же вы просто хотите создать новую колонку в таблице, используйте опцию Format- Table.

В принципе, не случится ничего страшного, если вы используете опцию Select-Object, а затем передадите результат по конвейеру в командлет Format-Table для вывода данных в виде таблицы. Обе техники дают один и тот же результат. Просто не забывайте о том, что командлет Format-Table обычно идет в самом конце конвейера, и что данные из него можно передавать только командлету Out-Host (или Out-Default, или Out-File). Элемент Expression в конструкции также может содержать математические знаки, такие как +, -, * или /, которые обозначают, соответственно, прибавление, вычитание, умножение или деление. Например, таким образом вы можете добавить значения двух свойств:

Get-WmiObject Win32_LogicalDisk |
Ft DeviceID,Size, @{Label='SpaceUsed';Expression={$_.Size - $_.FreeSpace}}

Здесь командлету Format-Table дана команда создать колонки для свойств логических дисков DeviceID и Size, которые были извлечены командлетом Get-WmiObject. Вдобавок к этим двум колонкам он создает третью, под названием SpaceUsed. Эта колонка содержит значение, равное разнице между общим размером диска и оставшейся свободной памятью. Как вы видите, здесь используется знак вычитания для осуществления математического вычисления.
Техника использования $_ в качестве структурного нуля для обозначения элемента, на который направлена команда, а также последующая точка, указывающая, к какому свойству следует обратиться, является ключевой техникой в Windows PowerShell.

Такой элемент командной строки как Expression может содержать практически любой скрипт или команду Windows PowerShell. В первом примере это был просто доступ к атрибуту Name тех элементов, которые поступают в командлет Format-Table, хотя вы можете использовать намного более сложные значения, например:

get-adcomputer -filter * |
ft dnshostname,@{
Label="OSVersion";
Expression={
(gwmi win32_operatingsystem -comp $_.Name).caption
}
}

Это уже достаточно сложная команда. Здесь происходит следующее:
• командлет Get-ADComputer извлекает данные обо всех компьютерах в домене (хотя и с осторожностью, так как в большом домене данный процесс может быть ресурсоемким)
• данные о компьютерах передаются в командлет Format-Table
• Format-Table показывает атрибут DNSHostName
• также Format-Table создает дополнительную колонку под названием OSVersion. Содержимое этой колонки – это данные, которые отображает командлет Get-WmiObject (использует alias gwmi)
• Get-WmiObject соединяется с именем компьютера, указанным в атрибуте Name входящих данных в Format-Table – это то имя, которое мы показываем
• командлет Get-WmiObject находится внутри круглых скобок, которые обозначают, каким должен быть результат выполнения команды. В данном случае результатом является информация об операционной системе компьютера
• точка после скобок обозначает, что мы хотим получить доступ к свойству информации WMI, полученной в результате выполнения команды. В данном случае мы получаем доступ к атрибуту Caption операционной системы, который представляет собой текстовое описание имени и версии операционной системы.

Тогда выходные данные для отдельно взятого компьютера будут выглядеть так:

dnshostname                    OSVersion
-----------                           ---------
server-r2.company.com    Microsoft Windows Server 2008 R2 Standard

Удачи.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное