Konsole starten und Befehle übergeben bzw. Ergebnisse Auslesen

    • VB.NET

      Konsole starten und Befehle übergeben bzw. Ergebnisse Auslesen

      Im Bezug auf diesen Post hier ein kleines Tutorial zum Ansteuern von Cmd aus einem Programm heraus.

      Es gibt eigentlich keinen richtigen Grund, Cmd so zu verwenden, da man eigentlich alles, was Cmd kann, auch so machen kann. Die IP-Adresse des aktuellen Computers kann man mit der System.Net.Dns-Klasse herausfinden.
      Aber da dieses Vorgehen auch mit anderen Programmen funktioniert, die ähnlich funktionieren, kann es noch nützlich sein.


      Folgendes Konzept:
      Mit der System.Diagnostics.Process-Klasse wird der andere Prozess gestartet. Durch Umleiten der StandardInput- und StandardOutput- Streams können Strings an den Prozess übergeben werden und davon gelesen werden.

      Die Process-Klasse implementiert IDisposable. Deshalb bietet sich der Using-Block an.

      VB.NET-Quellcode

      1. Private Sub StartConsoleProcess()
      2. 'Diese Variable beinhaltet anschließend den ausgegebenen Text.
      3. Dim CmdContent As String = Nothing
      4. Using ConsoleProcess As New Process
      5. 'Da das Konsolenfenster, wenn ConsoleProcess.StartInfo.UseShellExecute auf False festgelegt ist, keinen Text anzeigt, ist es unnötig, es anzuzeigen.
      6. ConsoleProcess.StartInfo.CreateNoWindow = True
      7. 'Da sich die cmd.exe im System32-Ordner befindet, muss nicht der gesamte Pfad angegeben werden.
      8. ConsoleProcess.StartInfo.FileName = "cmd.exe"
      9. 'Hier wird angegeben, dass die Streams umgeleitet werden sollen.
      10. ConsoleProcess.StartInfo.RedirectStandardOutput = True
      11. ConsoleProcess.StartInfo.RedirectStandardInput = True
      12. 'Es ist erforderlich, diese Eigenschaft auf False zu setzen, wenn die Streams umgeleitet werden.
      13. 'Das ShellExecute kommt davon, dass eine "Konsolenanwendung" ja eigentlich keine grafische Oberfläche hat.
      14. 'Die Konsole wird von Windows bereitgestellt, um einfach Infomationen an den Prozess geben zu können und vom Prozess bekommen zu können.
      15. 'Durch diese Zeile wird Windows angewiesen, Tastendrücke, die an das Konsolenfenster gelangen, nicht an den Prozess zu leiten.
      16. ConsoleProcess.StartInfo.UseShellExecute = False
      17. 'Nun wird der Prozess gestartet.
      18. ConsoleProcess.Start()
      19. 'Jetzt können Strings an den Prozess gesendet werden. Hier wird als Beispiel die Befehle "ipconfig" und anschließend "exit" gesendet.
      20. ConsoleProcess.StandardInput.WriteLine("ipconfig")
      21. ConsoleProcess.StandardInput.WriteLine("exit")
      22. 'Die Befehle werden vom Prozess verarbeitet. Durch das übergeben von "exit" wird der Prozess anschließend beendet. Dadurch haben wir eine Rückmeldung darüber, wann der andere Prozess fertig ist.
      23. ConsoleProcess.WaitForExit()
      24. 'Im StandardOutput-Stream befinden sich nun die Informationen, die ausgegeben werden.
      25. CmdContent = ConsoleProcess.StandardOutput.ReadToEnd()
      26. End Using
      27. 'Hier kann mit CmdContent gearbeitet werden. Z.B. können mit RegEx die nötigen Informationen herausgefiltert werden.
      28. End Sub


      Hier der Inhalt der CmdContent-Variable bei mir:
      Spoiler anzeigen

      Quellcode

      1. Microsoft Windows [Version 6.2.9200]
      2. (c) 2012 Microsoft Corporation. Alle Rechte vorbehalten.
      3. D:\Projects\VB\_Tests\ConsoleStandardIO\ConsoleStandardIO\bin\Debug>ipconfig
      4. Windows-IP-Konfiguration
      5. Drahtlos-LAN-Adapter LAN-Verbindung* 1:
      6. Medienstatus. . . . . . . . . . . : Medium getrennt
      7. Verbindungsspezifisches DNS-Suffix:
      8. Ethernet-Adapter Ethernet:
      9. Verbindungsspezifisches DNS-Suffix: zyxel.com
      10. Verbindungslokale IPv6-Adresse . : fe80::2825:4b9d:ae69:a147%13
      11. IPv4-Adresse . . . . . . . . . . : 10.0.0.34
      12. Subnetzmaske . . . . . . . . . . : 255.255.255.0
      13. Standardgateway . . . . . . . . . : 10.0.0.1
      14. Drahtlos-LAN-Adapter WiFi:
      15. Medienstatus. . . . . . . . . . . : Medium getrennt
      16. Verbindungsspezifisches DNS-Suffix: phtl-dc.intern
      17. Tunneladapter isatap.zyxel.com:
      18. Medienstatus. . . . . . . . . . . : Medium getrennt
      19. Verbindungsspezifisches DNS-Suffix: zyxel.com
      20. Tunneladapter Teredo Tunneling Pseudo-Interface:
      21. Verbindungsspezifisches DNS-Suffix:
      22. IPv6-Adresse. . . . . . . . . . . : 2001:0:5ef5:79fb:189d:a0f:a2ad:a673
      23. Verbindungslokale IPv6-Adresse . : fe80::189d:a0f:a2ad:a673%16
      24. Standardgateway . . . . . . . . . : ::
      25. D:\Projects\VB\_Tests\ConsoleStandardIO\ConsoleStandardIO\bin\Debug>exit
      Man erkennt schön, wie die beiden Befehle eingefügt wurden.


      Ein Tipp noch: Man sollte sich den Inhalt von CmdContent per System.IO.File.WriteAllText(Pfad, CmdContent) in eine Textdatei auf dem Desktop speichern. Dadurch wird das Debuggen wesentlich einfacher, da man den Text bequem parat hat.
      "Luckily luh... luckily it wasn't poi-"
      -- Brady in Wonderland, 23. Februar 2015, 1:56
      Desktop Pinner | ApplicationSettings | OnUtils