2014-03-27 42 views
0

方案 我有一個批處理文件a.bat,其包含以下語句子進程擁有用於重定向它的父進程的STD輸出

A.exe >> a.txt 
Test.exe >> a.txt 

文件A.exe時啓動另一個exe文件說B.EXE (通過_wpopen函數)並返回。但重定向A.exe的輸出後,a.txt的所有權似乎轉移到b.exe。由於b.exe仍在運行,仍然擁有a.txt,因此test.exe無法將其stdout重定向到a.txt。

B.exe無限期運行,不能等待它停止。 而且我也無法將輸出重定向到多個文件。由於這些exe執行是安裝設置的一部分,所以日誌記錄應該是連續的,並且必須對單個文件執行

這種情況下是否有任何可能的解決方案?我希望在a.exe返回後文件a.text是免費的!

+0

取決於有多少'。你正在運行,多久,你可以改變。 「Test.exe」加入之前,「a.exe」及其鏈接的「b.exe」運行多長時間 - 可能是一個簡單的延遲將其排除?你能重新安排一些東西,讓'a.exe'不再啓動'b.exe',而是從批處理文件中調用那個文件嗎? –

+0

未經測試,但我認爲沒有理由不工作。您可以嘗試用CreateProcess替換_wpopen,明確定義STARTUP_INFO結構中的句柄。或者你可以發送每個輸出到一個單獨的文件。 –

+0

感謝您的回覆,但您的兩條建議似乎都不適用於我的背景。我已經編輯了問題以更清晰。 – ScarCode

回答

0

通過分別在每一行上放置重定向,您需要命令處理器重新打開該文件。如果另一個進程仍然具有打開的文件的原始句柄,如在您的方案中那樣,那將不起作用。

相反,重定向一次輸出多個命令或整個批處理文件。爲此,您可以使用call命令:

call :main >> a.txt 
goto :eof 

:main 
A.exe 
Test.exe 
goto :eof 

你可以選擇使用括號:

(
A.exe 
Test.exe 
) > test.txt 

或者,如果你只是想一些輸出去文件:

call :main 3>> a.txt 
goto :eof 

:main 
A.exe >&3 
Test.exe >&3 
goto :eof 

請記住,在B.exe退出之前,日誌文件將保持打開狀態,因此寫入它的唯一方法是使用已存在的句柄。 (假設你不能修改A.exe時,如果可以的話,那可能是一個更好的解決方案。)

也可能可以完全避免這個問題是這樣的:

A.exe > temp.txt 
type temp.txt >> a.txt 
+0

謝謝,尼斯解決方法。但是,如果有其他解決方案不需要使用標籤修改批處理文件,就會更加精美,因爲我想保留剩餘的批處理文件流,以便完整記錄到相同的文件! – ScarCode

相關問題