Erweitertes Kommandozeilenparsing

  • Wenn das standardmäßige Parsen der CMDline von AutoIt nicht ausreicht, da man Parameter / Wetpaare benötigt, kann man die folgende Funktion verwenden
    ( Der RegExp ist nicht vollständig von mir, ich habe ihn nur für AutoIt angepasst und leicht erweitert.)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $CMDString = '/a:"value" -big="this -test:1\"23 is & $#@ _ your life" -test=th_3 -tte -äß$=/ätest/h.b'
    $ResultArray = _ParseCMDLine($CMDString)
    _ArrayDisplay($ResultArray)

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Function Name: _ParseCMDLine($CMDString)
    ; Description:: Parses a CMD-String to Parameters with Values
    ; Parameter(s): $CMDString -> String to parse
    ; Requirement(s): ?
    ; Return Value(s): Error: 0 and @error = StringRegExp-Error
    ; Success: 2 Dimensional Array:
    ; $array[$i][0] : Parameter including value
    ; $array[$i][1] : Parameter
    ; $array[$i][2] : Value with quotation marks (only if value has quotaion marks)
    ; $array[$i][3] : Value without quotation marks
    ; Author(s): Prog@ndy
    ;
    ; Basis: http://regexlib.com/REDetails.aspx?regexp_id=1220
    ;===============================================================================
    ;
    Func _ParseCMDLine($CMDString)
    Local $y, $j, $i, $entry
    Local $x = StringRegExp($CMDString,'(?:\s*)(?<=[-|/])(?<name>[^\s-|/:|=]*)(?:(?:[:|=](?:("(?<value1>.*?)(?<!\\)")|(?<value>\S*)))|\w*?)',4)
    If @error Then Return SetError(@error,0,0)
    Local $ResultArray[UBound($x)][4]
    For $i = 0 To UBound($x)-1
    $entry = $x[$i]
    For $y = 0 To UBound($entry)-1
    $j = $y
    If $y > 3 Then $j = 3
    $ResultArray[$i][$j] = $entry[$y]
    Next
    Next
    Return $ResultArray
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (30. Oktober 2008 um 10:38)

  • Hmm. ja. Aber dafür muss man die CMDLine auch parsen :) Deine Idee gefällt mir. Hab jedoch nichts, wfür ich CMDLine brauche :rolleyes:

  • Ich benutze die Funktion schon etwas länger und bin damit zufrieden.
    Für was ich das auch ganz praktisch finde ist die Verwendung für Funktionen mit Variablen Parametern.
    So muss ich nicht mit Defaults arbeiten.

    Hier mal der Link zu dem Thread.