Domanda

Al momento sto iniziando un file batch dal mio programma C # con:

System.Diagnostics.Process.Start(@"DoSomeStuff.bat");

Quello che mi piacerebbe essere in grado di fare è reindirizzare l'output (stdout e stderr) di quel processo figlio alla finestra Output in Visual Studio (in particolare Visual C # Express 2008).

C'è un modo per farlo?

(Inoltre:. Tale che non è tutto tamponato e poi sputò fuori alla finestra Output quando il termine del processo figlio)


(a proposito: Al momento posso ottenere stdout (ma non stderr) del genitori processo ad apparire nella finestra di output, facendo il mio programma una "Applicazione Windows" invece di una "Console Applicazione". questo rompe, se il programma viene eseguito al di fuori di Visual Studio, ma questo è ok nel mio caso particolare.)

È stato utile?

Soluzione

process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += (sender, args) => Console.WriteLine(args.Data);
process.Start();
process.BeginOutputReadLine();

process.WaitForExit();

Stessa idea per Error, basta sostituire Output in quelle di metodo nomi / proprietà.

Altri suggerimenti

Una variante di questo funziona per me --posting questo adesso perché mi auguro che avevo trovato prima. Si noti che questo è solo un frammento estratto dal codice reale in modo ci possono essere degli errori banali.

La tecnica si basa su un codice MSDN. Quello che non sono stato in grado di capire è come ottenere la finestra di output di aggiornamento "al volo". Esso non viene aggiornato fino a dopo questo compito ritorni.

// Set this to your output window Pane
private EnvDTE.OutputWindowPane _OutputPane = null;

// Methods to receive standard output and standard error

private static void StandardOutputReceiver(object sendingProcess, DataReceivedEventArgs outLine)
{
   // Receives the child process' standard output
   if (! string.IsNullOrEmpty(outLine.Data)) {
       if (_OutputPane != null)
           _OutputPane.Write(outLine.Data + Environment.NewLine);
   }
}

private static void StandardErrorReceiver(object sendingProcess, DataReceivedEventArgs errLine)
{
   // Receives the child process' standard error
   if (! string.IsNullOrEmpty(errLine.Data)) {
       if (_OutputPane != null)
           _OutputPane.Write("Error> " + errLine.Data + Environment.NewLine);
   }
}

// main code fragment
{
    // Start the new process
    ProcessStartInfo startInfo = new ProcessStartInfo(PROGRAM.EXE);
    startInfo.Arguments = COMMANDLINE;
    startInfo.WorkingDirectory = srcDir;
    startInfo.UseShellExecute = false;
    startInfo.RedirectStandardOutput = true;
    startInfo.RedirectStandardError = true;
    startInfo.CreateNoWindow = true;
    Process p = Process.Start(startInfo);
    p.OutputDataReceived += new DataReceivedEventHandler(StandardOutputReceiver);
    p.BeginOutputReadLine();
    p.ErrorDataReceived += new DataReceivedEventHandler(StandardErrorReceiver);
    p.BeginErrorReadLine();
    bool completed = p.WaitForExit(20000);
    if (!completed)
    {
        // do something here if it didn't finish in 20 seconds
    }
    p.Close();
}

Che cosa sta succedendo qui è che Visual Studio sta visualizzando l'output di debug dal programma nella finestra di output. Cioè:. Se si usa Trace.WriteLine, sarà visualizzata nella finestra di uscita, a causa del listener di analisi di default

In qualche modo, l'applicazione Windows Form. (Quando si utilizza Console.WriteLine; sto supponendo che si sta utilizzando Console.WriteLine) sta anche scrivendo output di debug, e Visual Studio è in ripresa questo in su

Non farà lo stesso per i processi figli, a meno che non si acquisisce in modo esplicito l'output e reindirizzare insieme con l'output.

Hai pensato di usare un DefaultTraceListener ?

    //Create and add a new default trace listener.
    DefaultTraceListener defaultListener;
    defaultListener = new DefaultTraceListener();
    Trace.Listeners.Add(defaultListener);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top