Kommandzeilenparameterpaare ermitteln

  • Da es ja immer verschiedene Möglichkeiten für eine Lösung gibt, hier mal eine Variante. Ich weiß, ist nicht sonderlich elegant, aber sollte dennoch ausreichen und vor allem funktionieren:

    [autoit]

    Func _CmdPairs()
    Local $n, $i_Counter, $as_Params[1][2]
    If $cmdline[0] = 0 Then Return -1
    For $n = 1 To $cmdline[0]
    If StringRegExp($cmdline[$n], "-\w", 0) = 1 Then
    $i_Counter = $i_Counter + 1
    ReDim $as_Params[$i_Counter + 1][2]
    $as_Params[$i_Counter][0] = StringTrimLeft($cmdline[$n], 1)
    If $n < $cmdline[0] Then
    If StringRegExp($cmdline[$n + 1], "-\w", 0) = 0 Then
    $as_Params[$i_Counter][1] = $cmdline[$n + 1]
    $n = $n + 1
    EndIf
    EndIf
    Else
    ; du hast nicht angegeben, was passieren soll, wenn
    ; ein Parameter ausser -x als erstes oder mehrmals
    ; hintereinander angegeben wird; Auswertung jedenfalls
    ; hier ;)
    EndIf
    Next
    $as_Params[0][0] = $i_Counter
    Return $as_Params
    EndFunc ; //--> _CmdPairs()

    [/autoit]

    Grüße,
    Buffo

    Einmal editiert, zuletzt von Buffo (11. November 2007 um 21:11)

  • Spoiler anzeigen
    [autoit]

    $Return = StringRegExp($CMDLineRaw, '-(\w)\s*(\w*)', 3)
    If @error Then Exit

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

    Dim $Array[UBound($Return) / 2][2]

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

    For $i = 0 To UBound($Return) - 1 Step 2
    $Array[$i / 2][0] = $Return[$i]
    $Array[$i / 2][1] = $Return[$i + 1]
    Next

    [/autoit]

    Die Verschiebung um eine Position kannst du ja noch selbst einfügen.

    • Offizieller Beitrag

    Hi,

    ich habe zwar schon eine Lösung die zu funktionieren scheint, aber ich muss morgen noch etwas testen.

    Deine Version funktioniert nicht, weil sie für meine Zwecke zu kurz geacht ist.

    Was ist wenn ich sowas übergebe

    C:\Downloads\AutoIt-Skripte\>c5.exe -in Test -out "hell-oo ewqewqe" -t -u "1"

    usw.

    So long,

    Mega

  • Nun dann musst du auch konkrete Beispiele nennen.
    War lediglich auf dein Beispiel angepasst mit einem Parameter-Buchstaben und reinen Wörtern ohne Sonderzeichen als Parameterpaar.

    Willst du andere Fälle mit berücksichtigen musst du doch nur das StringReg-Pattern anpassen:

    Spoiler anzeigen
    [autoit]

    $Return = StringRegExp($CMDLineRaw, '-(\w+)\s*([^-]*)', 3)
    If @error Then Exit

    Dim $Array[UBound($Return) / 2][2]

    For $i = 0 To UBound($Return) - 1 Step 2
    $Array[$i / 2][0] = $Return[$i]
    $Array[$i / 2][1] = $Return[$i + 1]
    Next

    [/autoit]

    Edit: Sehe gerade das du das mit den Anführungszeichen anders gemeint hast - ich schau morgen mal drüber - heute ist aber Sense - gn8

    Edit2: Mann - sowas lässt mich immer nicht schlafen... :D
    Hier die vorläufige Anpassung damit es auch mit dem 2. Beispiel funktionieren würde.
    Wie gesagt - kommt halt nur auf RegExp-Pattern an:

    Spoiler anzeigen
    [autoit]

    $Return = StringRegExp($CMDLineRaw, '-(\w+)\s*(".+?"|[^-]+|\z)', 3)
    If @error Then Exit

    Dim $Array[UBound($Return) / 2][2]

    For $i = 0 To UBound($Return) - 1 Step 2
    $Array[$i / 2][0] = $Return[$i]
    $Array[$i / 2][1] = StringReplace($Return[$i + 1], '"', '')
    Next

    [/autoit]

    2 Mal editiert, zuletzt von AspirinJunkie (12. November 2007 um 00:50)