Public/New-EventDataFilter.ps1

function New-EventDataFilter {
    [CmdLetBinding()]
    param(
        [hashtable]$Hashtable
    )

    $EventDataFilter = [System.Text.StringBuilder]::new()
    foreach ($DataType in $Hashtable.Keys) {
        [void]$EventDataFilter.Append('*[{0}' -f $DataType)
        foreach ($FilterType in $Hashtable[$DataType].Keys) {
            [void]$EventDataFilter.Append('[{0}[' -f $FilterType)

            $FilterList = [System.Collections.Generic.List[System.String]]::new()
            if ($Hashtable[$DataType][$FilterType].Keys -contains 'Name') {
                $FilterList.Add('@Name="{0}"]' -f $Hashtable[$DataType][$FilterType]['Name'] )
                $Hashtable[$DataType][$FilterType].Remove('Name')
            }

            foreach ($Filter in $Hashtable[$DataType][$FilterType].Keys) {
                $ArrayList = [System.Collections.Generic.List[System.String]]::new()
                if ($Hashtable[$DataType][$FilterType][$Filter] -is [array]) {
                    foreach ($ItemFromArray in $Hashtable[$DataType][$FilterType][$Filter] ) {
                        if ($ItemFromArray -is [int]) {
                            $ArrayList.Add(('({0}={1})' -f $Filter,$ItemFromArray))
                        } else {
                            $ArrayList.Add(('({0}="{1}")' -f $Filter,$ItemFromArray))
                        }
                    }
                    $FilterList.Add('({0})' -f ($ArrayList -join ' or '))
                } else {
                    if ($Hashtable[$DataType][$FilterType][$Filter] -is [int]) {
                        $ArrayList.Add(('({0}={1})' -f $Filter,$Hashtable[$DataType][$FilterType][$Filter]))
                    } else {
                        $ArrayList.Add(('({0}="{1}")' -f $Filter,$Hashtable[$DataType][$FilterType][$Filter]))
                    }
                    $FilterList.Add('{0}' -f ($ArrayList -join ' or '))
                }
            }
            [void]$EventDataFilter.Append($FilterList -join ' and ')
        }
        $BeginBrace = $EventDataFilter.ToString().Split('[').Count -1
        $EndBrace = $EventDataFilter.ToString().Split(']').Count -1
        $AppendBrace = ']' * ($BeginBrace - $EndBrace)
        [void]$EventDataFilter.Append($AppendBrace)
    }

    $EventDataFilter.ToString()
}