是否从PowerShell对象中删除成员?

是否从PowerShell对象中删除成员?,powershell,powershell-3.0,Powershell,Powershell 3.0,我需要从对象中删除一个成员(特别是NoteProperty)。如何实现这一点?我认为您不能从现有对象中删除,但可以创建一个过滤对象 $obj = New-Object -TypeName PsObject -Property @{ Test = 1} $obj | Add-Member -MemberType NoteProperty -Name Foo -Value Bar $new_obj = $obj | Select-Object -Property Test 或 这将有效地实现相同的

我需要从对象中删除一个成员(特别是NoteProperty)。如何实现这一点?

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

$obj = New-Object -TypeName PsObject -Property @{ Test = 1}
$obj | Add-Member -MemberType NoteProperty -Name Foo -Value Bar
$new_obj = $obj | Select-Object -Property Test


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

选择对象
使用
排除属性
有助于从对象集合中删除属性

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

# 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')

是否可以取决于要从中删除的对象或集合的类型。通常,它是一个对象的集合(数组),类似于您可能从“导入csv”中获得的对象,您可以非常轻松地进行导入

$MyDataCollection = Import-CSV c:\datafiles\ADComputersData.csv
$MyDataCollection
Windows Server : lax2012sql01
IP             : 10.101.77.69
Site           : LAX
OS             : 2012 R2
Notes           : V

Windows Server : sfo2016iis01
IP             : 10.102.203.99
Site           : SFO
OS             : 2012 R2
Notes           : X
要从每个属性中删除属性,请执行以下操作:

$MyDataCollection | ForEach { $_.PSObject.Properties.Remove('Notes') }

Windows Server : lax2012sql01
IP             : 10.101.77.69
Site           : LAX
OS             : 2012 R2

Windows Server : sfo2016iis01
IP             : 10.102.203.99
Site           : SFO
OS             : 2012 R2

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

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

    $mycomplexobject.PSObject.Properties.Remove('myprop')

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

Ah!我使用了
Remove
方法,但无法使其工作,但有必要将其专门应用于包含属性的类。多亏了你们两个。我昨晚和Remove混在一起,据我所知,它并不总是有效的。请尝试
Get Process-id$pid |%{$\u.psobject.properties.remove(“\u nouname”);$\u}{124;%\ u nouname
。它甚至可以与psobject或pscustomobject一起使用,这并不奇怪。OTOH我在get Date上通过DisplayHint获得了它。这是一个很好的观点@KeithHill。我后来也发现有些对象是不可变的,或者至少不能以这种方式更改。如果您尝试手动更改其属性之一,您可能会看到相同的症状,例如
$\uu.\uu NounName=“some new value”
@Tohuw:我认为归根结底,您只能以这种方式删除
NoteProperty
成员。虽然它们通常出现在自定义PS对象上,但PS偶尔也会将
NoteProperty
属性添加到.NET类型(其属性类型为
Property
),例如
[System.DateTime]
上的
DisplayHint
,这就解释了Keith的经验。使用select的缺点是它迫使您输入所需的每个属性,而不是排除一个属性。这对具有大量属性的对象来说可能是一个巨大的负担,
-Property*
部分确实是必要的,或者它不起作用。谢谢你的小费,安迪!虽然我知道你要做什么,但这涉及到很多变异,我不想在上面的方法工作正常且不需要的情况下对对象执行。不需要循环:
$MyDataCollection.PSObject.Properties.Remove('Notes')
也可以做到这一点。
   $mycomplexobject = $mycomplexobject | ConvertTo-Json | ConvertFrom-Json

    $mycomplexobject.PSObject.Properties.Remove('myprop')