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将无法按预期工作有了这种对象.
| 归档时间: |
|
| 查看次数: |
2539 次 |
| 最近记录: |