我試圖在Windows命令提示符下運行以下命令。無法在Windows命令提示符(cmd.exe)中重定向輸出消息
abc.exe >log.txt 2>&1
我在等abc.exe
所有輸出被定向到log.txt
,但它不工作,因爲log.txt
是空的。
但是,如果我只是執行abc.exe
,輸出顯示在Windows命令提示符下。
我不確定此應用程序(STDOUT或STDERR)使用的輸出處理程序是什麼,但我想知道是否有辦法捕獲所有消息,而不管處理程序如何。
我試圖在Windows命令提示符下運行以下命令。無法在Windows命令提示符(cmd.exe)中重定向輸出消息
abc.exe >log.txt 2>&1
我在等abc.exe
所有輸出被定向到log.txt
,但它不工作,因爲log.txt
是空的。
但是,如果我只是執行abc.exe
,輸出顯示在Windows命令提示符下。
我不確定此應用程序(STDOUT或STDERR)使用的輸出處理程序是什麼,但我想知道是否有辦法捕獲所有消息,而不管處理程序如何。
我看到的問題......你先寫到標準輸出到文件,那麼你的錯誤輸出
覆蓋它 - 所以,如果你沒有任何錯誤,你會得到一個空白文件!
相反,嘗試附加錯誤輸出到同一個文件,就像這樣:
abc.exe >log.txt 2>>&1
-1,那不是什麼>&。 OP的原始語法是正確的,並且與您的操作完全相同。 –
是的,好點...我只是查找[參考](http://ss64.com/nt/syntax-redirection.html)。我一定很快回答! – ewall
如果你真的需要捕捉到這一信息,使用控制檯API。
CreateConsoleScreenBuffer和SetConsoleActiveScreenBuffer允許您切換到專用的屏幕緩衝區,以避免干擾現有的屏幕緩衝區。
SetConsoleScreenBufferSize可以使緩衝區足夠寬以避免行翻轉。
SetConsoleCursorPosition可以根據需要設置光標位置。
運行該程序後,ReadConsoleOutput允許您閱讀它寫入控制檯的內容。
然後,您可以使用GetStdHandle(STD_OUTPUT_HANDLE)和SetConsoleActiveScreenBuffer將控制檯返回到原始緩衝區,然後使用CloseHandle關閉您的額外緩衝區。
謝謝你們的討論。事實證明,Jonston是正確的,供應商承認這是該程序中的一個錯誤,導致消息無法正確重定向。然而,我覺得這個錯誤可以打印到Windows控制檯,但我們沒有辦法以編程方式捕獲它。 – TimMe
重定向到文件時,控制檯輸出不可見的症狀可能是由於寫入標準輸出的程序中缺少flush()
。但是,當程序退出(正常)或相應緩衝區填滿並自動刷新時,輸出應該可見。
'perl abc.exe> log.txt 2>&1'試試這個 – run
當你說「它不工作」你是什麼意思?該程序根本不運行?它運行,但沒有輸出?它運行,但輸出到控制檯? –
嗨約翰斯頓,它確實生成文件,但它是空的。輸出沒有去控制檯 – TimMe