Какие объекты подходят для Add-Member? - PullRequest
6 голосов
/ 28 апреля 2009

Документация гласит:

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

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

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

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

Но это не так:

$obj = @{}

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

1 Ответ

17 голосов
/ 29 мая 2009

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 не является PSO-объектом. 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 не работает так, как вы ожидаете, заключается в том, что Hashtables обрабатываются PowerShell особым образом, и в основном адаптер для Hashtables использует ключи как свойства (своего рода), а Add-Member не будет работайте как положено с этим видом объекта.

...