TaskFunctions/Invoke-PlumberPSScriptAnalyzer.ps1

function Invoke-PlumberPSScriptAnalyzer {
    <#
        .SYNOPSIS
        Runs the PSScriptAnalyzer task body.
    #>

    [CmdletBinding()]
    param ()

    $scriptFiles = @(
        Get-PlumberTaskFile -Task PSScriptAnalyzer -Extension '.ps1', '.psd1', '.psm1'
    )

    if (-not $script:PlumberConfig.Tasks.PSScriptAnalyzer.IncludeTests) {
        $testRoot = [System.IO.Path]::GetFullPath((Join-Path $BuildRoot 'Tests')).TrimEnd(
            [System.IO.Path]::DirectorySeparatorChar,
            [System.IO.Path]::AltDirectorySeparatorChar
        )
        $testRootWithSeparator = "$testRoot$([System.IO.Path]::DirectorySeparatorChar)"
        $scriptFiles = @(
            $scriptFiles |
                Where-Object {
                    -not $_.FullName.Equals(
                        $testRoot,
                        [System.StringComparison]::OrdinalIgnoreCase
                    ) -and
                    -not $_.FullName.StartsWith(
                        $testRootWithSeparator,
                        [System.StringComparison]::OrdinalIgnoreCase
                    )
                }
        )
    }

    $settingsPath = Join-Path $BuildRoot 'PSScriptAnalyzerSettings.psd1'
    $settingsSplat = if (Test-Path $settingsPath) { @{ Settings = $settingsPath } } else { @{} }
    $scriptFailures = foreach ($file in $scriptFiles) {
        try {
            Invoke-ScriptAnalyzer $file.FullName @settingsSplat -ErrorAction Stop
        }
        catch {
            [pscustomobject]@{
                ScriptName = $file.Name
                Line       = 0
                RuleName   = 'InvokeScriptAnalyzer'
                Message    = $_.Exception.Message
            }
        }
    }

    $failures = foreach ($failure in $scriptFailures) {
        (
            "$($failure.ScriptName):$($failure.Line) - " +
            "$($failure.RuleName) - $($failure.Message)"
        )
    }
    if ($failures) {
        Write-Error ($failures -join (', ' + [Environment]::NewLine))
    }
}