Functions/GenXdev.Coding.PowerShell.Modules/Invoke-GenXdevScriptAnalyzer.ps1

function Invoke-GenXdevScriptAnalyzer {
    [CmdletBinding(DefaultParameterSetName = 'Path')]
    param (
        # Use -Path for file-based analysis and -ScriptDefinition for script content analysis.
        [Parameter(
            Position = 0,
            Mandatory = $true,
            ParameterSetName = 'Path',
            HelpMessage = 'Specifies the path to the script file.')]
        [string] $Path,

        [Parameter(
            Mandatory = $true,
            ParameterSetName = 'Script',
            HelpMessage = 'Specifies the script definition as a string.'
        )]
        [string] $ScriptDefinition,

        [Parameter(HelpMessage = 'Specifies that the tool should exit on error.')]
        [switch] $EnableExit,

        [Parameter(HelpMessage = 'Enables automatic fixing of violations.')]
        [switch] $Fix,

        [Parameter(HelpMessage = 'Recursively process files.')]
        [switch] $Recurse,

        [Parameter(HelpMessage = 'Reports a summary after analysis.')]
        [switch] $ReportSummary
    )

    begin {

        $settings = Invoke-Expression ([IO.File]::ReadAllText((Expand-Path "$PSScriptRoot\PSScriptAnalyzerSettings.psd1")))

        # Write-Verbose "Using Script Analyzer settings:`n$($invocationParams.Settings | ConvertTo-Json -Depth 5)"
    }

    process {
        try {
            $invocationParams = $null

            # check paramset
            if ($PSCmdlet.ParameterSetName -eq 'Path') {
                $invocationParams = @{
                    Path                  = $Path
                    IncludeRule           = $settings.IncludeRules
                    ExcludeRule           = $settings.ExcludeRules
                    CustomRulePath        = $settings.CustomRulePath
                    IncludeDefaultRules   = $settings.IncludeDefaultRules
                    RecurseCustomRulePath = $settings.RecurseCustomRulePath
                    # Severity = $settings.Severity
                    Recurse               = !!$Recurse
                    Fix                   = !!$Fix
                    EnableExit            = !!$EnableExit
                    ReportSummary         = !!$ReportSummary
                    # Verbose = $true
                    # ErrorAction = "Continue"
                }
            }
            else {
                $invocationParams = @{
                    ScriptDefinition      = $ScriptDefinition
                    IncludeRule           = $settings.IncludeRules
                    ExcludeRule           = $settings.ExcludeRules
                    # Severity = $settings.Severity

                    CustomRulePath        = $settings.CustomRulePath
                    IncludeDefaultRules   = $settings.IncludeDefaultRules
                    RecurseCustomRulePath = $settings.RecurseCustomRulePath
                    Recurse               = !!$Recurse
                    Fix                   = !!$Fix
                    EnableExit            = !!$EnableExit
                    ReportSummary         = !!$ReportSummary
                    # ErrorAction = "Continue"
                }
            }

            $results = @(PSScriptAnalyzer\Invoke-ScriptAnalyzer @invocationParams)

            if ($results -and ($results.Length -gt 0)) {

                $results | ForEach-Object {
                    $r = $_ | ConvertTo-HashTable
                    $r.Description = (Get-ScriptAnalyzerRule -Name $r.RuleName).Description
                    Write-Output $r
                }
            }
        }
        catch {
            Write-Output @{
                Message     = $_.Exception.Message
                RuleName    = ($Null -eq $Path ? "?" : [IO.Path]::GetFileNameWithoutExtension($Path)) + " @ Invocation in Invoke-GenXdevScriptAnalyzer"
                Description = "An error occurred while invoking the Script Analyzer."
            }
        }
    }

    end {
    }
}