24 Stimmen

Live-Ausgabe von Prozess abrufen

Ich habe ein Problem in meinem Projekt. Ich möchte einen Prozess starten, 7z.exe (Konsolenversion). Ich habe drei verschiedene Dinge versucht:

  • Process.StandardOutput.ReadToEnd();
  • OutputDataReceived & BeginOutputReadLine
  • StreamWriter

Nichts funktioniert. Es ist immer "warten" für das Ende des Prozesses zu zeigen, was ich will. Ich habe keinen Code zu setzen, nur wenn Sie meinen Code mit einem der Dinge, die dort oben aufgeführt sind, wollen. Danke!

Bearbeiten: Mein Code:

        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.CreateNoWindow = true;
        process.Start();

        this.sr = process.StandardOutput;
        while (!sr.EndOfStream)
        {
            String s = sr.ReadLine();
            if (s != "")
            {
                System.Console.WriteLine(DateTime.Now + " - " + s);
            }
        }

Oder

process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += new DataReceivedEventHandler(recieve);
process.StartInfo.CreateNoWindow = true;
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
public void recieve(object e, DataReceivedEventArgs outLine)
{
    System.Console.WriteLine(DateTime.Now + " - " + outLine.Data);
}

Oder

process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
string output = p.StandardOutput.ReadToEnd();
process.WaitForExit();

Wobei "Prozess" mein vorgefertigter Prozess ist.

Okay, ich weiß, warum es nicht richtig funktioniert: 7z.exe ist der Fehler: es zeigt eine prozentuale Ladezeit in der Konsole an, und es sendet nur Informationen, wenn die aktuelle Datei fertig ist. Beim Extrahieren zum Beispiel funktioniert es gut :). Ich werde nach einer anderen Möglichkeit suchen, die 7z-Funktionen ohne 7z.exe zu nutzen (vielleicht mit 7za.exe oder mit einer DLL). Vielen Dank an alle. Um auf die Frage zu antworten, das Ereignis OuputDataRecieved funktioniert einwandfrei!

1voto

Peter Wone Punkte 16529

Windows behandelt Pipes und Konsolen unterschiedlich. Pipes sind gepuffert, Konsolen sind es nicht. RedirectStandardOutput verbindet ein Rohr. Es gibt nur zwei Lösungen.

  1. Ändern Sie die Konsolenanwendung so, dass sie ihren Puffer nach jedem Schreibvorgang leert
  2. Schreiben eines Shims zum Vortäuschen einer Konsole per https://www.codeproject.com/Articles/16163/Real-Time-Console-Output-Redirection

Beachten Sie, dass RTConsole nicht mit STDERR umgeht, wo das gleiche Problem auftritt.

Dank an https://stackoverflow.com/users/4139809/jeremy-lakeman dass Sie mir diese Informationen im Zusammenhang mit einer anderen Frage mitgeteilt haben.

0voto

sonu thomas Punkte 2131

Versuchen Sie dies.

        Process notePad = new Process();

        notePad.StartInfo.FileName = "7z.exe";
        notePad.StartInfo.RedirectStandardOutput = true;
        notePad.StartInfo.UseShellExecute = false;

        notePad.Start();
        StreamReader s = notePad.StandardOutput;

        String output= s.ReadToEnd();

        notePad.WaitForExit();

Die obigen Angaben sind in einer thread .

Um die Ausgabe auf der Benutzeroberfläche zu aktualisieren, können Sie nun eine timer mit zwei Zeilen

  Console.Clear();
  Console.WriteLine(output);

Dies kann Ihnen helfen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X