2016-11-08 2 views
1

私は関数を呼び出します。ここでは、&演算子を持つアプリケーションを呼び出します。アプリケーションは、いくつかの行のコマンドライン出力を生成し、いくつかのファイルをダウンロードし、文字列を返します。Out-Hostがバッファリングしていますか?

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

コンソール上でのみapp.exe終了後app.exeによって生成された出力を表示されていること、らしいです。ユーザは、ファイルがダウンロードされているリアルタイム情報を一切有していない。 app.exeが実行されているときにコンソールを継続的に更新する方法はありますか?

+0

'' '' app.exe ''を実行するとどうなりますか? CMDの「more」では、すぐに結果が表示されますか? – 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にパイプされています。

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

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

    他の溶液は-NoNewWindow-WaitパラメータでStart-Processレットを使用することで:

ソリューションは、スクリプトブロックOut-Defaultにラップスクリプトブロックへのコマンド、及びパイプであろう

関連する問題