2009-07-23 13 views
9

Soy nuevo en C# y trato de desarrollar una pequeña aplicación que internamente abra un símbolo del sistema y ejecute algún comando aquí. Esto es lo que he hecho hasta ahora:Esperando que se complete el comando en C#

m_command = new Process(); 
    m_command.StartInfo.FileName = @"cmd.exe"; 
    m_command.StartInfo.UseShellExecute = false; 
    m_command.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    m_command.StartInfo.CreateNoWindow = true; 
    m_command.StartInfo.RedirectStandardInput = true; 
    m_command.StartInfo.RedirectStandardOutput = true; 

    m_command.Start(); 

    m_reader = m_command.StandardOutput; 
    m_writer = m_command.StandardInput; 

    m_writer.WriteLine("Somecommand"); //execute some command 

Como se puede ver, he redirigido la entrada y la salida. Mi pregunta es cómo puedo ejecutar el "algún comando" sincrónicamente, es decir, quiero leer el resultado de mi comando usando la salida redirigida. Para eso tengo que esperar hasta que el comando que invoqué usando WriteLine para completar. ¿Cómo puedo hacer eso?

Respuesta

15

Eso realmente depende de lo que hará el comando. Puede esperar a que el proceso salga con Process.WaitForExit, mientras lee simultáneamente de m_reader en otra secuencia o con OutputDataReceived. Eso solo funcionará si el proceso se va a cerrar cuando el comando ha terminado. (Tenga en cuenta que tiene para leer la salida, de lo contrario podría llenar el buffer de salida y básicamente bloquear el proceso.)

La otra opción es si obtendrá un cierto bit de salida cuando el comando haya finalizado - como el siguiente símbolo del sistema. El problema es que si tu comando da el mismo resultado, lo entenderás mal.

Parece que lanzar un símbolo del sistema como este no es un gran enfoque. ¿Alguna razón por la que no crea un proceso separado cada vez?

Otra opción: si se puede trabajar en lo que acaba de procesar ha puesto en marcha a través de la línea de comandos, se puede encontrar que, como Process y esperar a que para salir. Sin embargo, es complicado: realmente trataría de rediseñar tu solución.

9

Puede llamar

m_command.WaitForExit(); 
+1

Pero no quiero que se cierre mi ventana de comandos. Quiero volver a utilizar el mismo símbolo del sistema para ejecutar otro comando. ¿Funcionará este método? – Naveen

+0

Eso esperará hasta que se cierre el cmd.exe, pero ignore el final de "somecommand". –

+0

Siempre puede agregar m_writer.WriteLine ("exit"); –

3

La forma más fácil sería poner todos los comandos en un archivo .cmd, ejecutar y utilizar que

Process.Start("cmdfile").WaitForExit(); 
8

Esto es lo que he usado en un pequeño proyecto que hice:

processStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.CreateNoWindow = true; 
    startInfo.UseShellExecute = false; 
    startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    startInfo.FileName = "cmd.exe"; 
    startInfo.Arguments = command; 

// Start the process with the info we specified. 
    // Call WaitForExit and then the using statement will close. 
    using(Process exeProcess = Process.Start(startInfo)) 
    { 
     exeProcess.WaitForExit(); 
    } 
0

Usted puede esperar la indicación en la salida.

Bastante complicado también.

Cuestiones relacionadas