2011-11-03 51 views
7

我試圖在Windows命令提示符下運行以下命令。無法在Windows命令提示符(cmd.exe)中重定向輸出消息

abc.exe >log.txt 2>&1 

我在等abc.exe所有輸出被定向到log.txt,但它不工作,因爲log.txt是空的。

但是,如果我只是執行abc.exe,輸出顯示在Windows命令提示符下。

我不確定此應用程序(STDOUT或STDERR)使用的輸出處理程序是什麼,但我想知道是否有辦法捕獲所有消息,而不管處理程序如何。

+0

'perl abc.exe> log.txt 2>&1'試試這個 – run

+0

當你說「它不工作」你是什麼意思?該程序根本不運行?它運行,但沒有輸出?它運行,但輸出到控制檯? –

+0

嗨約翰斯頓,它確實生成文件,但它是空的。輸出沒有去控制檯 – TimMe

回答

-1

我看到的問題......你先寫到標準輸出到文件,那麼你的錯誤輸出 覆蓋它 - 所以,如果你沒有任何錯誤,你會得到一個空白文件!

相反,嘗試附加錯誤輸出到同一個文件,就像這樣:

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

+0

-1,那不是什麼>&。 OP的原始語法是正確的,並且與您的操作完全相同。 –

+0

是的,好點...我只是查找[參考](http://ss64.com/nt/syntax-redirection.html)。我一定很快回答! – ewall

0

如果你真的需要捕捉到這一信息,使用控制檯API。

CreateConsoleScreenBuffer和SetConsoleActiveScreenBuffer允許您切換到專用的屏幕緩衝區,以避免干擾現有的屏幕緩衝區。

SetConsoleScreenBufferSize可以使緩衝區足夠寬以避免行翻轉。

SetConsoleCursorPosition可以根據需要設置光標位置。

運行該程序後,ReadConsoleOutput允許您閱讀它寫入控制檯的內容。

然後,您可以使用GetStdHandle(STD_OUTPUT_HANDLE)和SetConsoleActiveScreenBuffer將控制檯返回到原始緩衝區,然後使用CloseHandle關閉您的額外緩衝區。

+0

謝謝你們的討論。事實證明,Jonston是正確的,供應商承認這是該程序中的一個錯誤,導致消息無法正確重定向。然而,我覺得這個錯誤可以打印到Windows控制檯,但我們沒有辦法以編程方式捕獲它。 – TimMe

0

重定向到文件時,控制檯輸出不可見的症狀可能是由於寫入標準輸出的程序中缺少flush()。但是,當程序退出(正常)或相應緩衝區填滿並自動刷新時,輸出應該可見。

相關問題