2017-08-03 8 views
0

ファイルにstdoutstderrをリダイレクトしながら、私は、コマンドラインから実行可能ファイルを実行しています:"start/w"は、プロセスがstdoutとstderrに書き込みを行えないのはなぜですか?

MyApp.exe 1>out.txt 2>err.txt 

ファイルがすぐに作成し、ときMyApp.exe完了のプロセスに更新されます。

しかし、コマンドを実行した直後にコマンドラインプロンプトが表示されるため、プロセスが実際に完了するタイミングについてはわかりません。

したがって、私は積極的にプロセスの完了を待つしたいと思います:

start/w MyApp.exe 1>out.txt 2>err.txt 

これは確かに完了するのを待っているの目的を達成しています。

ただし、out.txterr.txtファイルは更新されません(空のままです)。

誰かが間違っていることを説明してください。どうすればそれを解決できますか?

ありがとうございます。

UPDATE:私は代わりに、コマンドラインのバッチファイルから(start /wプレフィックスを除く)、元のコマンドを実行して、問題を解決することができました

。私はまだこの問題の理由を知りたい。

+0

'start':あなたは(リダイレクト記号をエスケープすることで)解析する1つのレベルの間でリダイレクトを「保存」する必要があります。この場合、ハンドルテーブルのout.txtとerr.txtのハンドルを継承していても、PEBの標準ハンドル値をNULLに設定してプロセスを開始します。次に、コンソールアプリケーション(明らかにあなたのケースではない)の場合、新しいコンソール(conhost.exe)が生成されると、システムは標準ハンドル値をコンソールに設定します。 CMDが 'STARTUPINFO'標準ハンドルを使用した場合、これは問題にはなりません。これは、このデフォルトの動作を無効にします。 – eryksun

+0

'/ B'オプションを使用した場合、'/B'は待機を無効にするので、コマンドラインで '/ W'の前に来なければなりません。たとえば、 'start/b/w MyApp.exe 1> out.txt 2> err.txt'のようにします。 – eryksun

答えて

1

これは、アプリケーションの出力ではなく、STDOUTとSTDERRをstart(どちらも空です)にリダイレクトするためです。 `/ B`オプションは、プロセスの作成フラグを使用しています` CREATE_NEW_CONSOLE`なし

start/w MyApp.exe 1^>out.txt 2^>err.txt 
+0

MyApp.exeが標準I/Oをリダイレクトするためのシェルオペレータのコマンドラインをチェックすることに疑いがあります。必要に応じて実際にシェルを使用する必要があります。 MyAppタイトル "/ w cmd/c" MyApp.exe 1> out.txt 2> err.txt "'を起動します。これを行う唯一の理由は、コンソールアプリケーションの場合は新しいコンソールに接続されたMyApp.exeを実行するか、コマンドプロンプトから実行すると非同期で実行されるGUIアプリケーションの場合は終了するのを待つことです常に待つバッチスクリプト)。それ以外の場合は、 'start'コマンドを使わずに' MyApp.exe 1> out.txt 2> err.txt'を実行するだけです。 – eryksun

関連する問題