Code effizienter machen

  • Hallo Leute,

    ich möchte von einem aktiven Netzwerkadapter diverse Werte in einer Msgbox anzeigen lassen.
    Dazu speichere ich die ipconfig /all in eine txt Datei. In dieser Datei suche ich nach einer IPv4
    Adresse (die in diesem Fall nur in dem Block des aktiven Netzwerkadapters steht).
    Von dieser Zeile suche ich nach oben und unten die nächsten Leerzeilen, was Anfang und Ende
    des jeweiligen Adapters ist.
    Wenn ich auf diesen Weg den Bereich eingrenzt habe, schreibe ich die gewünschten Werte in ein Array
    und gebe diese in der Msgbox aus.

    So weit der Stand und macht auch das was es soll... :/

    ..aber irgendwie kommt mir das alles zu kompliziert vor wie ich das angehe.
    Vielleicht kann mir mal jemand seine Ideen dazu äußern wie er oder sie
    da dran gehen würden.
    Damit meine ich nicht, wie ich mir alternativ die gewünschten Werte herzaubere(kann aber auch gerne erwähnt werden)
    sondern eher wie ich die Informationen "eleganter" aus der Textdatei bekomme.

    Die ipconfig /all sieht ja von Rechner zu Rechner verschieden aus (Anzahl der Adapter, Variable Reihenfolgen etc).

    Gruß Damion

    Spoiler anzeigen


    #include <Constants.au3>
    #include <Inet.au3>
    #include <File.au3>
    #include <Array.au3>


    ;Deklaration der benötigten Arrays
    Local $WerteArray[7]
    Local $SucheArray[7]


    ;Suchbegriffe dem SucheArray zugewiesen


    $SucheArray[0] = "IPv4"
    $SucheArray[1] = "Subnetzmaske"
    $SucheArray[2] = "Standardgateway"
    $SucheArray[3] = "Physi"
    $SucheArray[4] = "DHCP aktiviert"
    $SucheArray[5] = "DHCP-Server"
    $SucheArray[6] = "DNS-Server"


    ;Aufruf der IPCONFIG /all Routine mit erstellen und speichern in die Textdatei IP.txt
    Run('cmd /c ipconfig /all > "IP.txt"', "", @SW_HIDE)


    Sleep(500)


    ;Zählen der Zeilen in der Textdatei IP.txt
    $Zeilen_Count = _FileCountLines("IP.txt")


    ;Suche nach verbundener Schnittstelle, anhand der IPv4 Adresse
    For $i = 1 To $Zeilen_Count Step 1
    $Zeile = FileReadLine("IP.txt", $i)
    $Suche = StringInStr($Zeile, $SucheArray[0])
    If $Suche > 0 Then
    ExitLoop
    ElseIf $i=$Zeilen_Count Then
    msgbox(64,"Netzwerkeinstellungen","Es sind keine Netzwerkadapter verbunden.")
    Exit
    EndIf


    Next


    ;Suche nach erster Leerzeile, ausgehend von IPv4 Adresse
    For $Start = $i To $i - $i + 1 Step -1
    $Zeile = FileReadLine("IP.txt", $Start)
    If $Zeile = "" Then
    ExitLoop
    EndIf
    Next


    ;Suche nach nächster Leerzeile, ausgehend von IPv4 Adresse
    For $Stop = $i To $Zeilen_Count
    $Zeile = FileReadLine("IP.txt", $Stop)
    If $Zeile = "" Then
    ExitLoop
    EndIf
    Next


    ; Beschreiben des Arrays mit den gesuchten Werten
    For $Filter = $Start To $Stop


    For $Array = 0 To UBound($SucheArray) - 1
    $Zeile = FileReadLine("IP.txt", $Filter)
    $Suche = StringInStr($Zeile, $SucheArray[$Array])
    If $Suche > 0 Then
    $SSplit = StringSplit($Zeile, ":", 2)
    $WerteArray[$Array] = $SSplit[1]


    ExitLoop
    EndIf
    Next


    Next


    MsgBox(64, "Netzwerkeinstellungen", @CRLF _
    & FileReadLine("IP.txt", $Start - 1) & @CRLF _
    & "---------------------------------------" & @CRLF _
    & "IPv4 Adresse = " & StringTrimRight($WerteArray[0], 12) & @CRLF _
    & "Subnetzmaske = " & $WerteArray[1] & @CRLF _
    & "Standart Gateway = " & $WerteArray[2] & @CRLF _
    & "MAC Adresse = " & $WerteArray[3] & @CRLF _
    & "DHCP aktiviert = " & $WerteArray[4] & @CRLF _
    & "DHCP Server = " & $WerteArray[5] & @CRLF _
    & "DNS Server =" & $WerteArray[6])


    FileDelete("IP.txt")

  • Alles kann man optimieren. Es gibt bereits schon UDFs die mit der WMI arbeiten die die Infos direkt ausspuckt.
    Ich habe das hier im englischen Forum gefunden: https://www.autoitscript.com/forum/topic/17…c-in-workgroup/

    Mit StringSplit habe ich das ganze meiner Meinung nach etwas schicker lösen können (im Vergleich zu deinem).
    Aber das ganze kann man sicherlich mit regulären Ausdrücken noch hübscher lösen:

    Bei dieser Variante werden allerdings die Einträge die zuerst gefunden werden zuerst abgespeichert, also ist die Reihenfolge im Array egal.
    Du kannst das sicherlich umbauen, ist ja nur ein Vorschlag wie man es lösen kann.

  • Danke für den Link, ist sehr interessant.

    Deine Lösung gefällt mir auch sehr gut, ist schon um einiges schlanker wie die meine.

    Was macht eigentlich genau $i += 1 , zählt das noch zu $i 1 dazu also $i=$i+1 ?

    Ja, wie so eine Lösung mit regulären Ausdrücken aussehen könnte würde mich
    auch sehr interessieren.

    • Offizieller Beitrag

    Für mein Computer-Info hatte ich mal diverse Funktionen geschrieben, die das per WMI auslesen:

  • Auch eine schöne alternative Lösung von Oscar :)

    Dann danke schon mal für eure Antworten.

    Wenn noch jemand eine Lösung mit reguläre Ausdrücke parat hat, würde ich mich
    freuen.

    Einen schönen sonnigen Samstag noch!

    Gruß Damion