C#: externe shell-Befehl Ergebnis zeilenweise
Ich Schreibe ein C# - winform-Anwendung, starten Sie einen zweiten Prozess zum ausführen von shell-Kommandos wie "dir" und "ping". Ich leiten den zweiten Prozess der Ausgabe, so dass meine app empfangen werden können Befehl Ergebnis. Es funktioniert grob gesagt in Ordnung.
Das problem ist nur, mein winform-app erhält den Befehl line-Ausgang als ganzes, anstatt Zeile für Zeile. Zum Beispiel, es hat zu warten, bis der externe Befehl "ping" zu beenden (das dauert viele Sekunden oder mehr) und erhält dann die gesamte Ausgabe (viele Linien) auf einmal.
Was ich will, ist die app erhält der cmdline Ausgabe in Echtzeit, d.h. durch Linien, die nicht durch den block. Ist das machbar?
Ich bin mit diesem code, um die Ausgabe Lesen:
while ((Ergebnis = proc.StandardOutput.ReadLine()) != null)
Aber es hat nicht so funktioniert, wie ich es erwartet habe.
Vielen Dank im Voraus.
EDIT: hier ist der code, den ich verwende:
System.Diagnostics.ProcessStartInfo procStartInfo = new
System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
//The following commands are needed to redirect the standard output.
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
//Now we create a process, assign its ProcessStartInfo and start it
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
//Get the output into a string
string result;
try {
while ((result = proc.StandardOutput.ReadLine()) != null)
{
AppendRtfText(result+"\n", Brushes.Black);
}
} //here I expect it to update the text box line by line in real time
//but it does not.
- mögliche Duplikate
- Zeigt den code, den Sie versuchte, hilfreich sein wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf das Beispiel in in diesem msdn-Artikel, wie das Lesen komplett async.
Darüber hinaus erwarte ich deine code nicht zu Lesen, Zeile für Zeile, jetzt aber die UI nicht mal repaint (fehlende Anwendung.DoEvents(); nach der Aktualisierung der RTFTextBox
Statt der Schleife mit
while ((result = proc.StandardOutput.ReadLine()) != null)
sollten Sie verwenden:Dieser startet asynchrones Lesen der Linien, wenn Sie kommt, Sie verarbeiten dann die Zeilen Lesen, die von
e.Data
improc_DataReceived
handler, da Sie verwendenBeginOutputReadline
diee.Data
ist, wird eine Zeichenfolge Linien.Könnte dies nützlich sein:
http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/8d6cebfc-9b8b-4667-85b5-2b92105cd0b7/
http://www.dotnetperls.com/redirectstandardoutput
Ich hatte das gleiche Problem und bekam, um es mit der folgenden. Ich fand, dass, wenn ich hatte einen Fehler in der externen app, die ich immer war kein Ausgang bei Verwendung des
ReadToEnd()
Methode, so wechselte die Linie durch die Linie streamreader. Wird die Umschaltung über die Verwendung der Antwort des Saa würde aber wie die aussieht, wie die richtige Art und Weise zu behandeln.Fand auch diese Lösung: c# coding convention öffentlichen/privaten Kontext die für die Fehlerbehandlung zur gleichen Zeit und geben eine ausführlichere Erklärung zur Verwendung von
externalApp.OutputDataReceived += (sender, args) => Console.WriteLine(args.Data);