哪些对象适合Add-Member?

时间:2009-04-28 14:27:01

标签: powershell powershell-v2.0

文档说明:

  

添加用户定义的自定义成员   Windows PowerShell的一个实例   对象

“Windows PowerShell对象”代表什么?

这很好用:

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

但这不是:

$obj = @{}

实际上,我正在尝试将属性添加到$ error [0]。

1 个答案:

答案 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不会用这种对象按预期工作。