как создавать объекты в PowerShell

от автора

при поиске информации как правильно создавать кастомные объекты обнаружил что поисковики выдают в рунете в основном устаревшие методы типа add-member. Выкладываю здесь перевод рецепта от гуру PowerShell.

PowerShell in Depth

Глава 21.1 Техника номер 1. Использованию хеш таблиц для создания кастомных объектов.

Давайте начнем с того приема которым обычно мы пользуемся сами когда нам нужно создать свой собственный объект или объеденить информацию из разных объектов в один для последующего вывода. Мы называем этот путь официальным, или рекомендуемым. Мы пользуемся именно им потому что он позволяет легко менять писать код, хорошо читаем и в конечном итоге позволяет сделать быстрее свою работу.
Этот способ продемонстрирован в листинге 21.2 ниже

$os = Get-WmiObject –Class Win32_OperatingSystem –comp localhost $cs = Get-WmiObject –Class Win32_ComputerSystem –comp localhost $bios = Get-WmiObject –Class Win32_BIOS –comp localhost $proc = Get-WmiObject –Class Win32_Processor –comp localhost | Select –First 1  # Хэш таблица $props = @{OSVersion=$os.version Model=$cs.model Manufacturer=$cs.manufacturer BIOSSerial=$bios.serialnumber ComputerName=$os.CSName OSArchitecture=$os.osarchitecture ProcArchitecture=$proc.addresswidth}  # Создаем объект из хэш таблицы и выводим $obj = New-Object –TypeName PSObject –Property $props Write-Output $obj 

выполнив этот код вы получите результат подобный этому:

Manufacturer : Microsoft Corporation OSVersion : 6.3.9600 OSArchitecture : 64-bit BIOSSerial : 036685734653 ComputerName : RSSURFACEPRO2 Model : Surface Pro 2 ProcArchitecture : 64 

Т.к. на выходе у вас объект имеющий более четырех свойств PowerShell сделал вывод в виде списка. Вы могли бы выполнить

Write-Output $obj | ft 

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

Manufacturer=$cs.manufacturer 

Если поместить записи хэш-таблицы на одной строке, вам нужно будет отделить каждое свойство точкой с запятой. Если поместить каждое свойство на отдельной строке, вам не нужна точка с запятой, вам намного легче читать или править код. Скобки с прешедствующим им знаком @ говорят что далее начинается хэш-таблица. Т.к. таблица находится в переменной $props ее легко передать в параметрах -property нового объекта. Объект PSObject специально предусмотрен для этих целей.

Преимущество этого подхода в том что легко построить хэш таблицу на лету и создать из нее много пользовательских объектов. Вы можете заметить что в выходном объекте свойства имеют не тот же самый порядок как они были определены в таблице. Одно из возможных решений — создать форматирование для кастомного объекта (специальный XML файл описывающий как выводить на экран, в каком порядке и т.п.) или, если вы используете powershell 3 или 4 можно использовать свойство ordered

$props = [ordered]@{ OSVersion=$os.version Model=$cs.model Manufacturer=$cs.manufacturer BIOSSerial=$bios.serialnumber ComputerName=$os.CSName OSArchitecture=$os.osarchitecture ProcArchitecture=$proc.addresswidth} 

Все остальное тоже самое. но теперь свойства объекта будут отображаться в том порядке как они были записаны. Если вы передадите $obj на Get-Member, вы увидете что тип PS-CustomObject.

Примечание PowerShell по умолчанию не отслеживает порядок элементов в хэш таблице. Вот почему когда вы видете окончательный вывод его свойства идут не в том порядке в каком вы их создавали. Начиная с PowerShell 3 вы можете исправить это использовав атрибут [ordered]. Это создает упорядоченный словарь (другое название хэш таблиц) и поддерживает порядок элементов в ней.

ссылка на оригинал статьи https://habrahabr.ru/post/278351/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *