param( [Parameter(Mandatory)] $oldFeatures, [Parameter(Mandatory)] $newFeatures ) $result = @() foreach ($newFeature in $newFeatures) { $oldFeature = $oldFeatures | Where-Object Name -eq $newFeature.Name if (-not $oldFeature) { $result += [pscustomobject]@{ ChangeType = 'Added' Name = $newFeature.Name DisplayName = $newFeature.DisplayName OldValue = $null NewValue = $newFeature.InstallState } continue } if ($oldFeature.InstallState -ne $newFeature.InstallState) { $result += [pscustomobject]@{ ChangeType = 'Changed' Name = $newFeature.Name DisplayName = $newFeature.DisplayName OldValue = $oldFeature.InstallState NewValue = $newFeature.InstallState } } } foreach ($oldFeature in $oldFeatures) { if ($oldFeature.Name -notin $newFeatures.Name) { $result += [pscustomobject]@{ ChangeType = 'Removed' Name = $oldFeature.Name DisplayName = $oldFeature.DisplayName OldValue = $oldFeature.InstallState NewValue = $null } } } $result