Entwickler-Ecke

IO, XML und Registry - Batch per ClickEvent starten und CMD in TextBox auslesen


Kobas17 - So 21.05.17 13:23
Titel: Batch per ClickEvent starten und CMD in TextBox auslesen
Liebes Forum

Ich habe folgendes Problem. Ich löse einen Prozess aus der eine Batch Datei startet, die Funktionalität des Batches ist gegeben.
Sobald ich das CMD Fenster schließe erscheint auch der Inhalt in meiner Textbox. Ich möchte gerne erreichen das der Inhalt direkt
in die Textbox geschrieben wird ohne das ich das CMD Fester schließen muss, da der Batch länger läuft und viele Logs ausgibt.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
private void StartButton_Click(object sender, EventArgs e)
        {
            Process Send = new Process();
            Send.StartInfo = new ProcessStartInfo("C:\\Users\\Ich\\Desktop\\copy.bat");
            Send.StartInfo.CreateNoWindow = false;
            Send.StartInfo.UseShellExecute = false;
            Send.StartInfo.RedirectStandardError = true;
            Send.StartInfo.RedirectStandardOutput = true;
            Send.StartInfo.RedirectStandardOutput = true;

            //Ausführen
            Send.Start();
            StreamReader mySr = Send.StandardOutput;
            textBox1.Text = mySr.ReadToEnd();
        }


Danke für euere Unterstützung


Moderiert von user profile iconChristian S.: Topic aus Alle Sprachen - Alle Plattformen verschoben am So 21.05.2017 um 16:25


Th69 - So 21.05.17 18:44

Hallo,

statt ReadToEnd() starte das Einlesen mittels Process.BeginOutputReadLine [https://msdn.microsoft.com/de-de/library/system.diagnostics.process.beginoutputreadline(v=vs.110).aspx] und verwende dann das Ereignis OutputDataReceived, um die Ausgaben nach und nach in die TextBox zu schreiben (per AppendText) - s.a. Beispiel im Link.

PS: Evtl. mußt du die Ausgabe in die TextBox dann per Invoke mit dem UI-Thread synchronisieren (s. Gewusst wie: Threadsicheres Aufrufen von Windows Forms-Steuerelementen [https://msdn.microsoft.com/de-de/library/ms171728(v=vs.110).aspx]).

Und bitte Crossposts immer hier angeben: myCSharp.de - Batch per ClickEvent starten und CMD in TextBox auslesen [http://www.mycsharp.de/wbb2/thread.php?threadid=119179]


Kobas17 - So 21.05.17 19:51

Hallo Th69

Das verstehe ich nicht ganz , ganz du das für einen Anfänger übersetzen ?

LG


Delete - So 21.05.17 22:09

- Nachträglich durch die Entwickler-Ecke gelöscht -


Kobas17 - Mo 22.05.17 09:30

Hallo Th69

leider komme ich mit deinem Lösungsvorschlag nicht weiter , ich erhalte folgende Fehlermeldung.
Zitat:
Fehler CS0079 Das Process.OutputDataReceived-Ereignis kann nur links von += oder -= verwendet werden. WindowsFormsApplication5

Beste Grüsse

Moderiert von user profile iconTh69: Quote-Tag hinzugefügt


Ralf Jansen - Mo 22.05.17 10:29

Und? Wie hast du OutputDataReceived verwendet? Sollen wir raten?

Nebenbei die Doku [https://msdn.microsoft.com/de-de/library/system.diagnostics.process.outputdatareceived.aspx] ist oft hilfreich. Insbesondere auch in diesem Fall. Wenn einem der Stil der Erklärungen in der Doku nicht liegt sind da meist auch noch Codebeispiele.


Kobas17 - Mo 22.05.17 10:59

Hallo Ralf Jansen

anbei mein Codbeispiel:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
private void bunifuThinButton21_Click(object sender, EventArgs e)
        {
            Process Send = new Process();
            Send.StartInfo = new ProcessStartInfo("C:\\Users\\Ich\\copy.bat");
            Send.StartInfo.CreateNoWindow = false;
            Send.StartInfo.UseShellExecute = false;
            Send.StartInfo.RedirectStandardError = true;
            Send.StartInfo.RedirectStandardOutput = true;
            Send.StartInfo.RedirectStandardOutput = true;
            Send.OutputDataReceived += BeginOutputReadLine;
        
        //Ausführen
        Send.Start();
            StreamReader mySr = Send.StandardOutput;
            textBox1.Text = mySr.ReadToEnd();

            

            string stdOutput = Send.StandardOutput.ReadToEnd();
            string stdError = Send.StandardError.ReadToEnd();
            
        }


Ralf Jansen - Mo 22.05.17 11:26

Der Code sieht jetzt nicht so aus als hätte der was mit deiner Fehlermeldung zu tun.
Du hast zumindest vergessen Send.BeginOutputReadLine(); aufzurufen. Schau dir am besten das Codebeispiel in der Doku an.


Kobas17 - Di 23.05.17 09:19

Hallo Herr Jansen

ich bekomme das leider anhand des Beispielscodes nicht zum laufen. kannst du mir evtl ein deutschsprachiges Tutorial empfehlen?
Vor allem eines wo erklärt wird was genau diese send.BeginOutputReadLine() auslöst und wie es verwendet wird.

Dank


Delete - Di 23.05.17 10:13

- Nachträglich durch die Entwickler-Ecke gelöscht -