Autor Beitrag
Kobas17
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 21.05.17 13:23 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 21.05.17 18:44 
Hallo,

statt ReadToEnd() starte das Einlesen mittels Process.BeginOutputReadLine 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).

Und bitte Crossposts immer hier angeben: myCSharp.de - Batch per ClickEvent starten und CMD in TextBox auslesen
Kobas17 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: So 21.05.17 19:51 
Hallo Th69

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

LG
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 21.05.17 22:09 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Kobas17 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 22.05.17 10:29 
Und? Wie hast du OutputDataReceived verwendet? Sollen wir raten?

Nebenbei die Doku 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 22.05.17 10:59 
Hallo Ralf Jansen

anbei mein Codbeispiel:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: 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
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 23.05.17 10:13 
- Nachträglich durch die Entwickler-Ecke gelöscht -