从PowerShell对象中删除成员?

Toh*_*huw 40 powershell powershell-3.0

我需要从对象中删除一个成员(特别是一个NoteProperty).我该如何做到这一点?

Rom*_*min 52

Select-Objectwith ExcludeProperty适用于从对象集合中删除属性.

要从单个对象中删除属性,此方法可能更有效:

# new object with properties Test and Foo
$obj = New-Object -TypeName PSObject -Property @{ Test = 1; Foo = 2 }

# remove a property from PSObject.Properties
$obj.PSObject.Properties.Remove('Foo')
Run Code Online (Sandbox Code Playgroud)

  • 昨晚我正在搞乱删除,从我可以说它并不总是有效.尝试`Get-Process -id $ pid | %{$ _.psobject.properties.remove('__ NounName'); $ _} | %__ NameName`.它甚至可以与psobject或pscustomobject一起工作也就不足为奇了.OTOH我可以在Get-Date上使用DisplayHint获取它. (2认同)
  • @Tohuw:我认为它归结为你只能通过这种方式删除`NoteProperty`成员.虽然它们通常在自定义PS对象上找到,但PS偶尔也会向.NET类型(其属性类型为`Property`)添加`NoteProperty`属性,例如``System.DateTime]`上的`DisplayHint`,这解释了Keith的经验. (2认同)
  • 使用select的缺点是它会迫使您输入*您想要的每个*属性,而不是排除一个属性。这会对具有许多属性的对象造成巨大负担 (2认同)

And*_*ndi 17

我认为您不能从现有对象中删除,但可以创建已过滤的对象.

$obj = New-Object -TypeName PsObject -Property @{ Test = 1}
$obj | Add-Member -MemberType NoteProperty -Name Foo -Value Bar
$new_obj = $obj | Select-Object -Property Test
Run Code Online (Sandbox Code Playgroud)

要么

$obj | Select-Object -Property * -ExcludeProperty Foo
Run Code Online (Sandbox Code Playgroud)

这将有效地实现相同的结果.

  • 部分`-Property*`是非常必要的,或者它不起作用.谢谢你提示安迪! (10认同)

jfo*_*osc 8

如果您有兴趣从大对象中删除一两个属性,我发现以下内容会有所帮助。将您的对象转换为 JSON,然后再转换回对象 - 所有属性都转换为 NoteProperty 类型,此时您可以删除您喜欢的内容。

   $mycomplexobject = $mycomplexobject | ConvertTo-Json | ConvertFrom-Json

    $mycomplexobject.PSObject.Properties.Remove('myprop')
Run Code Online (Sandbox Code Playgroud)

到 JSON 和返回的转换会创建一个 PSCustomObject。您将表达原始对象,然后您可以根据需要删除。