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
沒有留言:
張貼留言