Windows PowerShell: Такие разные пути к пользовательскому объекту

Не так давно я сделал запись в собственном блоге, где выложил двенадцать советов по использованию Windows PowerShell. Двенадцатая рекомендация предлагает разработчикам выводить в итоге работы сценариев и функций объекты, а не текст. Я предложил интенсивно использующим командлет Write-Host разработчикам тормознуть и поразмыслить, что все-таки они делают. Командлет Write-Host не возвращает текст.

Скоро после публикации этой записи ко мне обратился один читатель с вопросом о коде, который я фактически использовал для сотворения пользовательского объекта. Он произнес, что никогда не еще не встречался с таким подходом. Это логично, так как Windows PowerShell предоставляет 10-ки методов выполнения одной и той же задачки. Читатель предложил мне написать статью о разных методах сотворения пользовательских объектов, и это эта самая статья.

Полноформатный метод

Вероятнее всего, конкретно этим методом большая часть людей делают пользовательские объекты. Этот подход я называю «хрестоматийным». Его отличает наибольшая четкость, но он предугадывает много работы по вводу текста. Если у меня есть по одному объекту в переменных $os и $bios, я могу скомбинировать имеющуюся информацию так:

$object = New-Object –TypeNamePSObject
$object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber
$object | Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version
$object | Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber
Write-Output $object

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

Маленький путь с -PassThru

1-ый метод можно сделать чуток более лаконичным, заставив Add-Member возвратить объект в сборочный поток:

$object = New-Object –TypeNamePSObject
$object | Add-Member –MemberTypeNoteProperty –Name OSBuild –Value $os.BuildNumber –PassThru |
Add-Member –MemberTypeNoteProperty –Name OSVersion –Value $os.Version –PassThru |
Add-Member –MemberTypeNoteProperty –Name BIOSSerial –Value $bios.SerialNumber
Write-Output $object

Если строчка завершается вертикальной чертой (|), Windows PowerShell ждет узреть в последующей физической строке последующую команду в конвейере. В сути, это метод разбиения длинноватой команды на несколько строк. Этот прием вкупе с параметром –PassThru превращает это в серию из 3-х различных команд.

Хеш-таблицы, вперед!

Описанные методы эффективны, но при всем этом «многословны». В сценарии бывает трудно зрительно проследить, что происходит. New-Object предоставляет возможность решить задачку более лаконически. Это позволяет сделать хеш-таблицу (либо ассоциативный массив), содержащую имена параметров и значения, которые нужно добавить ко вновь сделанному объекту. Каждое из этих параметров автоматом создается как свойство NoteProperty:

$properties = @{‘OSBuild’=$os.BuildNumber;
‘OSVersion’=$os.version;
‘BIOSSerial’=$bios.SerialNumber}
$object = New-Object –TypeNamePSObject –Prop $properties
Write-Output $object

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

$object = New-Object –TypeNamePSObject –Prop
(@{‘OSBuild’=$os.BuildNumber;
‘OSVersion’=$os.version;
‘BIOSSerial’=$bios.SerialNumber})
Write-Output $object

Очередной шажок

Вы увидели, что во всех этих примерах перед передачей пользовательского объекта по сборочному потоку я сохраняю его в переменной $object. Причина ординарна: может потребоваться дополнительно поработать с объектом. К примеру, можно дать объекту имя пользовательского типа:

$object.PSObject.TypeNames.Insert(0,’My.Custom.Name’)

Это позволяет сделать пользовательский формат для отображения вашего объекта. Я использовал этот прием с восхитительными плодами в «Windows PowerShell Scripting and Toolmaking» (Concentrated Technology and Interface Technical Training, 2011), короткой книжке, которую я написал и в какой сказал о таких вещах, как внедрение пользовательских объектов для вывода данных из пользовательских средств Windows PowerShell.

На хоть какой вкус и цвет…

Не существует «неправильных» методов решения задач в Windows PowerShell, если в итоге вы решаете намеченную цель. Совместно с тем, есть ряд приемов, которые я стараюсь не использовать, в главном из-за того, что они наименее читабельны и труднее для преподавания, в особенности для начинающих юзеров. Вот один из таких приемов, в каком, по-прежнему, подразумевается, что переменные $os и $bios содержат объекты, из которых мне необходимо извлечь информацию:

$os | Select-Object –Property @{n=’OSVersion’;e={$_.Version}},
@{n=’OSBuild’;e={$_.BuildNumber}},
@{n=’BIOSSerial’;e={$bios.SerialNumber}}

Итог будет таким же, что и в прошлых примерах, но синтаксис ужасен. Тут масса пунктуации, структурных особенностей и необходимо знать много других вещей о Select-Object, чтоб совладать с этими 3-мя хеш-таблицами.

Тут практически генерируются пользовательские характеристики средствами синтаксиса, присущего этому определенному командлету (и еще командлетам Format). Таковой синтаксис обычно характерен для людей с программистским опытом. Для меня (и многих других) разбирать таковой текст очень тяжело, потому я стараюсь не писать в таком стиле.

Оболочка PowerShell ничто, если она не эластичная

Уникальность Windows PowerShell в том, что она позволяет делать некие по-настоящему одичавшие вещи. Вернемся к моему примеру с хеш-таблицами. Задачку можно решить и так:

$info = @{}
$info.OSBuild=$os.BuildNumber
$info.OSVersion=$os.version
$info.BIOSSerial=$bios.SerialNumber
$object = New-Object –TypeNamePSObject –Prop $info
Write-Output $object

Мы создаем пустую хеш-таблицу, а потом добавляем информацию, ссылающуюся на несуществующие характеристики. К примеру, при попытке в первый раз обратиться к OSBuild оболочка Windows PowerShell осознает, что в объекте $info (которые представляет собой пустую хеш-таблицу) такового характеристики не существует. Но она просто делает это свойство и присваивает ему значение. Совсем бесшабашная вещь, все же работает.

Мораль: объекты, а не текст

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

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

Комментарии закрыты.