Anbei ein Testprogramm, mit dem man den cmd-Prozess ("Eingabe-Aufforderung") starten kann, und per Textbox kann man Befehle eingeben, und in eine Richtextbox wird der Output des Befehls geloggt.
Also ein WinForms-Wrapper für die Windows-Konsole.
Hat keinen direkten Verwendungswert, denn wenn man etwa den "RoboCopy"-BetriebsSystem-Befehl programmgesteuert ausführen will, dann startet man besser direkt einen Robocopy-Prozess, statt einem Cmd-Prozess zu starten, und dort "Robocopy ..." einzugeben (wodurch der Robocopy-Prozess dann indirekt gestartet ist).
Aber ganz allgemein die richtige Konfigurierung des
Wie man sieht, sind allerlei Einstellungen zu treffen, bevor man den Prozess startet. Beachte auch das
Und beachte auch zeile#11 -
Naja - irgendwann hab ich das nu doch irgendwo aufgeschnappt, wie's geht, und ihr jetzt auch
Jo, also hier noch das Event, was man nun verarbeiten kann:
Das Event trudelt im NebenThread ein, daher ist BeginInvoke zu verwenden, um die Daten im MainThread zur letztendlichen Verarbeitung zu schicken - hier ist das nur die Ausgabe in eine Richtextbox.
Aber damit ist das Grundgerüst einer responsiven Kommunikation mit einem codeseitig gestarteten Prozess gezeigt.
Eine sinnvolle praktische Anwendung könnte nun sein, einen "ipconfig"-Prozess zu starten, und aus dessen Ausgabe die eigene externe Ip auszulesen, oder sowas.
Also ein WinForms-Wrapper für die Windows-Konsole.
Hat keinen direkten Verwendungswert, denn wenn man etwa den "RoboCopy"-BetriebsSystem-Befehl programmgesteuert ausführen will, dann startet man besser direkt einen Robocopy-Prozess, statt einem Cmd-Prozess zu starten, und dort "Robocopy ..." einzugeben (wodurch der Robocopy-Prozess dann indirekt gestartet ist).
Aber ganz allgemein die richtige Konfigurierung des
Process
-Objektes ist von wesentlicher Bedeutung, wenn man mit einen Prozess dialogisch starten will - also dass man in seinen StandardInput
-Textwriter was reinschreibt, und die "Antworten" des Prozesses als String im DataReceived
-Event empfangen kann:VB.NET-Quellcode
- Private Sub LaunchConsoleProcess()
- _Process = New Process With {.EnableRaisingEvents = True}
- With _Process.StartInfo
- .CreateNoWindow = True
- .UseShellExecute = False
- .FileName = "cmd"
- .RedirectStandardInput = True
- .RedirectStandardOutput = True
- End With
- If Not _Process.Start() Then MessageBox.Show("Fail") : Return
- _Process.BeginOutputReadLine()
- End Sub
.EnableRaisingEvents = True
in zeile#2.Und beachte auch zeile#11 -
_Process.BeginOutputReadLine()
. Ich finds vom Design her bescheuert, dass man das EventRaising aktivieren muss, und ausserdem noch das Lesen des Outputs - sonst gibts halt doch kein Event Naja - irgendwann hab ich das nu doch irgendwo aufgeschnappt, wie's geht, und ihr jetzt auch
Jo, also hier noch das Event, was man nun verarbeiten kann:
VB.NET-Quellcode
- Private Sub _Process_OutputDataReceived(sender As Object, e As DataReceivedEventArgs) Handles _Process.OutputDataReceived
- BeginInvoke(Sub() OutputData(e.Data))
- End Sub
- Private Sub OutputData(txt As String)
- txtLog.AppendText(txt & Lf)
- txtLog.Select(txtLog.TextLength, 0)
- txtLog.ScrollToCaret()
- End Sub
Aber damit ist das Grundgerüst einer responsiven Kommunikation mit einem codeseitig gestarteten Prozess gezeigt.
Eine sinnvolle praktische Anwendung könnte nun sein, einen "ipconfig"-Prozess zu starten, und aus dessen Ausgabe die eigene externe Ip auszulesen, oder sowas.