Functions/Compare-ObjectProperty.ps1

function Compare-ObjectProperty {
<#
.SYNOPSIS
    Compares two objects property by property.
.DESCRIPTION
    Compares two objects property by property. A simple Compare-Object only compares those properties with the same name in the two objects.
.PARAMETER ReferenceObject
    The first object to compare
.PARAMETER DifferenceObject
    The second object to compare
.EXAMPLE
    $a = New-Object psobject -Prop ([ordered] @{ One = 1; Two = 2})
    $b = New-Object psobject -Prop ([ordered] @{ One = 1; Two = 2; Three = 3})
 
    Compare-Object $a $b
 
    # would return $null because it only compares the properties that have common names but
 
    Compare-ObjectProperty $a $b
 
    # would return below because it compares the two objects property by property
 
    PropertyName RefValue DiffValue
    ------------ -------- ---------
    Three 3
.OUTPUTS
    [psobject]
.LINK
    Compare-Object
#>


    #region Parameters
    [CmdletBinding(ConfirmImpact = 'None')]
    [OutputType('psobject')]
    Param(
        [Parameter(Mandatory, HelpMessage = 'First object to compare', Position = 0)]
        [PSObject] $ReferenceObject,

        [Parameter(Mandatory, HelpMessage = 'Second object to compare', Position = 1)]
        [PSObject] $DifferenceObject
    )
    #endregion Parameters

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
        $objprops = New-Object -TypeName System.Collections.ArrayList
    }

    process {
        $null = $objprops.AddRange(($ReferenceObject | Get-Member -MemberType Property, NoteProperty).Name)
        $null = $objprops.AddRange(($DifferenceObject | Get-Member -MemberType Property, NoteProperty).Name)
        $objprops = $objprops | Sort-Object | Select-Object -Unique
        $diffs = New-Object -TypeName System.Collections.ArrayList
        foreach ($objprop in $objprops) {
            $diff = Compare-Object -ReferenceObject $ReferenceObject -DifferenceObject $DifferenceObject -Property $objprop
            if ($diff) {
                $diffprops = @{
                    PropertyName = $objprop
                    RefValue     = ($diff | Where-Object { $_.SideIndicator -eq '<=' } | ForEach-Object $($objprop))
                    DiffValue    = ($diff | Where-Object { $_.SideIndicator -eq '=>' } | ForEach-Object $($objprop))
                }
                $null = $diffs.Add((New-Object -TypeName PSObject -Property $diffprops))
            }
        }
        if ($diffs) {
            $diffs | Select-Object -Property PropertyName, RefValue, DiffValue
        }
    }

    end {
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }

}