簡體   English   中英

Powershell 腳本輸出到變量 - 捕獲 Write-Host 輸出

[英]Powershell Script output to variable - capture Write-Host output

使用此腳本: https ://github.com/byterogues/powershell-bittrex-api 我從另一個腳本調用它。

例如

$order = .\bittrex-api.ps1 -action buylimit -market BTC-TX -quantity 1 -rate 0.00011300

bittrex-api.ps1 捕獲錯誤並在屏幕上顯示

BITTREX 錯誤:API 查詢返回錯誤。 錯誤信息:MIN_TRADE_REQUIREMENT_NOT_MET

如何將 bittrex-api.ps1 的輸出捕獲到一個變量中,以便我可以在我的基本腳本中使用這個變量?

你不能。 該腳本使用Write-Host輸出錯誤。 Write-Host只向控制台寫入文本,它不返回任何對象,這意味着沒有什么可捕獲的。

我建議修改腳本以使用其他 cmdlet,如Write-ErrorWrite-Output或任何其他Write-*輸出到流(您可以重定向到 stdout-stream 並保存)。

參見http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

為了補充Frode F. 的有用答案,它明智地建議修改腳本以使用Write-Error進行錯誤報告:

如果修改代碼不是一個選項並且您正在使用PSv5+可以捕獲Write-Host output ,因為因為 PSv5 Write-Host寫入新引入的信息輸出流( Write-Information主要用於寫入):

PowerShell 的輸出流是有編號的,信息流的編號是6 ,因此輸出重定向表達式6>&1將信息流重定向到編號為1的成功輸出流,允許在變量中進行常規捕獲,如下例所示:

# PSv5+

$captured = Write-Host 'write-host output' 6>&1

$captured # output what was captured -> 'write-host output'

要了解有關 PowerShell 的輸出流和重定向的更多信息,請運行Get-Help about_Redirection

筆記:

  • 通過6>&1捕獲Write-Host輸出由一個或多個System.Management.Automation.InformationRecord實例組成,它們打印時就好像它們是字符串一樣,即通過它們的.MessageData.Message屬性值,這是參數的字符串內容( s) 傳遞給Write-Host

  • 因此,任何源於使用-ForegroundColor-BackgroundColor參數的着色不會(直接)通過:

    • 但是,信息保留,即在.MessageData.ForegroundColor.MessageData.BackgroundColor屬性中,以及有關-NoNewLine是否傳遞給Write-Host的信息,在布爾屬性.MessageData.NoNewLine

    • 這個答案展示了如何從捕獲的對象中重新創建原始顏色。

  • 相比之下,保留了通過嵌入在原始字符串參數中的ANSI / VT 轉義序列進行着色。


注意:要捕獲輸出並將其傳遞(到成功輸出流),您有兩個選擇:

  • 只需將語句括在(...)中,但請注意,只有在所有輸出都已收集后才會顯示輸出。

     ($captured = Write-Host 'write-host output' 6>&1)
  • 對於流式傳遞,請使用帶有-Variable參數的Tee-Object

     Write-Host 'write-host output' 6>&1 | Tee-Object -Variable captured

上述技術通常適用於捕獲和傳遞成功流輸出,無論是否涉及重定向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM