# Compare-PSObject # # Better compare of two PSObjects based on the values of all properties # Compares alle properties of all objects as strings # # 20220605 - Initial Version Frank Carius www.msxfaq.de # 20231106 - Erweiterung auf Pipelineunterstützung [CmdletBinding()] param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] $ReferenceObject, $DifferenceObject, $Properties, [string]$headerproperty = $null, [switch]$ExludeEqual , [switch]$ExcludeDifferent = $false ) begin{ Write-Verbose "Compare-PSObject: START Begin" $objectlist=@() } process { Write-Verbose "Compare-PSObject: START Process" if ($null -eq $DifferenceObject) { Write-Verbose "Loading objects from pipeline" $objectlist += $ReferenceObject } else { Write-Verbose "Loading objects from parameters" $objectlist += $ReferenceObject $objectlist += $DifferenceObject } } end { Write-Verbose "Compare-PSObject: START end" Write-Verbose "ObjectCount: $($objectlist.count)" if ($objectlist.count -gt 2) { Write-Warning "Only comparing the first two objects" } [hashtable]$propertylist=@{} if ($null -eq $Properties) { Write-Verbose " Collecting Properties" $count=0 foreach ($object in $objectlist) { $count++ Write-Verbose " Collect Properties of Object $($count)" $object | get-member -Type property | ForEach-Object { if (!$propertylist.ContainsKey($_.name)){ Write-Verbose "Add Property $($_.name)" $propertylist[$_.name]="1" } } } } else { Write-Verbose "Use given Properties" foreach ($property in $Properties) { $propertylist[$property]="1" } } Write-Verbose "Total Properties to compare $($propertylist.count)" [array]$result=@() foreach ($property in $propertylist.keys) { Write-Verbose "Compare $($property)" $resultline = New-Object -TypeName PSCustomObject $resultline | Add-Member -MemberType NoteProperty -Name "Property" -Value $property $count=0 $property0 = [string]($objectlist[0].$property) $property1 = [string]($objectlist[1].$property) if ($property0 -eq $property1) { $resultline | Add-Member -MemberType NoteProperty -Name SideIndicator -Value "==" } elseif ((!$property0) -and ($property1)) { $resultline | Add-Member -MemberType NoteProperty -Name SideIndicator -Value "<-" } elseif (($property0) -and (!$property1)) { $resultline | Add-Member -MemberType NoteProperty -Name SideIndicator -Value "->" } else { $resultline | Add-Member -MemberType NoteProperty -Name SideIndicator -Value "<>" } foreach ($object in $objectlist) { $count++ if ($headerproperty) { $resultline | Add-Member -MemberType NoteProperty -Name $object.$headerproperty -Value $object.$property } else { $resultline | Add-Member -MemberType NoteProperty -Name $count -Value $object.$property } } if ($ExcludeDifferent -and ($resultline."SideIndicator" -ne "==")) { Write-Verbose "ExludeDifferent" } if ($ExludeEqual -and $resultline."SideIndicator" -eq "==") { Write-Verbose "ExludeEqual" } else { Write-Verbose "AddLine $($resultline.Property)" $result+=$resultline } } $result Write-Verbose "Compare-PSObject: END" }