Какие объекты подходят для Добавления участника?

StackOverflow https://stackoverflow.com/questions/798258

  •  18-09-2019
  •  | 
  •  

Вопрос

В документации говорится:

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

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

Это прекрасно работает:

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

Но это не делает:

$obj = @{}

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

Это было полезно?

Решение

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

Способ работы 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top