Donnerstag, Juni 4, 2020

C# get-process-output, während der Ausführung

Gibt es trotzdem die Umleitung der standard-Ausgabe des gestarteten Prozesses und erfassen es als sein geschieht. Alles, was ich gesehen habe, die nicht einfach eine ReadToEnd nachdem der Prozess abgeschlossen ist. Ich möchte in der Lage sein, um die Ausgabe, wie es gedruckt wird.

Edit:

    private void ConvertToMPEG()
    {
        //Start the child process.
        Process p = new Process();
        //Redirect the output stream of the child process.
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        //Setup filename and arguments
        p.StartInfo.Arguments = String.Format("-y -i \"{0}\" -target ntsc-dvd -sameq -s 720x480 \"{1}\"", tempDir + "out.avi", tempDir + "out.mpg");
        p.StartInfo.FileName = "ffmpeg.exe";
        //Handle data received
        p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
        p.Start();
    }

    void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Debug.WriteLine(e.Data);
    }

2 Kommentare

  1. 14

    Verwenden Prozess.OutputDataReceived Ereignis aus dem Prozess zu erhalten die Daten, die Sie brauchen.

    Beispiel:

    var myProc= new Process();
    
    ...            
    myProc.StartInfo.RedirectStandardOutput = true;
    myProc.OutputDataReceived += new DataReceivedEventHandler(MyProcOutputHandler);
    
    ...
    
    private static void MyProcOutputHandler(object sendingProcess, 
                DataReceivedEventArgs outLine)
    {
                //Collect the sort command output. 
        if (!String.IsNullOrEmpty(outLine.Data))
        {
          ....    
        }
    }
    • Ja, und zusätzlich müssen Sie RedirectStandardOutput auf true für diese zu arbeiten.
    • nur wrinting weitere post.
    • Wie in der Antwort hier.
    • Ich habe versucht, aber ich bin nicht mit Glück. Es läuft gut, aber der Rückruf wird nie erreicht. Vielleicht ist es ein problem mit der Art und Weise der Ausgabe gedruckt wird. Ich bin mit diesem mit ffmpeg. Ich werde meine code auf den ursprünglichen post.
    • aber wenn Sie ReadToEnd(..) funktioniert es für Sie?
    • Nein, ich habe versucht, p.WaitForExit() gefolgt von p.ReadToEnd() und es gibt eine leere Zeichenfolge zurück
    • sind Sie sicher, an dieser Stelle, dass die process schreiben etwas – Ausgabe?
    • Wenn ich RedirectStandardOutput auf false, ich kann sehen, all die Statusmeldungen, die für die Konvertierung.
    • Ich hatte auch hinzufügen myProc.BeginOutputReadLine(); nachdem ich begonnen hatte der Prozess.
    • Was ist if (!String.IsNullOrEmpty(outLine.Data)) für? Können die Daten überhaupt null sein? Wollen Sie nicht die leeren Zeilen in der Ausgabe die meiste Zeit?
    • Frage ist, über die heraus filtern, die Befehle oder einige Schlüsselwörter aus dem stream, die sind noch „null“ oder leer-strings, denke ich.
    • dataReceivedEventHandler – Dokumentation sagt: „Wenn die Weiterleitung abgeschlossen ist, eine null-Linie wird an den event-handler. Damit Ihr event handler überprüft diese Bedingung vor dem Zugriff auf die Eigenschaft Data. Zum Beispiel können Sie verwenden die statische Methode String.IsNullOrEmpty zur Validierung der Daten-Eigenschaft in der Ereignisprozedur.“
    • IsNullOrEmpty sollte nicht verwendet werden, da eine null zeigt an, um nicht weiterhin, aber die Verarbeitung sollte weiterhin nach einer leeren Zeile.

  2. 3

    So, nach ein wenig mehr Graben fand ich heraus, dass ffmpeg verwendet stderr für die Ausgabe. Hier ist mein modifizierter code die Ausgabe.

            Process p = new Process();
    
            p.StartInfo.UseShellExecute = false;
    
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
    
            p.StartInfo.Arguments = String.Format("-y -i \"{0}\" -target ntsc-dvd -sameq -s 720x480 \"{1}\"", tempDir + "out.avi", tempDir + "out.mpg");
            p.StartInfo.FileName = "ffmpeg.exe";
    
            p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    
            p.Start();
    
            p.BeginErrorReadLine();
            p.WaitForExit();

Kostenlose Online-Tests