哪些对象适合Add-Member?

ale*_*2k8 6 powershell powershell-2.0

文件说明:

将用户定义的自定义成员添加到Windows PowerShell对象的实例.

"Windows PowerShell对象"代表什么?

这很好用:

$obj = new-object system.object
$obj | add-member -membertype noteproperty -name Name -value "OK"
$obj.name
Run Code Online (Sandbox Code Playgroud)

但这不是:

$obj = @{}
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*osh 17

PowerShell有一个所谓的PSObject,它是任何.NET对象的包装器(或者它可以是一个完全自定义的对象),当你调用Add-Member时,PowerShell隐含地用PSObject包装真正的.NET对象.

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
Run Code Online (Sandbox Code Playgroud)

这是因为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
Run Code Online (Sandbox Code Playgroud)

这是因为New-Object隐式地将新实例包装在PSObject中.因此,您的Add-Member调用正在向现有包装器添加成员.

回到第一个示例,您可以通过将其更改为:

$x = [Environment]::OSVersion
$x = $x | Add-Member NoteProperty IsVista $true -PassThru
$x | Format-List   # DOES show the new property
Run Code Online (Sandbox Code Playgroud)

毕竟,Hashtable不按预期方式工作的原因是因为PowerShell对Hashtables进行了特殊处理,基本上Hashtables的适配器使用键作为属性(kinda),而Add-Member将无法按预期工作有了这种对象.