Cmd-Remote

    • VB.NET
      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 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

      1. Private Sub LaunchConsoleProcess()
      2. _Process = New Process With {.EnableRaisingEvents = True}
      3. With _Process.StartInfo
      4. .CreateNoWindow = True
      5. .UseShellExecute = False
      6. .FileName = "cmd"
      7. .RedirectStandardInput = True
      8. .RedirectStandardOutput = True
      9. End With
      10. If Not _Process.Start() Then MessageBox.Show("Fail") : Return
      11. _Process.BeginOutputReadLine()
      12. End Sub
      Wie man sieht, sind allerlei Einstellungen zu treffen, bevor man den Prozess startet. Beachte auch das .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 :cursing:

      Naja - irgendwann hab ich das nu doch irgendwo aufgeschnappt, wie's geht, und ihr jetzt auch :D
      Jo, also hier noch das Event, was man nun verarbeiten kann:

      VB.NET-Quellcode

      1. Private Sub _Process_OutputDataReceived(sender As Object, e As DataReceivedEventArgs) Handles _Process.OutputDataReceived
      2. BeginInvoke(Sub() OutputData(e.Data))
      3. End Sub
      4. Private Sub OutputData(txt As String)
      5. txtLog.AppendText(txt & Lf)
      6. txtLog.Select(txtLog.TextLength, 0)
      7. txtLog.ScrollToCaret()
      8. End Sub
      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.
      Dateien
      • ConsoleRemote.zip

        (13,56 kB, 227 mal heruntergeladen, zuletzt: )