Private/Merge-FslFleetFinding.ps1
|
function Merge-FslFleetFinding { <# .SYNOPSIS Deduplicates identical findings across fleet hosts: same category, check, severity, message and evidence collapse into one finding whose Target lists every affected host. Host-specific findings (differing message or evidence, e.g. log counts) stay separate. #> [CmdletBinding()] [OutputType([pscustomobject])] param( [AllowEmptyCollection()] [object[]]$Finding = @() ) $groups = $Finding | Group-Object { '{0}|{1}|{2}|{3}|{4}' -f $_.Category, $_.Check, $_.Severity, $_.Message, $_.Evidence } foreach ($group in $groups) { $targets = @($group.Group | ForEach-Object { [string]$_.Target } | Select-Object -Unique | Sort-Object) if ($targets.Count -le 1) { $group.Group continue } $first = $group.Group | Select-Object -First 1 New-FslFinding -Category ([string]$first.Category) -Check ([string]$first.Check) -Severity ([string]$first.Severity) ` -Target ($targets -join ', ') ` -Message ("{0} (Affects {1} hosts.)" -f $first.Message, $targets.Count) ` -Evidence ([string]$first.Evidence) ` -Recommendation ([string]$first.Recommendation) ` -HelpUri ([string]$first.HelpUri) } } |