2017-06-30 1 views
2

Ich erstellte eine GUI, die eine Batch-Datei und zeigt die Befehlszeile in einem Textfeld nach dem Klicken auf eine Schaltfläche angezeigt. Die Stapeldatei wird ausgeführt und die Ausgabe wird für einige Zeit ordnungsgemäß umgeleitet, bis ca. 80 Zeilen eingegeben wurden und die Textboxausgabe plötzlich den tatsächlichen Code in der Stapeldatei anzeigt. Bedeutet dies einen Fehler in der Batch-Datei oder ein Problem mit meinem Skript? Ich weiß nicht wirklich, wie man mit dem Debuggen dieses Problems beginnt.Umleiten Batch-Dateiausgabe zu Winform Textfeld Probleme

Ich bemerke auch, dass die Batch-Datei, die ich von der GUI anrufe, Aufrufe an andere Batch-Dateien macht. Könnte das auch Probleme verursachen?

Ich sollte auch erwähnen, dass die Batchdatei erfolgreich über die Befehlszeile ausgeführt wird.

private void buildProg_Click(object sender, EventArgs e) 
{ 
    using (Process process = new Process()) 
    { 
     process.StartInfo.WorkingDirectory = some_directory; 
     process.StartInfo.FileName = "start.bat"; 
     process.StartInfo.Arguments = "arg1 arg2"; 
     process.StartInfo.CreateNoWindow = true; 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.RedirectStandardError = true; 
     process.OutputDataReceived += proc_OutputDataReceived; 
     process.EnableRaisingEvents = true; 
     process.Start(); 
     process.BeginOutputReadLine(); 
    } 
} 

private void proc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    this.Invoke((Action)(() => 
    { 
     textBox1.AppendText(Environment.NewLine + e.Data); 
    })); 
} 

Wenn ich es von der GUI aus starte, scheint die Batch-Datei in diesem Teil zu stolpern.

if exist %version_file_path% ( set /p _version= <%version_file_path% ) else ( echo %version_file_path% not found pause )

Antwort

0

Es gibt zwei großartige Dinge;

1) Die /p Anweisung fragt nach Benutzereingaben, pausiert den Befehl und wartet.

2) Sie entsorgen den Prozess, bevor die Ereignisse ausgelöst werden, was bedeutet, dass wir nicht in der Lage sind, die Eingaben zu simulieren, die für die weitere Ausführung erforderlich sind.

Dieses ziemlich löst es:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.FormClosing += Form1_FormClosing; 
    } 

    Process p; 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     p?.Dispose(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (p != null) 
      p.Dispose(); 

     p = new Process(); 
     p.StartInfo.WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     p.StartInfo.FileName = "test.bat"; 
     p.StartInfo.Arguments = ""; 
     p.StartInfo.CreateNoWindow = true; 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.RedirectStandardInput = true; 
     p.OutputDataReceived += proc_OutputDataReceived; 
     p.Start(); 
     p.BeginOutputReadLine(); 
    } 

    private void proc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     this.Invoke((Action)(() => 
     { 
      textBox1.AppendText(Environment.NewLine + e.Data); 

     })); 

     //can use either of these lines. 
     (sender as Process)?.StandardInput.WriteLine(); 
     //p.StandardInput.WriteLine(); 
    } 
} 
+0

Ich glaube, du hast recht es ein Problem mit einem Charakter sein könnte ... habe ich den Teil der Batchdatei, die seine bis auf Auslösung. Ich bin nicht berechtigt, die Batch-Datei zu ändern, also gibt es eine Möglichkeit, wie ich diesen Teil umgehen und ihn erhalten kann? – SirWiggles

+0

Nachdem ich Ihr Problem reproduziert habe, kann ich sehen, dass es der Schalter '/ p 'ist, der bewirkt, dass das Ereignis OutputDataReceived aufhört zu feuern. Das ist in der Tat ein sehr merkwürdiger Bug. Ich werde meine Antwort aktualisieren, wenn ich es herausfinden kann ... aber das könnte über mich hinausgehen. –

+0

Aha! Aktualisieren meiner Antwort, wie es gelöst ist :) –