Functions/Compare-ObjectSetDifference.ps1
function Compare-ObjectSetDifference { <# .SYNOPSIS Compares 2 arrays of strings and returns The SET DIFFERENCE of the arrays .DESCRIPTION Compares 2 arrays of strings and returns The SET DIFFERENCE of the arrays. Optionally case sensitive. .PARAMETER ReferenceObject The array that is the baseline. Aliased to 'RO', 'Left' .PARAMETER DifferenceObject The array that is being compared to the baseline set. Aliased to 'DO', 'Right' .PARAMETER CaseSensitive Switch indicating that a case sensitive comparison should be made. Aliased to 'CS' .EXAMPLE Compare-ObjectSetDifference -ReferenceObject a,b,c -DifferenceObject a,c -CaseSensitive b .EXAMPLE Compare-ObjectSetDifference -ReferenceObject a,b,c -DifferenceObject a,b,C -CaseSensitive c .EXAMPLE Compare-ObjectSetDifference -ReferenceObject a,b,c -DifferenceObject a,b,D c .EXAMPLE Compare-ObjectSetDifference -ReferenceObject a,b,c -DifferenceObject a,b,C $null .NOTES Inspired by: https://sqljana.wordpress.com/2015/09/23/perform-set-operations-union-intersection-minus-complement-using-powershell/ http://www.cs.odu.edu/~toida/nerzic/content/set/set_operations.html http://www.dummies.com/how-to/content/find-the-union-intersection-relative-complement-an.html Added PSReviewUnusedParameter to prevent Invoke-ScriptAnalyzer from returning a false positive #> [CmdletBinding()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '')] [outputtype('psobject')] param ( [Alias('RO', 'Left')] [string[]] $ReferenceObject, [Alias('DO', 'Right')] [string[]] $DifferenceObject, [Alias('CS')] [switch] $CaseSensitive ) begin { Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]" } process { if ($CaseSensitive) { $ReferenceObject | where-object { -not ($_ -cin $DifferenceObject) } } else { $ReferenceObject | where-object { -not ($_ -in $DifferenceObject) } } } end { Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]" } } |