【问题标题】:Cannot send more than one command to console application无法向控制台应用程序发送多个命令
【发布时间】:2012-03-13 20:13:07
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net process stream console


    【解决方案1】:

    听起来像一个滑坡,我会尝试以不同的方式处理它,但如果您必须以这种方式进行交互,您也许可以尝试:

    Process.StandardInput.Flush();
    

    而不是 Close();完全完成后,只需 Close() 并处理所有内容。

    【讨论】:

    • 我试过了。它不起作用。我在某处读到它只与输出流相关。
    • 但是没有一刻我可以完全完成。我需要不断地与程序通信(它是一个外部的 Sip 调用者)。
    • 我并没有完全按照您的要求完成,但理论上它应该可以工作,并写入标准输入。 msdn.microsoft.com/en-us/library/… 例如,如果我们正在写入文件流,调用 flush 将确保缓冲区中的任何内容都立即被写入。
    • 您如何确定它是否“有效”?这是您要遵循的粗略示例吗? msdn.microsoft.com/en-us/library/…
    • 我正在使用该命令连接到 Sip 服务器。我可以在服务器上看到我是否连接。
    【解决方案2】:

    使用如下所述的 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
    

    【讨论】:

    • 他们关闭了 StreamWriter。但我不能这样做,因为我需要它来与应用程序建立进一步的通信。
    • 对不起,应该更清楚,但您可以执行多个 WriteLine,它们被接受为单独的输入。将更新答案。
    • 所以,我应该避免使用 Process.BeginOutputReadLine()?
    • 我不确定,还没有使用异步方法;如果您多次调用 BeginOutputReadLine 可能会起作用,但我想您将不得不进行一些回调才能知道何时执行此操作。
    猜你喜欢
    • 2012-08-14
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多