Meldungen von ext. Prozessen verarbeiten

Hallo,

ich starte einen externen Prozess, es handelt sich dabei um eine Konsolenanwendung, welcher beim Start bestimmte Parameter übergeben werden. Diese führt aufgrund dessen, die Arbeit aus, bei welcher Sie fortwährend meldungen zurückliefert. Meldungen wie z.B.:

Bearbeite Datei D:\lulu\lala\lili.jpg
Datei bearbeitet
Bearbeite Datei D:\lulu\lala\lili1.jpg
Datei bearbeitet
Bearbeite Datei D:\lulu\lala\lili2.jpg
Datei bearbeitet

usw. eben den Barbeitungsstatus im weitesten Sinne. Hier mein Code dazu:

p.StartInfo.FileName = Me.TextBoxSelectInstallDir.Text & "\Prozess.exe"
 PackPath = " e -kb """ & Me.TextBoxSelect.Text & """ """ & Me.TextBoxSelectDir.Text & """"
 MessageBox.Show(PackPath)
 p.StartInfo.Arguments = PackPath
 p.StartInfo.UseShellExecute = False
 p.StartInfo.RedirectStandardOutput = True
 p.StartInfo.RedirectStandardError = True
 p.StartInfo.CreateNoWindow = True

 Try
 p.Start()
 Me.ProgressBar.Show()
 p.WaitForExit()
 p.Close()
 Me.ProgressBar.Hide()
 Catch ex As Exception
 MessageBox.Show(ex.Message)
 End Try

Nun möchte ich gerne, die Meldungen dieses Prozessen abfangen und verarbeiten, doch möchte ich die Fehlermeldungen/Meldungen EINZELN Ausgeben können, also Zeilenweise in Echtzeit. Mit „ReadToEnd“ komm ich nicht weiter. Ich möchte die Meldungen zum einen in einem Label ausgeben lassen, also so zu sagen den bearbeitungsstatus und zum Anderen auf Fehlermelungen reagieren können.

Folgenermaßen kann so eine Meldung z.B. aussehen:

Die Datei XY existiert bereits!
Soll die Datei überschrieben werden?
[j]a [n]ein [u]mbennenen [a]bbrechen
Lesefehler in Datei
Falscher Handle

Letzten Endes weiss ich so, dass die Datei schon existiert und könnte eben darauf reagieren. doch wie kann ich diese Fehlermeldung aus dem Stream abfangen und entsprechend auswerten.

Ich weiss es ist ne Menge Holz, aber es wäre mir schon wichtig. Vielen Dank schon mal.

Hallo!
Das machst Du vermutlich am besten in einem BackgroundWorker und liest die Ausgaben einfach mit ReadLine() aus.
In etwa so (ist zwar C#, aber ich bin jetzt zu faul, das auch noch nach VB.NET zu übersetzen… :smile:):

BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler(w\_DoWork);
w.ProgressChanged += new ProgressChangedEventHandler(w\_ProgressChanged);
w.WorkerReportsProgress = true;
w.RunWorkerAsync();

und die entsprechenden EventHandler dazu:

void w\_DoWork(object sender, DoWorkEventArgs e)
{
 // Aufruf Deiner Anwendung hier ersetzen...
 ProcessStartInfo psi = new ProcessStartInfo("ping", "localhost");
 psi.RedirectStandardOutput = true;
 psi.UseShellExecute = false;
 
 Process p = Process.Start(psi);
 while (!p.HasExited)
 {
 string s = p.StandardOutput.ReadLine();
 if (!string.IsNullOrEmpty(s))
 {
 (sender as BackgroundWorker).ReportProgress(0, s);
 }
 }
}
 
void w\_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
 // In e.UserState steht jetzt eine Zeile der Ausgabe
}

Gruß,
Martin