2014-03-19 137 views
0

是否有將控制檯輸出重定向到變量(不是文件)的powershell cmdlet?在powershell中如何在將命令輸出到命令時獲取命令輸出?

我需要將變量的內容傳遞給二進制的命令行,並將二進制的控制檯響應收集到另一個變量中,但無法弄清楚。

例如,當失敗

$MyP4Client | p4 client -i 

要中止上的錯誤,我需要把一個try/catch一輪,然後收集並檢查Perforce公司的p4.exe返回一個文本錯誤消息的OK狀態來自p4的控制檯輸出。 當沒有輸入重定向參與,我可以做到這一點得到P4的控制檯輸出到一個變量:

Try { 
    $P4response = & 'p4' sync -f //depot/myfiles/... 2>&1 
} 
Catch { 
    ExitWithCode 1 # abort 
} 
if($P4response -match "blah") { 
    # act on p4 response text 

,但我在尋找一種方法來都未能慘淡經營喂$ MyP4Client可變進P4二進制然後抓住p4的輸出。在許多其他的嘗試,這些都不讓P4的輸出到$ P4response:

$P4response = $p4ClientSpec | & 'p4' client -i 
$P4response = ($p4ClientSpec | p4 client -i) 
$P4response = { $p4ClientSpec | & 'p4' client -i } 
$p4ClientSpec | & 'p4' "client -i" | $P4response 

最後得到一個解析錯誤($ P4response是一個表達式)。這很明顯,我錯過了一些東西!什麼工作,請嗎? 謝謝

回答

0

嘗試Tee-Object cmdlet。它將命令輸出保存在文件或變量中,並將其發送到管道中。 Doc Technet

2

你的問題意味着你正試圖捕捉輸出到stderr以及stdout。這應該工作:

$P4response = ($p4ClientSpec | p4 client -i 2>&1) 

您將獲得無論從變量中的控制檯應用程序的輸出和錯誤,但你可以很容易地再次將它們分開:

$output = $P4Response | Where-Object { $_.GetType() -ne [System.Management.Automation.ErrorRecord] } 
$errors = $P4Response | Where-Object { $_.GetType() -eq [System.Management.Automation.ErrorRecord] } 

,然後你只檢查非 - 空$errors

+0

非常感謝鄧肯 - 這就是答案!它正是我正在摸索的東西。非常感謝您的幫助。 – Alan

0

如果可執行文件實際上是將錯誤寫入到stderr中,那麼您現在已經用已經嘗試過的方法將它提取出來了。如果它只是直接向控制檯寫消息,那麼你唯一的選擇可能是使用Start-Transcript將控制檯輸出捕獲到文件中,並解析文件內容以查找該消息。