Какие объекты подходят для Add-Member?

В документации указано:

Добавляет определяемый пользователем настраиваемый элемент в экземпляр объекта Windows PowerShell.

Что означает «объект Windows PowerShell»?

Это отлично работает:

$obj = new-object system.object
$obj | add-member -membertype noteproperty -name Name -value "OK"
$obj.name

Но это не так:

$obj = @{}

На самом деле, я пытаюсь добавить свойство в $error[0].


person alex2k8    schedule 28.04.2009    source источник


Ответы (1)


В PowerShell есть то, что называется PSObject, который является оболочкой для любого объекта .NET (или это может быть полностью настраиваемый объект), и когда вы вызываете Add-Member, PowerShell неявно оборачивает реальный объект .NET в PSObject.

Способ работы Add-Member зависит от того, начали ли вы с PSObject или нет. Если вы не начали с PSObject, Add-Member перенесет ввод в PSObject, и вам нужно будет переназначить переменную, чтобы увидеть адаптированный объект.

Так, например:

$x = [Environment]::OSVersion
$x | Add-Member NoteProperty IsVista $true
$x | Format-List   # does not show the new property

Это связано с тем, что OSVersion не является оболочкой PSObject. Add-Member упаковывает его, но эта оболочка теряется, потому что вы не переназначаете $x завернутому объекту. В отличие от этого поведения:

$x = New-Object OperatingSystem ('Win32NT', '6.0')
$x | Add-Member NoteProperty IsVista $true
$x | Format-List   # DOES show the new property

Это связано с тем, что командлет New-Object неявно заключает новый экземпляр в PSObject. Таким образом, ваш вызов Add-Member добавляет членов в существующую оболочку.

Возвращаясь к первому примеру, вы можете заставить его работать должным образом, изменив его на:

$x = [Environment]::OSVersion
$x = $x | Add-Member NoteProperty IsVista $true -PassThru
$x | Format-List   # DOES show the new property

Теперь, после всего этого, причина того, что Hashtable не работает так, как вы ожидаете, заключается в том, что PowerShell обрабатывает Hashtables особым образом, и в основном адаптер для Hashtables использует ключи как свойства (своего рода), а Add-Member не будет работать должным образом. с таким объектом.

person Josh    schedule 29.05.2009
comment
Все это верно и относится к добавлению элементов в объекты хеш-таблицы (но не упоминается, что обычно вы, вероятно, намереваетесь добавить пару ключ-значение, к которой вы будете обращаться, как если бы это был элемент, использующий .). Однако использование Add-Member для добавления свойств заметки к $error[0] вполне допустимо. Загвоздка в том, что вы добавляете свойство только к объекту, хранящемуся в настоящее время в $error[0]. Как только генерируется другая ошибка, этот объект (не)смещается в $error[1] и берет с собой добавленное свойство, снова оставляя $error[0] пустым. Является ли это намерением ОП, я не знаю. - person Uber Kluger; 31.05.2021