![](/img/trans.png)
[英]Powershell Script output to variable - capture Write-Host output
[英]PowerShell Capture Write-Host output
我必須運行 Microsoft cmdlet,並且使用 cmdlet 中的 Write-Host 行將重要信息寫入控制台。
它沒有返回,所以我不能做 $result = Commandlet ......返回了一個對我沒有用的不同值,我實際需要的是打印到命令行開關中的控制台,無論如何我可以“嗅探”或“抓取'控制台以獲取我想要的信息?
$result = Test-Cluser
Test-Cluster 將打印如下內容:'HadUnselectedTests'、'ClusterConditionallyApproved' 等。但它在 .htm 報告文件的路徑中返回的值。 不幸的是,.htm 報告文件不包含這些狀態代碼之一,所以我也不能只為它解析 .htm 文件。
有什么建議?
注意:至於為什么不應該使用Write-Host
輸出數據,請參閱此答案。
在PSv5+ 中:
$result = Test-Cluster 6>&1
從版本 5 開始, Write-Host
寫入新引入的信息流,其編號為6
。
6>&1
將該流重定向到成功輸出流(編號1
),以便它也可以在$result
捕獲。
在PSv4- 中:
無法在會話中捕獲Write-Host
輸出。
唯一的解決方法是使用指定為string的目標命令啟動另一個 Powershell 實例。
注意事項:
Get-Help about_Redirection
$result = powershell -noprofile -command 'Test-Cluster'
需要注意的是使用腳本塊來傳遞命令( -command { Test-Cluster }
)是行不通的,因為PowerShell中則使用了序列化和反序列化,以模擬在會話的行為。
Get-Help about_Redirection
討論了所有輸出流的列表,可以通過它們的數字來定位; 從 PSv5 開始,這些是:
1 ... success output stream (implicit output and Write-Output output)
2 ... error output stream (Write-Error and unhandled errors)
3 ... warnings (Write-Warning)
4 ... verbose output (Write-Verbose)
5 ... debug output (Write-Debug)
6 ... (v5+) Write-Information and Write-Host output
請注意,某些流默認情況下是靜默的,需要選擇加入以通過首選項變量(例如$VerbosePreference
)或公共參數(例如-Verbose
)來生成輸出
{n}>
允許重定向數字{n}
流; 如果省略{n}
,則隱含1
:
3> c:/tmp/warnings.txt
3> $null
)3>&1
); 注意:只能以這種方式定位流1
。 *>
以所有輸出流為目標。
注:不同於POSIX樣彈(如bash
),多重定向表達的順序並不重要。
因此,以下類似 POSIX 的 shell 習慣用法 - 將錯誤輸出重定向到成功流並僅使原始成功輸出靜音 - 不起作用:
... 2>&1 1>$null # !! NO output in PowerShell
要在 PowerShell 中實現這一點,您不能重定向1
,而是通過源流過濾成功中的對象。
舉個例子:最后,OP 想要以下內容:只捕獲警告輸出,沒有常規(成功)輸出:
Test-Cluster 3>&1 | Where-Object { $_ -is [System.Management.Automation.WarningRecord] }
來自警告流的對象具有[System.Management.Automation.WarningRecord]
類型,這是啟用上述過濾的原因。
我使用 *> 而不是 > 將所有輸出從控制台重定向到文件。
將文本和變量重定向到文件的示例:
""+$set_groups+"ADGroup 設置!" | Out-File -FilePath $log_path -Append
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.