无法向控制台应用程序发送多个命令

无法向控制台应用程序发送多个命令

问题描述:

使用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(); 

为什么会这样?在此之后,当然,我无法再与控制台应用进行通信。我究竟做错了什么?我通常如何与控制台应用程序通信?任何帮助是极大的赞赏。

听起来像一个大滑坡,我想尝试不同的办法,但如果你必须以这样的方式进行交互,你也许可以尝试:

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

如描述使用一个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