Public/Write-Error.ps1

# Proxy function that wraps the original command
function Write-Error {
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidOverwritingBuiltInCmdlets", "")]
    param (
        [Parameter(Mandatory = $true)]
        [string]$Message
    )

    # Additional functionality before calling the original command

    # ...
    # Add Stream Prefix
    $FullStreamMessage = @()
    if ($PSLogProxySetting.AddStreamPrefixDateTimeString) { $FullStreamMessage += $Script:PSLogProxySetting.DateTimeStringScriptblock.Invoke() }
    if ($PSLogProxySetting.AddStreamPrefixInvocationScript) { if ($MyInvocation.ScriptName) { $FullStreamMessage += (Split-Path $MyInvocation.ScriptName -Leaf) -Replace "\.ps.{0,1}1", "" } }
    $FullStreamMessage += $Message
    $PSBoundParameters.Message = $FullStreamMessage -join $PSLogProxySetting.PrefixDelimiter

    # Run PSLogProxyFeature commands
    Foreach ($Feature in ($Script:PSLogProxyFeature | Where-Object Enabled -eq $true)) {
        # Add Feature Prefix
        $FeatureSettings = ($PSLogProxyFeature | Where-Object Name -EQ $Feature.Name).Settings
        if ($FeatureSettings.ExcludeMessageRegex.Count -gt 0 -and $Message -match ($FeatureSettings.ExcludeMessageRegex -join '|')) { continue }
        $FullFeatureMessage = @()
        if ($FeatureSettings.AddPrefixDateTimeString) { $FullFeatureMessage += $Script:PSLogProxySetting.DateTimeStringScriptblock.Invoke() }
        if ($FeatureSettings.AddPrefixStream) { $FullFeatureMessage += $MyInvocation.MyCommand.Noun }
        if ($FeatureSettings.AddPrefixInvocationScript) { if ($MyInvocation.ScriptName) { $FullFeatureMessage += (Split-Path $MyInvocation.ScriptName -Leaf) -Replace "\.ps.{0,1}1", "" } }
        $FullFeatureMessage += $Message
        $FeatureMessage = $FullFeatureMessage -join $PSLogProxySetting.PrefixDelimiter
        # Invoke Feature
        $ReplacedFeatureCommand = $ReplaceFeatureCommand.Invoke($Feature.CommandString, $MyInvocation.MyCommand.Noun, $FeatureMessage) #where args[0] = PSLogProxyFeature Command (see above) / $args[1] = Stream / $args[2] = LogMessage
        $SB = [ScriptBlock]::Create($ReplacedFeatureCommand)
        $SB.Invoke()
    }

    # Call the original command with modified parameters if needed
    # Write-InternError -Message $Message
    # Original command code
    $PSCmdlet.WriteError((New-Object System.Management.Automation.ErrorRecord(
        ([System.Exception]::new($Message)),
                'CustomErrorID',
                'WriteError',
                $null
            )))

    # Additional functionality after calling the original command
    # ...
}