2024年11月6日 星期三

PowerShell 如何捕捉 cmdlet 中 Write-Host 的信息到變數上

PowerShell 如何捕捉 cmdlet 中 Write-Host 的信息到變數上

在 PS 中通道其實是有屬於 PS 內自訂的通道, Write-Host 是 6 號通道

所以其實只要把 6 號轉換到 1 號就可以獲取了

function WriteTestMessage {
    Write-Host "這是使用 Write-Host 輸出的測試消息。"
}
$msg = WriteTestMessage 6>&1
Write-Host "msg = $msg"


其他通道的用處

1: Success (成功輸出)

2: Error (錯誤)

3: Warning (警告)

4: Verbose (詳細資訊)

5: Debug (除錯)

6: Information (資訊)


如果要個別獲取貌似只能重新定向到個別檔案上,無法透過 6>$msg 定向到變數獲取

例如 WriteTestMessage 6>"a.txt" 2>"b.txt" 這樣的寫法會直接輸出到檔案上。



這裡比較坑人的是 PS 有自己的流,這裡我先把他稱作為 PS流,與之相似的是與外部程式互動的,我們直接在終端看到的那個我把它稱為 Console流

PS中會同時出現兩種流的,當你呼叫一個外部程式那個外部程式產生的 stderr 是屬於 Console流 而不是 PS流

這不是在繞你啊,舉例來說下面的代碼

$stderr = App.exe 2>&1

嘗試獲取外部的 stderr 但實際上代碼中的 2>&1 所控制的是PS流,所以你啥也拿不到因為外部程式輸出的是Console流

如何獲取 Console流 中的 stderr 解法請參照這篇 CHG: PowerShell 如何捕捉 StdErr 通道的錯誤信息流 的 Invoke-CommandInfo 函式





沒有留言:

張貼留言