2009-04-24 16 views
5

Sto generando un processo figlio che viene eseguito in una finestra della console visibile (è un file batch che esegue MSBuild), e mi piacerebbe avere l'output generato dal processo visualizzato nella finestra della console visibile, nonché acquisire quell'output in modo che possa elaborarlo in codice. Ho letto diverse altre domande e la documentazione MSDN trattare con ProcessStartInfo.RedirectStandardOutput e simili, e posso catturare l'output dal flusso reindirizzato ed elaborare nel codice bene:Cattura l'output standard e lo visualizza ancora nella finestra della console

Process msBuild = new Process(); 
msBuild.StartInfo.FileName = "Build.bat"; 
msBuild.StartInfo.UseShellExecute = false; 
msBuild.StartInfo.RedirectStandardOutput = true; 
msBuild.Start(); 
string output = msBuild.StandardOutput.ReadToEnd(); 
msBuild.WaitForExit(); 

Il problema è che il l'output non viene visualizzato nella finestra della console del processo figlio; Ho solo una finestra della console vuota sullo schermo mentre il processo è in esecuzione, che scompare quando è finito.

Suppongo di poter nascondere la finestra del processo figlio effettivo e di visualizzare una seconda finestra in cui scrivere semplicemente l'output come è stato acquisito, ma sembra più lavoro del necessario. C'è un modo per avere l'output visualizzato nella finestra della console e catturarlo ancora per l'elaborazione quando è finito?

risposta

3

Una volta reindirizzato lo standard, non è più diretto alla console. Per scrivere sulla console devi farlo manualmente.

Se si desidera visualizzare l'output mentre il processo viene eseguito, anziché in un dump grande alla fine, è possibile utilizzare l'evento "OutputDataReceived" della classe Process.

+0

Wow - che non avevo visto prima OutputDataReceived. Neat! –

+0

Questo sembra rispondere alla domanda se posso o meno avere l'output visualizzato nella finestra della console di proprietà del processo figlio e reindirizzato al processo padre allo stesso tempo. La mia prossima domanda sarebbe, è possibile non reindirizzare l'output, e solo catturare tutto dalla console quando il processo si chiude? Oppure, in caso contrario, qual è il modo migliore per creare manualmente una finestra della console in modo che possa scrivere l'output reindirizzato su di esso mentre il processo viene eseguito (utilizzando 'OutputDataReceived')? – mjl5007

+1

Dai un'occhiata a http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx. Ha un esempio (potresti voler disattivare tutte le lingue tranne C#) –

4

Ecco quello che ho usato, senza l'utilizzo di un thread separato:


using(System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
{ 
    proc.EnableRaisingEvents = false; 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.CreateNoWindow = true; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.Verb = "open"; 
    proc.StartInfo.FileName = "XXXX"; 
    proc.Start(); 
    String sLine = ""; 
    while ((sLine = proc.StandardOutput.ReadLine()) != null) 
    { 
     System.Console.WriteLine(sLine); 
    } 
    proc.WaitForExit(); //Jon Skeet was here! 
    errorCode = proc.ExitCode; 
    proc.Close(); 
} 
+0

Supponevo che l'OP volesse che il processo di spawn continuasse a funzionare - non avevo notato la chiamata a WaitForExit. Userei WaitForExit piuttosto che il tuo ciclo while: i loop stretti non sono una buona idea. –

+0

Sto cercando di ricordare se c'era un motivo per cui non ho usato WaitForExit lì. – crashmstr

+0

Guardando la mia cronologia SVN, è stato perché l'ho usato come "while (! Proc.HasExited) {/ * leggi roba qui * /}", ma questo non ha ottenuto tutto il testo, e quando mi sono trasferito fuori dal ciclo di lettura, non ha pensato di cambiarlo in WaitForExit. – crashmstr

Problemi correlati