Запуск интерактивной командной строки exe с помощью С#

Я могу запустить процесс командной строки, используя process.start(). Я могу предоставить ввод с использованием стандартного ввода. После этого, когда процесс требует ввода пользователя снова, как моя программа может узнать и передать вход в этот exe?

Ответ 1

Здесь приведен пример , который похож на то, что вам нужно, используя Process.StandardInput и StreamWriter.

        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);
            }
        }

надеюсь, что поможет

Ответ 2

Если я правильно понимаю, я думаю, что вы должны это сделать, перенаправив стандартный ввод/вывод, используя RedirectStandardOutput и RedirectStandardInput.

В проекте WinSCP есть образец С# для связи с ним, используя этот способ. Вы можете найти его здесь: Передача файлов SFTP в .NET (хотя этот образец только собирает вывод, не используя его вообще, но метод должен быть тем же.)

Ответ 3

Вы хотите посмотреть IPC. Как показал выше роберт, класс Process в .NET поможет вам. Но специально для вашей проблемы (как узнать, когда писать данные): Вы не можете. Не в общем.

Если вы знаете требуемый ввод (например, "yyy" ), вы можете предоставить его в STDIN созданного процесса. Вам не нужно ждать, пока программа запросит эту информацию: она будет читать только с STDIN, когда она хочет данных.

Если вам нужно обработать выходные данные программ, чтобы решить, что писать в STDIN, попробуйте прочитать процессы STDOUT. У вас могут возникнуть проблемы с промывкой, хотя...