2017-08-03 181 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'沒有'/ B'選項使用過程中創建標誌'CREATE_NEW_CONSOLE'。在這種情況下,即使過程在其句柄表中繼承了out.txt和err.txt的句柄,該過程也會從其PEB中的標準句柄值設置爲NULL開始。然後,如果它是一個控制檯應用程序(顯然不是你的情況),當新控制檯(即conhost.exe)被激活時,系統將標準句柄值設置爲控制檯。如果CMD使用'STARTUPINFO'標準句柄,這將不會是一個問題,它將覆蓋此默認行爲。 – eryksun

+0

請注意,如果您使用'/ B'選項,它必須位於命令行中'/ W'之前,因爲'/ B'禁用了等待。例如:'start/b/w MyApp.exe 1> out.txt 2> err.txt'。 – eryksun

回答

1

這是因爲您正在重定向STANDOUT和STORER start(它們都是空的)而不是您的應用程序的輸出。你需要「拯救」整個解析的一個級別的重定向(通過轉義重定向符號):

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

我懷疑MyApp.exe將檢查它的shell命令行以重定向標準I/O。你需要真正使用一個shell,例如'開始「MyApp標題」/ w cmd/c「MyApp.exe 1> out.txt 2> err.txt」'。這樣做的唯一原因是如果它是一個控制檯應用程序,則運行附加到新控制檯的MyApp.exe,或者如果它是一個GUI應用程序,則等待它退出,否則該應用程序在從命令提示符運行時會異步執行(但不是批處理腳本,它總是等待)。否則,只需運行'MyApp.exe 1> out.txt 2> err.txt'而不使用'start'命令。 – eryksun

相關問題