2010-09-03 12 views
23

¿Puedo iniciar un proceso (usando C# Process.Start()) en la misma consola que el programa de llamada? De esta forma, no se creará una nueva ventana y la entrada/salida/error estándar será la misma que la aplicación de la consola de llamadas. Intenté configurar process.StartInfo.CreateNoWindow = true; pero el proceso aún comienza en una nueva ventana (y se cierra inmediatamente después de que termine).Iniciar un proceso en la misma consola

Respuesta

41

No deberías No es necesario hacer nada que no sea el conjunto UseShellExecute = false, ya que el comportamiento predeterminado de la función Win32 CreateProcess es que una aplicación de consola herede la consola principal, a menos que especifique CREATE_NEW_CONSOLE bandera.

He probado el siguiente programa:

private static void Main() 
{ 
    Console.WriteLine("Hello"); 

    var p = new Process(); 
    p.StartInfo = new ProcessStartInfo(@"c:\windows\system32\netstat.exe", "-n") 
     { 
      UseShellExecute = false 
     }; 

    p.Start(); 
    p.WaitForExit(); 

    Console.WriteLine("World"); 
    Console.ReadLine(); 
} 

y me dio este resultado:

alt text

+0

Funcionó maravillosamente, gracias. – ses011

8

Usted podría intentar redirigir la salida de este proceso y luego imprimirlo en la consola proceso de llamada:

public class Program 
{ 
    static void Main() 
    { 
     var psi = new ProcessStartInfo 
     { 
      FileName = @"c:\windows\system32\netstat.exe", 
      Arguments = "-n", 
      RedirectStandardOutput = true, 
      UseShellExecute = false 
     }; 
     var process = Process.Start(psi); 
     while (!process.HasExited) 
     { 
      Thread.Sleep(100); 
     } 

     Console.WriteLine(process.StandardOutput.ReadToEnd()); 
    } 
} 

enfoque alternativo utilizando el evento Exited y un mango de espera:

static void Main() 
{ 
    using (Process p = new Process()) 
    { 
     p.StartInfo = new ProcessStartInfo 
     { 
      FileName = @"netstat.exe", 
      Arguments = "-n",           
      RedirectStandardOutput = true, 
      UseShellExecute = false      
     }; 
     p.EnableRaisingEvents = true; 
     using (ManualResetEvent mre = new ManualResetEvent(false)) 
     { 
      p.Exited += (s, e) => mre.Set(); 
      p.Start(); 
      mre.WaitOne(); 
     } 

     Console.WriteLine(p.StandardOutput.ReadToEnd()); 
    }   
} 
+0

alguna razón en particular para recorrer con 'Thread.Sleep' en lugar de escuchar a' Proceso. Salió' y sincronizar con un identificador de espera en su lugar? –

+0

No, no hay un motivo en particular, solo es perezoso, no dude en editar mi respuesta para reflejar esta excelente sugerencia. –

+2

O simplemente podría usar 'Process.WaitForExit' :) –

Cuestiones relacionadas