2024年11月6日 星期三

PowerShell 如何捕捉 StdErr 通道的錯誤信息流

PowerShell 如何捕捉 StdErr 通道的錯誤信息流

這個要依靠 [Console]::SetError() 重設當前的流就可以捕捉到了


廢話不多說直接上代碼

function Get-StdErrOutput {
    param (
        [ScriptBlock]$ScriptBlock
    )

    # 創建 StringWriter 捕捉錯誤輸出
    $enc = [Console]::Error.Encoding
    $sw = New-Object System.IO.StringWriter
    [Console]::SetError($sw)

    try {
        & $ScriptBlock
    } finally {
        # 重置錯誤輸出流
        $originalErrorStream = [IO.StreamWriter]::new([Console]::OpenStandardError(), $enc)
        $originalErrorStream.AutoFlush = $true
        [Console]::SetError($originalErrorStream)
    }

    # 取得錯誤訊息並釋放資源
    $errorOutput = $sw.ToString() -replace "(`r?`n)$", ""
    $sw.Dispose()

    return $errorOutput
}


這是已經寫成函式的代碼下面是用例子

# 捕獲標準錯誤輸出
$std = Get-StdErrOutput {
    [Console]::Error.WriteLine("這是使用 Console.Error 輸出的測試消息。")
}

# 顯示捕獲到的錯誤訊息
Write-Host "Captured Error output = $std"

# 確認是否有復原原本的錯誤輸出
[Console]::Error.WriteLine("確認是否有復原原本的錯誤輸出") | Out-Null


此一來就可以把 stderr 的錯誤信息流輸出擷取到變數裡面了



如果要獲取外部程式的這裡也有個函式可以參考

SSHKeyLoader/SSHKeyLoader.ps1 at main · hunandy14/SSHKeyLoader



沒有留言:

張貼留言