文档说明:
添加用户定义的自定义成员 Windows PowerShell的一个实例 对象
“Windows PowerShell对象”代表什么?
这很好用:
$obj = new-object system.object
$obj | add-member -membertype noteproperty -name Name -value "OK"
$obj.name
但这不是:
$obj = @{}
实际上,我正在尝试将属性添加到$ error [0]。
答案 0 :(得分:17)
PowerShell有一个所谓的PSObject,它是任何.NET对象的包装器(或者它可以是一个完全自定义的对象),当你调用Add-Member时,PowerShell隐含地用PSObject包装真正的.NET对象。 / p>
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的适配器使用键作为属性(kinda)而Add-Member不会用这种对象按预期工作。