2012-09-11 108 views
0

我使用這樣的代碼:命令打開一個命令提示符,

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 

startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = "/C SomeEXE inputfile.txt"; 
startInfo.UseShellExecute = false; 
startInfo.RedirectStandardOutput = true; 

process.StartInfo = startInfo; 
process.Start(); 

// Now use streams to capture the output 
StreamReader outputReader = process.StandardOutput; 

process.WaitForExit(); 

String line = outputReader.ReadToEnd(); 

這工作得很好。但是,發出的命令(SomeEXE)會導致打開另一個命令提示符,其中包含實際結果並等待回車被關閉。是否有可能獲得此輸出併發出回車?謝謝。

回答

4

啓動SomeEXE直接

如果啓動SomeEXE直接,而不是通過一個新的命令解釋器,現有的代碼通過標準輸出重定向到outputReader將努力獲得輸出。要做到這一點,如下更改代碼:

startInfo.FileName = "SomeEXE"; 
startInfo.Arguments = "inputfile.txt"; 

您可以重定向標準輸入到自己的數據流,以及讓你可以發出回車:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput.aspx

要點:

myProcess.StartInfo.RedirectStandardInput = true; 
StreamWriter myStreamWriter = myProcess.StandardInput; 

將Environment.NewLine寫入myStreamWriter。

但是,由於您沒有這樣做,您正在捕獲命令解釋器的控制檯。

如果你控制SomeEXE的代碼

如果你有超過SomeEXE控制,可以指示它連接到其父的控制檯:

http://www.csharp411.com/console-output-from-winforms-application/

注意,MSDN示例顯示非常差異常處理。如果拋出異常,它們無法關閉示例中的流。處理流的最簡單方法是使用語句將它們包裝在中。

如果SomeEXE生成一個子進程

如果你有超過SomeEXE的代碼無法控制,並且SomeEXE是生成一個子進程,抓住的標準輸入/從孫子控制檯標準輸出的任務更難。但是,它可以完成。

您需要obtain the process ID有問題的實際控制檯窗口。

然後,您可以使用Win32 API AttachConsole將孫級進程的控制檯附加到您自己的控制檯上。

+0

我沒有獲得輸出 - 至少字符串是空的。 '派生命令提示符'包含輸出數據。問題是我如何獲得這些數據。 – cs0815

+1

哦,我明白了。給我一點時間來考慮這一點。 –

+0

僅供參考......你爲什麼要通過一個新的命令shell啓動SomeEXE而不是直接作爲process.Start()的目標? –