private/Format-ErrorMessage.ps1

function Format-ErrorMessage {
    <#
    .SYNOPSIS
    Format an error message for display in psake.

    .DESCRIPTION
    Format an error message for display in psake. The error message includes the error message, error details, and script variables.

    .PARAMETER ErrorRecord
    The error record to format.

    .EXAMPLE
    Format-ErrorMessage -ErrorRecord $Error[0]

    Formats the error message for the first error in the $Error array.
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(ValueFromPipeline = $true)]
        $ErrorRecord = $Error[0]
    )

    begin {
        $currentConfig = Get-CurrentConfigurationOrDefault
        $dash = "-" * 70
    }

    process {
        Write-Debug "Formatting error message (VerboseError=$($currentConfig.VerboseError))"
        $errorMessage = [System.Text.StringBuilder]::new()
        $date = Get-Date
        if ($currentConfig.VerboseError) {
            [void]$errorMessage.AppendFormat("{0}: An Error Occurred. See Error Details Below:", $date)
            [void]$errorMessage.AppendLine()
            [void]$errorMessage.AppendLine($dash)
            [void]$errorMessage.AppendFormat("Error: {0}", $(Resolve-Error $ErrorRecord -Short))
            [void]$errorMessage.AppendLine()
            [void]$errorMessage.AppendLine($dash)
            [void]$errorMessage.AppendLine($(Resolve-Error $ErrorRecord))
            [void]$errorMessage.AppendLine($dash)
            [void]$errorMessage.AppendLine("Script Variables")
            [void]$errorMessage.AppendLine($dash)
            [void]$errorMessage.AppendLine($(Get-Variable -Scope script | Format-Table | Out-String))
        } else {
            # ($_ | Out-String) gets error messages with source information included.
            [void]$errorMessage.AppendFormat("Error: {0}:", $date)
            [void]$errorMessage.AppendLine()
            [void]$errorMessage.AppendLine("{0}" -f (Resolve-Error $ErrorRecord -Short))
        }
        $errorMessage.ToString()
    }
}