2012-03-13 100 views
0

使用Process類與控制檯應用程序通信時遇到問題。無法向控制檯應用程序發送多個命令

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = @"consoleApp.exe";   
psi.UseShellExecute = false; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardInput = true; 
Process = Process.Start(psi); 
Process.BeginOutputReadLine(); 

我需要的是編寫命令到控制檯,檢索答案,迴應他們。但是,發送到控制檯的命令僅在關閉流時起作用:

Process.StandardInput.WriteLine("command"); 
Process.StandardInput.Close(); 

爲什麼會這樣?在此之後,當然,我無法再與控制檯應用進行通信。我究竟做錯了什麼?我通常如何與控制檯應用程序通信?任何幫助是極大的讚賞。

回答

2

聽起來像一個大滑坡,我想嘗試不同的辦法,但如果你必須以這樣的方式進行交互,你也許可以嘗試:

Process.StandardInput.Flush(); 

,而不是關閉();只有關閉()並在你完成完成後處置所有內容。

+0

我試過了。它不起作用。我在某處讀到它只與輸出流有關。 – Peter17 2012-03-13 20:16:25

+0

但我沒有完全可以完成的時刻。我需要不斷地與程序進行交流(這是一個外部SIP呼叫者)。 – Peter17 2012-03-13 20:19:00

+0

我還沒有完全按照你的意思去做,但理論上它應該工作,並寫入標準輸入。 http://msdn.microsoft.com/en-us/library/system.io.streamwriter.flush.aspx例如,如果我們正在寫入文件流,調用flush將確保立即寫入緩衝區中的任何內容。 – mikey 2012-03-13 20:22:21

1

如描述使用一個StreamWriter:

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardinput.aspx

當產生兩個控制檯應用程序,一個用下面的代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var n = 0; 
     while (n < 5) 
     { 
      var line = Console.ReadLine(); 
      Console.WriteLine("Read line {0}: {1}", n, line); 
      n++; 
     } 
    } 
} 

和一個具有以下:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Process myProcess = new Process(); 

     myProcess.StartInfo.FileName = "ConsoleApplication1.exe"; 
     myProcess.StartInfo.UseShellExecute = false; 
     myProcess.StartInfo.RedirectStandardInput = true; 

     myProcess.Start(); 

     StreamWriter myStreamWriter = myProcess.StandardInput; 

     var n = 0; 
     while (n < 5) 
     { 
      myStreamWriter.WriteLine("line" + n.ToString()); 
      n++; 
     } 

     myStreamWriter.Close(); 
    } 
} 

結果是:

Read line 0: line0 
Read line 1: line1 
Read line 2: line2 
Read line 3: line3 
Read line 4: line4 
+0

他們關閉StreamWriter。但我不能這樣做,因爲我需要它與應用程序建立進一步的溝通。 – Peter17 2012-03-13 20:34:04

+0

對不起,應該已經做得更清楚了,但是你可以做多個WriteLine,並且它們被接受爲單獨的輸入。將更新答案。 – Dirk 2012-03-13 21:42:22

+0

所以,我應該避免使用Process.BeginOutputReadLine()? – Peter17 2012-03-13 22:10:32

相關問題