我運行在命令行中的可執行文件,同時重定向stdout
和stderr
到文件:爲什麼「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.txt
和err.txt
文件從不更新(即它們保持空)。
有人可以請解釋我做錯了什麼,我該如何解決?
謝謝。
UPDATE:
我能夠從一個批處理文件,而不是一個命令行運行原始命令(不包括start /w
前綴)來解決問題。我仍然想知道這個問題的原因。
'start'沒有'/ B'選項使用過程中創建標誌'CREATE_NEW_CONSOLE'。在這種情況下,即使過程在其句柄表中繼承了out.txt和err.txt的句柄,該過程也會從其PEB中的標準句柄值設置爲NULL開始。然後,如果它是一個控制檯應用程序(顯然不是你的情況),當新控制檯(即conhost.exe)被激活時,系統將標準句柄值設置爲控制檯。如果CMD使用'STARTUPINFO'標準句柄,這將不會是一個問題,它將覆蓋此默認行爲。 – eryksun
請注意,如果您使用'/ B'選項,它必須位於命令行中'/ W'之前,因爲'/ B'禁用了等待。例如:'start/b/w MyApp.exe 1> out.txt 2> err.txt'。 – eryksun