【问题标题】:Remove a Member from a PowerShell Object?从 PowerShell 对象中删除成员?
【发布时间】:2013-07-28 02:56:54
【问题描述】:

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

【问题讨论】:

    标签: powershell powershell-3.0


    【解决方案1】:

    Select-ObjectExcludeProperty 适用于从对象集合中删除属性。

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

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

    【讨论】:

    • 啊!我正在使用Remove 方法进行工具化,但无法让它工作,但你必须将它专门应用于具有属性的类是有道理的。谢谢你们俩。
    • 昨晚我搞砸了 Remove,据我所知,它并不总是有效。试试Get-Process -id $pid | % { $_.psobject.properties.remove('__NounName'); $_} | % __NounName。它甚至可以与 psobject 或 pscustomobject 一起使用也就不足为奇了。 OTOH,我能够在 Get-Date 上使用 DisplayHint 获得它。
    • 这是一个很好的观点@KeithHill。后来我也发现有些对象是不可变的,或者至少不能以这种方式改变。如果您尝试手动更改其属性之一,您可能会看到相同的症状,例如$_.__NounName = "some new value"
    • @Tohuw:我认为归根结底是您只能通过这种方式删除NoteProperty 成员。虽然它们通常出现在自定义 PS 对象上,但 PS 偶尔也会将 NoteProperty 属性添加到 .NET 类型(其属性为 Property 类型),例如 [System.DateTime] 上的 DisplayHint,这解释了 Keith 的经验。跨度>
    • 使用 select 的缺点是它会强制您输入 您想要的每个属性,而不是排除一个属性。这对于具有大量属性的对象来说可能是一个巨大的负担
    【解决方案2】:

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

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

    或者

    $obj | Select-Object -Property * -ExcludeProperty Foo
    

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

    【讨论】:

    • -Property * 部分是真的有必要,否则不起作用。感谢安迪的提示!
    【解决方案3】:

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

       $mycomplexobject = $mycomplexobject | ConvertTo-Json | ConvertFrom-Json
    
        $mycomplexobject.PSObject.Properties.Remove('myprop')
    

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

    【讨论】:

    • 虽然我知道你在那里做什么,但当上述方法工作正常且不需要时,我不想对对象执行大量突变。
    【解决方案4】:

    如果可以取决于您要从中删除的对象或集合的类型。通常它是一个对象的集合(数组),就像您可能从“import-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
    

    【讨论】:

    • 不需要循环:$MyDataCollection.PSObject.Properties.Remove('Notes') 也可以。
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2020-05-11
    • 2022-10-17
    • 2013-05-12
    • 2016-10-26
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    相关资源
    最近更新 更多