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 函式