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.
Hier der Inhalt der CmdContent-Variable bei mir:
Spoiler anzeigen
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.
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
- Private Sub StartConsoleProcess()
- 'Diese Variable beinhaltet anschließend den ausgegebenen Text.
- Dim CmdContent As String = Nothing
- Using ConsoleProcess As New Process
- 'Da das Konsolenfenster, wenn ConsoleProcess.StartInfo.UseShellExecute auf False festgelegt ist, keinen Text anzeigt, ist es unnötig, es anzuzeigen.
- ConsoleProcess.StartInfo.CreateNoWindow = True
- 'Da sich die cmd.exe im System32-Ordner befindet, muss nicht der gesamte Pfad angegeben werden.
- ConsoleProcess.StartInfo.FileName = "cmd.exe"
- 'Hier wird angegeben, dass die Streams umgeleitet werden sollen.
- ConsoleProcess.StartInfo.RedirectStandardOutput = True
- ConsoleProcess.StartInfo.RedirectStandardInput = True
- 'Es ist erforderlich, diese Eigenschaft auf False zu setzen, wenn die Streams umgeleitet werden.
- 'Das ShellExecute kommt davon, dass eine "Konsolenanwendung" ja eigentlich keine grafische Oberfläche hat.
- 'Die Konsole wird von Windows bereitgestellt, um einfach Infomationen an den Prozess geben zu können und vom Prozess bekommen zu können.
- 'Durch diese Zeile wird Windows angewiesen, Tastendrücke, die an das Konsolenfenster gelangen, nicht an den Prozess zu leiten.
- ConsoleProcess.StartInfo.UseShellExecute = False
- 'Nun wird der Prozess gestartet.
- ConsoleProcess.Start()
- 'Jetzt können Strings an den Prozess gesendet werden. Hier wird als Beispiel die Befehle "ipconfig" und anschließend "exit" gesendet.
- ConsoleProcess.StandardInput.WriteLine("ipconfig")
- ConsoleProcess.StandardInput.WriteLine("exit")
- '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.
- ConsoleProcess.WaitForExit()
- 'Im StandardOutput-Stream befinden sich nun die Informationen, die ausgegeben werden.
- CmdContent = ConsoleProcess.StandardOutput.ReadToEnd()
- End Using
- 'Hier kann mit CmdContent gearbeitet werden. Z.B. können mit RegEx die nötigen Informationen herausgefiltert werden.
- End Sub
Hier der Inhalt der CmdContent-Variable bei mir:
Quellcode
- Microsoft Windows [Version 6.2.9200]
- (c) 2012 Microsoft Corporation. Alle Rechte vorbehalten.
- D:\Projects\VB\_Tests\ConsoleStandardIO\ConsoleStandardIO\bin\Debug>ipconfig
- Windows-IP-Konfiguration
- Drahtlos-LAN-Adapter LAN-Verbindung* 1:
- Medienstatus. . . . . . . . . . . : Medium getrennt
- Verbindungsspezifisches DNS-Suffix:
- Ethernet-Adapter Ethernet:
- Verbindungsspezifisches DNS-Suffix: zyxel.com
- Verbindungslokale IPv6-Adresse . : fe80::2825:4b9d:ae69:a147%13
- IPv4-Adresse . . . . . . . . . . : 10.0.0.34
- Subnetzmaske . . . . . . . . . . : 255.255.255.0
- Standardgateway . . . . . . . . . : 10.0.0.1
- Drahtlos-LAN-Adapter WiFi:
- Medienstatus. . . . . . . . . . . : Medium getrennt
- Verbindungsspezifisches DNS-Suffix: phtl-dc.intern
- Tunneladapter isatap.zyxel.com:
- Medienstatus. . . . . . . . . . . : Medium getrennt
- Verbindungsspezifisches DNS-Suffix: zyxel.com
- Tunneladapter Teredo Tunneling Pseudo-Interface:
- Verbindungsspezifisches DNS-Suffix:
- IPv6-Adresse. . . . . . . . . . . : 2001:0:5ef5:79fb:189d:a0f:a2ad:a673
- Verbindungslokale IPv6-Adresse . : fe80::189d:a0f:a2ad:a673%16
- Standardgateway . . . . . . . . . : ::
- D:\Projects\VB\_Tests\ConsoleStandardIO\ConsoleStandardIO\bin\Debug>exit
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
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils