2016-11-08 37 views
1

我有一個函數,我用&運算符調用一個應用程序。該應用程序會產生幾個行命令行輸出,下載一些文件,並返回一個字符串:是主機緩衝嗎?

& "app.exe" | Out-Host 
$var = ... 
return $var 

看來,該控制檯後纔會app.exe終止出現由app.exe產生的輸出。用戶沒有任何正在下載文件的實時信息。當app.exe正在運行時,有沒有辦法持續更新控制檯?

+0

如果您運行'「app.exe」|,該怎麼辦? CMD中的「更多」,是否立即顯示結果? – PetSerAl

+0

'more'將輸出發送到標準輸出嗎?我正在使用'Write-Host'來防止輸出數據被捕獲到返回的變量中。 – robert

+0

對於外部實用程序,PowerShell管道不能像cmd一樣工作。它確實等待命令完成。只需調用沒有'&'和'out-host'的'app.exe'。 – wOxxOm

回答

2

許多控制檯應用程序緩衝他們的輸出流,如果它知道被重定向。其實,it is standard behavior of C library。因此,緩衝由app.exe完成,因爲重定向,但不是由Out-Host

解決方法是不要重定向app.exe的輸出,即使外部命令重定向也是如此。對於比應該知道exact的條件,當PowerShell不重定向控制檯應用程序的輸出流並將其直接鏈接到它們自己的輸出流時,這將是用於交互式PowerShell.exe會話的控制檯。條件是:

  1. 命令是管道中的最後一項。
  2. 命令通過管道連接到Out-Default

解決辦法是渦卷命令到腳本塊,並通過管道將腳本塊到Out-Default

& { & "app.exe" } | Out-Default 

另一種解決方案將是使用Start-Process cmdlet和-NoNewWindow-Wait參數:

Start-Process "app.exe" -NoNewWindow -Wait