Abfangen der Ausgabe eines Kommandozeilenprogrammes



  • Abend zusammen,

    ich habe hier ein Programm namens extip, das mir per Kommandozeile meine aktuelle IP zurückliefert.

    c:\>extip
    123.123.123.123

    Ist es möglich dieses Programm im C#-Code aufzurufen und die Ausgabe irgendwie in einen String umzuleiten ?

    Danke für Tips 🙂

    lG
    Guldenstern



  • Um ein externes Programm in .Net zu starten Verwendest du am besten die Process Klasse. Dort kannst du auch die Ausgabe auslesen.

    Bsp aus der MSDN:

    Process myProcess = new Process();
    ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("Process_StandardOutput_Sample.exe" );
    myProcessStartInfo.UseShellExecute = false;
    myProcessStartInfo.RedirectStandardOutput = true;
    myProcess.StartInfo = myProcessStartInfo;
    myProcess.Start();
    
    StreamReader myStreamReader = myProcess.StandardOutput;
    // Read the standard output of the spawned process.
    string myString = myStreamReader.ReadLine();
    Console.WriteLine(myString);
    myProcess.Close();
    


  • Oder (gehört nicht ganz zum Thema) du machst das gleich in deinem Programm dann kannst du dir den Aufruf von extip sparen

    Auch aus der MSDN:

    using System;
    using System.Net;
    
    public class GetIPAddress
    {
        private static void Main()
        {
            // Hostnamen und IP-Adresse abrufen.
            string hostName = Dns.GetHostName();
    
            // Die erste passende IP-Adresse abrufen.
            string ipAddress = Dns.GetHostByName(hostName).AddressList[0].ToString();
    
            Console.WriteLine("Hostname: " + hostName);
            Console.WriteLine("IP-Adresse: " + ipAddress);
    
            Console.ReadLine();
        }
    }
    

    Mfg



  • EDIT:
    Hat sich erledigt.
    Thx trotzdem ^^

    Greetz



  • @ncc-1701-m

    Danke für den Tip - damit komme ich schon sehr weit.
    Unangenehm ist nur der Nebeneffekt, dass bei jedem Start des Prozesses ein Kommandozeilenfenster aufpoppt. Lässt sich das irgendwie unterdrücken ?

    Danke
    Guldenstern



  • Hallo,

    ich habe diesen Eintrag aufgegriffen weil ich etwas ähnliches programmieren möchte.
    Es gelint mir jedoch nicht mit dem Prozess-Modell von ncc-1701-m eine Ausgabe in den String myString zu schreiben.
    Ich benutze eine "pingen.bat" die den Befehl "ping localhost -t" ausführt.

    Ich bekomme keinen Fehler, es wird einfach nichts geschrieben.
    Weiß vielleicht jemand wie das funktionieren könnte ?

    Ich bin für jeden Tip dankbar
    Arial



  • Zeig doch mal wie du das bis jetzt machst.

    Ich hatte einmal was ganz unangenehmes:
    Das Umleiten der Ausgabe hat nur funktioniert, wenn ich das Programm mit F5 (Debug Modus) gestartet habe. Wenn ich es "direkt" ausgeführt habe hat es nicht funktioniert. Habe das Problem bis heute nicht gelöst.



  • genau so wie es in der MSDN steht:

    ProcessStartInfo myProcessStartInfo = new ProcessStartInfo ("C:\\WINDOWS\\system32\\ping.exe" );
    myProcessStartInfo.UseShellExecute = false;
    myProcessStartInfo.RedirectStandardOutput = true;
    myProcess.StartInfo = myProcessStartInfo;
    myProcess.Start();
    StreamReader myStreamReader = myProcess.StandardOutput;
    string myString = myStreamReader.ReadLine();
    

    Es ist aber egal ob ich ping.exe oder meine selbstgemachte .bat verwende. Wenn ich mspaint.exe starte hängt das ganze bei der vorletzten Zeile...



  • Habs jetzt gelöst:

    Process myProcess = new Process();
    ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("IPCONFIG.exe");
    myProcessStartInfo.UseShellExecute = false;
    myProcessStartInfo.RedirectStandardOutput = true;
    myProcessStartInfo.Arguments = "/all";
    myProcessStartInfo.CreateNoWindow = true;
    
    myProcess.StartInfo = myProcessStartInfo;
    myProcess.Start();
    string output = myProcess.StandardOutput.ReadToEnd();
    myProcess.WaitForExit();
    abc+=output;
    

    Der einzige Unterschied ist

    myProcessStartInfo.Arguments = "/all";
    myProcessStartInfo.CreateNoWindow = true;
    myProcess.WaitForExit();
    

    aber es klappt jetzt 😃 😃



  • @Guldenstern

    mit dem von mir geposteten Code ist auch dein Fensterproblem behoben


Anmelden zum Antworten