Remove a Member from a PowerShell Object?

PowershellPowershell 3.0

Powershell Problem Overview


I need to remove a member (specifically, a NoteProperty) from an object. How do I accomplish this?

Powershell Solutions


Solution 1 - Powershell

Select-Object with ExcludeProperty is good for removing a property from a collection of objects.

For removing a property from a single object this method might be more effective:

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

Solution 2 - Powershell

I don't think you can remove from an existing object but you can create a filtered one.

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

Or

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

This will effectively achieve the same result.

Solution 3 - Powershell

I found the following helps if you're interested in removing just one or two properties from a large object. Convert your object into JSON then back to an object - all the properties are converted to type NoteProperty, at which point you can remove what you like.

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

The conversion to JSON and back creates a PSCustomObject. You'll have the original object expressed and then you can remove as desired.

Solution 4 - Powershell

If can depend on the type of object or collection you want to remove from. Commonly its a Collection (array) of objects like you might get from 'import-csv' which you can do it pretty easily.

$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

The to remove a property from each of these:

$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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTohuwView Question on Stackoverflow
Solution 1 - PowershellRoman KuzminView Answer on Stackoverflow
Solution 2 - PowershellAndy ArismendiView Answer on Stackoverflow
Solution 3 - PowershelljfoscView Answer on Stackoverflow
Solution 4 - PowershellErnie M.View Answer on Stackoverflow