Private/NestedFunctions/Hide-ObjectProperty.ps1

<#
.DESCRIPTION
This function will digest any object and set configure wether or not its properties will show by default when you call it.
.EXAMPLE
In this example you will need to replace the "$HiddenProperties" array and object name "$SomeObject".
$ObjectOutput += [PSCustomObject]@{
    'Var1' = 'Hello;
    'Var2' = 'World';
    'Var3' = '!';
}
# List values to add to results
$HiddenProperties = @('Var2','Var3')
# Append meta info to results
Get-Variable -Name:($HiddenProperties) |
    ForEach-Object {
    $Variable = $_
    $SomeObject |
        ForEach-Object {
        Add-Member -InputObject:($_) -MemberType:('NoteProperty') -Name:($Variable.Name) -Value:($Variable.Value)
    }
}
# Set the meta info to be hidden by default
$Results += Hide-ObjectProperty -Object:($Result) -HiddenProperties:($HiddenProperties)
#>

Function Hide-ObjectProperty
{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $true, Position = 0)][ValidateNotNullOrEmpty()][Object]$Object,
        [Parameter(Mandatory = $true, Position = 1)][ValidateNotNullOrEmpty()][Array]$HiddenProperties
    )
    # Set some properties to be hidden in the results
    $Object | ForEach-Object {
        $Record = $_
        # Get current object's properties
        $ObjectAllProperties = $_.PSObject.Properties.Name
        # Write-Host ('ObjectAllProperties:' + ($ObjectAllProperties -join ', ')) -BackgroundColor Gray -ForegroundColor Black
        # If current object has PSStandardMembers then get it's default set and add its hidden properties to PropertiesToHide
        If ($_.PSStandardMembers)
        {
            $ObjectShowProperties = $_.PSStandardMembers.DefaultDisplayPropertySet.ReferencedPropertyNames
            $PropertiesToHide = @($ObjectAllProperties | Where-Object {$_ -notin $ObjectShowProperties -or $_ -in $HiddenProperties})
            # Write-Host ('ObjectShowProperties:' + ($ObjectShowProperties -join ', ')) -BackgroundColor Yellow -ForegroundColor Black
        }
        Else
        {
            $PropertiesToHide = @($HiddenProperties)
        }
        # Get list of properties to show
        $PropertiesToShow = $ObjectAllProperties | Where-Object {$_ -notin $PropertiesToHide}
        # Write-Host ('PropertiesToHide:' + ($PropertiesToHide -join ', ')) -BackgroundColor Yellow -ForegroundColor Black
        # Write-Host ('PropertiesToShow:' + ($PropertiesToShow -join ', ')) -BackgroundColor Green -ForegroundColor Black
        # Create the default property display set
        If ($PropertiesToShow)
        {
            $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet', [System.String[]]$PropertiesToShow)
            $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
            # Add the list of standard members
            Add-Member -InputObject:($_) -MemberType:('MemberSet') -Name:('PSStandardMembers') -Value:($PSStandardMembers) -Force
            ForEach ($HiddenProperty In $PropertiesToHide)
            {
                If($HiddenProperty -in $_.PSObject.Properties.Name)
                {
                    Add-Member -InputObject:($_) -MemberType:('NoteProperty') -Name:($HiddenProperty) -Value:($Record.$HiddenProperty) -Force
                }
            }
        }
        Else
        {
            Throw ('By hiding "' + ($PropertiesToHide -join '", "') + '" there are no properties to show. At least one property must be visitable.')
        }
    }
    If ($Object)
    {
        Return $Object
    }
}