使用c#运行交互式命令行exe

时间:2010-07-22 11:52:52

标签: c#

我可以使用process.start()运行命令行进程。 我可以使用标准输入提供输入。之后,当进程再次要求用户输入时,我的程序如何知道并将输入传递给该exe?

3 个答案:

答案 0 :(得分:11)

使用Process.StandardInputStreamWriterexample here听起来与您的需求相似。

        Process sortProcess;
        sortProcess = new Process();
        sortProcess.StartInfo.FileName = "Sort.exe";

        // Set UseShellExecute to false for redirection.
        sortProcess.StartInfo.UseShellExecute = false;

        // Redirect the standard output of the sort command.  
        // This stream is read asynchronously using an event handler.
        sortProcess.StartInfo.RedirectStandardOutput = true;
        sortOutput = new StringBuilder("");

        // Set our event handler to asynchronously read the sort output.
        sortProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);

        // Redirect standard input as well.  This stream
        // is used synchronously.
        sortProcess.StartInfo.RedirectStandardInput = true;
        sortProcess.Start();

        // Use a stream writer to synchronously write the sort input.
        StreamWriter sortStreamWriter = sortProcess.StandardInput;

        // Start the asynchronous read of the sort output stream.
        sortProcess.BeginOutputReadLine();
        Console.WriteLine("Ready to sort up to 50 lines of text");
        String inputText;
        int numInputLines = 0;
        do 
        {
            Console.WriteLine("Enter a text line (or press the Enter key to stop):");

            inputText = Console.ReadLine();
            if (!String.IsNullOrEmpty(inputText))
            {
                numInputLines ++;
                sortStreamWriter.WriteLine(inputText);
            }
        }

希望有所帮助

答案 1 :(得分:2)

如果我理解正确,我认为您应该可以通过使用RedirectStandardOutputRedirectStandardInput重定向标准输入/输出来实现此目的。

WinSCP项目有一个C#示例,用于使用这种方式与之通信。你可以在这里找到它:SFTP file transfers in .NET(尽管这个样本只收集输出而根本不使用它,但技术应该是相同的。)

答案 2 :(得分:1)

你想查找IPC。正如罗伯特所示,.NET中的Process类将对您有所帮助。但专门针对您的问题(如何知道何时写入数据):您不能。不是一般的。

如果您知道所需的输入(例如“yyy”),则可以在创建的流程的STDIN中提供。您无需等待程序请求此信息:它只会在STDIN时读取数据。

如果您需要处理程序输出以决定写入STDIN的内容,请尝试阅读进程STDOUT。你可能会遇到冲洗问题,但是......