2010-07-22 22 views
10

Puedo ejecutar un proceso de línea de comando usando process.start(). Puedo proporcionar entrada usando la entrada estándar. Después de eso, cuando el proceso exige la entrada del usuario de nuevo, ¿cómo puede mi programa saber y pasar la entrada a ese exe?Ejecutar el comando de línea de comando interactivo usando C#

+0

Puede que le interese [esta publicación] (http://www.codeducky.org/process-handling-net) cubre muchas de las complejidades de trabajar con. Procesos NET, particularmente alrededor de trabajar con entrada y salida – ChaseMedallion

Respuesta

10

Hay un example here que suena similar a lo que necesita, utilizando Process.StandardInput y una 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); 
      } 
     } 

esperanza de que ayuda a

+0

gracias de nuevo. pero esto es específico de sort.exe i m generate exe en tiempo de ejecución para cada usuario. No sé qué programa va a escribir. – rajshades

+0

Creo que puede usar "cmd.exe" en lugar del ejecutable que eligieron. Es un truco, pero podría hacer el trabajo –

+0

Querido Robert, puedes explicar cómo usar cmd.exe para mi problema – rajshades

2

Si entiendo correctamente, creo que deberías poder hacerlo redireccionando la entrada/salida estándar usando RedirectStandardOutput y RedirectStandardInput.

El proyecto WinSCP tiene una muestra de C# para saber cómo comunicarse con él de esta manera. Lo puedes encontrar aquí: SFTP file transfers in .NET (aunque esta muestra recoge solamente la salida sin utilizar en absoluto, pero la técnica debe ser la misma.)

+0

gracias por su respuesta. lo intenté. pero el proceso que exige la entrada del usuario no está predefinido. el escenario es como 1. Quiero diseñar compliler en línea para C# 2. puedo construir el programa usando el código dom n cretae exe 3. ahora quiero ejecutar ese exe a través de C# 4. el usuario puede escribir cualquier tipo de programa que necesita la entrada del usuario en la etapa diff. espero que hayas entendido todo el escenario – rajshades

+0

@rajshades: Hubiera pensado que sería similar, solo que en vez de enviar todos los comandos de una vez, enviarías un comando, leerías la salida, enviarías el siguiente comando etc. Aunque no he probado esto. Sin embargo, como nota general, si está creando el exe, ¿no puede tratar de darle una mejor forma de comunicarse con él (WCF, sockects de TCP/IP, nombre de las tuberías, etc.)? –

1

usted quiere mirar hacia arriba IPC. Como Robert mostró anteriormente, la clase Process en .NET lo ayudará. Pero específicamente para su problema (cómo saber cuándo escribir datos): no puede. No genéricamente

Si conoce la entrada requerida (por ejemplo, "yyy"), puede proporcionarla en el STDIN del proceso creado. No tiene que esperar que el programa solicite esta información: simplemente leerá STDIN cuando quiera datos.

Si necesita procesar la salida de los programas para decidir qué escribir en STDIN, intente leer los procesos STDOUT. Sin embargo, puede tener problemas con el enrojecimiento ...

Cuestiones relacionadas