2011-11-03 8 views
7

Windowsコマンドプロンプトで次のコマンドを実行しようとしました。Windowsコマンドプロンプト(cmd.exe)で出力メッセージをリダイレクトできません

abc.exe >log.txt 2>&1 

log.txtが空であるように、私はlog.txtに向けられるabc.exeからのすべての出力を期待していますが、それは動作しません。

しかし、abc.exeを実行すると、Windowsのコマンドプロンプトに出力が表示されます。

このアプリケーション(STDOUTまたはSTDERR)で使用される出力ハンドラは何か分かりませんが、ハンドラに関係なくすべてのメッセージをキャプチャする方法があるのでしょうか。

+0

'perl abc.exe> log.txt 2>&1'これを試してください – run

+0

"それはうまくいかない "と言ったらどういう意味ですか?プログラムはまったく実行されませんか?それは実行されますが、出力はありませんか?それは実行されますが、出力はコンソールに送られますか? –

+0

こんにちはジョンストン、それはファイルを生成しますが、それは空です。出力がコンソールに行かない – TimMe

答えて

-1

私は問題を参照してください...あなたの標準出力がファイルに書き込むと、エラー出力 を上書きします。エラーがなければ、空のファイルが得られます。

代わりに、このように同じファイルにエラー出力を追加を試してください:あなたは本当にコンソールAPIを使用し、そのメッセージをキャプチャする必要がある場合は

abc.exe >log.txt 2>>&1 

+0

-1、それは&>とは異なります。 OPの元の構文は正確で、あなたと全く同じことをします。 –

+0

ええ、良い点...私は[参照](http://ss64.com/nt/syntax-redirection.html)を見ました。私はあまりにも早く答えなければならなかったでしょう! – ewall

0

CreateConsoleScreenBufferおよびSetConsoleActiveScreenBufferを使用すると、既存のスクリーンバッファに干渉しないように専用のスクリーンバッファに切り替えることができます。

SetConsoleScreenBufferSizeは、ラインをロールオーバーさせないようにバッファを十分に広くすることができます。

SetConsoleCursorPositionは、必要に応じてカーソル位置を設定できます。

ReadConsoleOutputを実行すると、コンソールに書き込んだ内容を読むことができます。

次に、GetStdHandle(STD_OUTPUT_HANDLE)およびSetConsoleActiveScreenBufferを使用してコンソールを元のバッファに戻し、CloseHandleを使用して余分なバッファを閉じることができます。

+0

ディスカッションのみなさんありがとう。Jonstonが正しいことが判明しました。ベンダーは、このプログラムのバグであることを認めました。これは、メッセージが正しくリダイレ​​クトできない原因となりました。しかし、エラーはWindowsコンソールに出力することができますが、プログラムでキャプチャすることはできません。 – TimMe

0

コンソール出力がファイルにリダイレクトされたときに表示されないという症状は、標準出力に書き込むプログラムのflush()がないことが原因です。ただし、出力が正常に終了するか、それぞれのバッファがいっぱいになって自動的にフラッシュされたときに出力が表示されます。

関連する問題