2013-01-31 50 views
0

我有以下代碼。cmd.exe進程永不完成

ProcessStartInfo si = new ProcessStartInfo("cmd.exe"); 
si.RedirectStandardInput = true; 
si.RedirectStandardOutput = true; 
si.UseShellExecute = false; 
si.WindowStyle = ProcessWindowStyle.Hidden; 
si.CreateNoWindow = true; 
Process p = Process.Start(si); 
p.StandardInput.Write("ipconfig"); 
p.StandardInput.Write("exit"); 
string consoleOutput = p.StandardOutput.ReadToEnd(); 
string dir="here"; 

執行到達「字符串consoleOutput」,但從來沒有達到「字符串目錄」,即代碼卡上讀取StandardOutput。它在控制檯應用程序中運行,如果這有所作爲。

+2

如果您已經從控制檯應用程序運行,爲什麼不直接調用'ipconfig'而不是不必要地產生'cmd'? – Petesh

+0

我可以用console.write來做這個嗎? – coolblue2000

+0

console.write實際上不會啓動該進程,它是啓動它的'Process.Start(si)'。 – Petesh

回答

1

您必須通過關閉流來顯式完成寫入標準輸入。請參閱Microsoft's example

總結:

 p.StandardInput.Write("exit"); 
     p.StandardInput.Close(); // <-- You need this 
     string consoleOutput = p.StandardOutput.ReadToEnd(); 

編輯:測試在Visual Studio。

順便說,要使用WriteLine()而不是Write()

+0

完美地工作,謝謝 – coolblue2000

0

使用WriteLine而不是Write來寫一個帶有最終換行符的字符串。 (您可能還需要撥打Flush(),但我不確定)。正如另一個答案所說,它不會對Close流造成傷害。

是的,你不需要cmd.exe,你可以直接啓動ipconfig(由@Petesh在評論建議)。

+0

'Flush()'和'FlushAsync()'似乎沒有出於某種原因。不知道爲什麼。 – Jason