при поиске информации как правильно создавать кастомные объекты обнаружил что поисковики выдают в рунете в основном устаревшие методы типа 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/
Добавить комментарий