functions/New-FilteredExceptionFile.ps1

<#
.SYNOPSIS
    This function filters exemptions from a CSV file based on relevant policy assignments and outputs the filtered exemptions to a new CSV file.
.DESCRIPTION
    The New-FilteredExceptionFile function takes a CSV file of exemptions and filters it based on relevant policy assignments found in the Definitions folder.
    The filtered exemptions are then output to a new CSV file in the specified Output folder.
.PARAMETER ExemptionsCsv
    The path to the CSV file containing the exemptions.
.PARAMETER OutputFolder
    The path to the Output directory. Defaults to './Output'.
.PARAMETER DefinitionsFolder
    The path to the Definitions directory. Defaults to './Definitions'.
.EXAMPLE
    New-FilteredExceptionFile -ExemptionsCsv "C:\path\to\exemptions.csv"
    This example filters the exemptions from the specified CSV file and outputs the filtered exemptions to the default Output folder.
#>

function New-FilteredExceptionFile {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, HelpMessage = "The path to the CSV file containing the exemptions.")]
        [string]
        $ExemptionsCsv,
        [Parameter(Mandatory = $false, HelpMessage = "The path to the Output directory. Defaults to './Output'.")]
        [string]
        $OutputFolder = './Output',
        [Parameter(Mandatory = $false, HelpMessage = "The path to the Definitions directory. Defaults to './Definitions'.")]
        [string]
        $DefinitionsFolder = './Definitions'
    )

    $environment = Split-Path (Split-Path (Resolve-Path $ExemptionsCsv).path ) -Leaf
    $outputCsv = Join-Path $OutputFolder 'UpdatedExemptions' $environment 'active-exemptions.csv'
    $Definitions = $DefinitionsFolder
    if(!(Test-Path $(Split-Path $outputCsv))){
        New-Item -ItemType Directory -Path $(Split-Path $outputCsv) -Force
    }
    $relevantExemptionList = @()
    $activeExemptionsList = Get-Content  $ExemptionsCsv | ConvertFrom-Csv 
    $assignmentList = Get-ChildItem `
        -Path $(Join-Path (Resolve-Path $Definitions) 'policyAssignments') `
        -Include '*.json', '*.jsonc' `
        -Recurse

    $policyAssignmentContent = [ordered]@{}
    foreach($assignment in $assignmentList){
        $policyAssignmentContent.Add($assignment.FullName, `
            $(Get-Content $assignment.FullName `
            | ConvertFrom-Json -AsHashtable -Depth 100)) 
    }

    foreach($exemption in $activeExemptionsList){
        try{
            $exemptionAssignment = Split-Path $exemption.policyAssignmentId -Leaf
        }
        catch{
            Write-Error "Error: $($_.Exception.Message)"
        }
        if($policyAssignmentContent.values.assignment.name -contains $exemptionAssignment){
            write-host " $($exemption.name) is relevant, importing"
            $relevantExemptionList += $exemption
        }
    }
    $relevantExemptionList | Export-Csv -Path $outputCsv -NoTypeInformation
    return "Processed $outputCsv"
}