CmdLine Abfrage Werte Prüfen

  • Hallo,

    will den CMDLine abfragen.
    Nun habe ich folgendes Problem

    Wenn ich das Programm Starte mit "Time.exe /t 20 /p 30" ist alles OK.

    Falls ich aber nicht alle Felder ausfülle.

    z.B. "Time.exe /t 20 /p " fliegt mir mein Skript um die Ohren.

    MsgBox ist natürlich erstmal nur damit ich sehe was passiert.

  • Wenn du SciTe4AutoIt3 benutzt, gibt es dafür Abbrevs, die nach Eingabe eines Leerzeichens zu einem Code-Block expandiert werden.

    Du tippst z.B. cmdlineselect ein und drückst danach die Leertaste... das Ergebnis sieht dann so aus:

    Diese Abkürzungen findest du in:

    %LOCALAPPDATA%\AutoIt v3\SciTE\au3abbrev.properties ; vordefinierte Abbrevs

    %LOCALAPPDATA%\AutoIt v3\SciTE\au3userAbbrev.properties ; vom User definierte Abbrevs

    Wenn hinter einem Switch ein Parameter erwartet wird, kannst du das z.B. so machen:

  • alpines Danke für diesen Tipp, bekomme ich so umgesetzt.

    Der Ansatz ist ja schon mal nicht schlecht, aber du solltest bei den Zugriffen auf die entsprechenden Indizes mehr aufpassen, da du vorgreifst obwohl das Feld leer sein könnte.

    Du solltest also vor dem Zugriff prüfen ob UBound($CMDLine) > $i + 2 bzw. ob $CMDLine[0] > $i ist.

    Bitnugger hätte ich dies gestern gekannt hätte ich mir viel Denkschmalz erspart. Wobei das macht ja gerade auch Spaß.
    Ich nutzte ISN AutoIt Studio und da geht es ja auch.
    Wobei mein vollständiger Code auch schon noch mehr Teile enthält der Standard-Lösung.

    Spoiler anzeigen
  • Mahlzeit!

    Das sind hier sehr interessante Ansätze wie man Parameter auswerten kann! :thumbup:

    Ohne das ich Eigenwerbung machen möchte: Ich habe vor einiger Zeit eine kleine Funktion für eine Parameterauswertung geschrieben: wenn Du möchtest: hier


    Vielleich hilft sie dir!

    lg

    Racer

  • Habe es jetzt so umgesetzt.
    Statt den MsgBox passiert später natürlich was anderes.

  • alpines angepasst ;)

  • Hi SCCSSF !

    Du könntest (alternativ) Switch und Value auch als ein Parameter übergeben, also :

    Parameter 1 -> /t=20 und Parameter 2 -> /p=50

    Damit sparst Du Dir die Prüfung, ob der [$i + 1] Index existiert.

    Du könntest noch statt dem Select ein Switch verwenden, dann sparst du dir in jedem Case Statement das $CMDLine.

    Zu der von Bitnugger genannten Abbrev cmdlineselect gibt es auch eine vordefinierte Struktur mit Switch -> cmdlineswitch , sowie Varianten mit properties -> cmdlineselect2 und cmdlineswitch2

    (dient nur als Info für SCCSSF - Du weißt das sicher bereist ;))

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • --> Musashi : Case '/?'

    Dieses Case wird nie zutreffen!

    Stimmt !

    Bei Switches ohne Value, also /? , setzt StringSplit($CMDLINE[$i], '=') das @error Flag, da der Delimiter = nicht gefunden wurde. Das hätte ich natürlich berücksichtigen müssen :rolleyes:.

    Mir ging es eigentlich nur darum, dass man Switch und Value auch als ein Parameter übergeben kann.

    --> Musashi : $aProperty = StringSplit($CMDLINE[$i], '=')

    Wieso nicht...

    $aProperty = StringSplit($CMDLINE[$i], '=', 2)

    ...wenn du den Counter eh nicht nutzt?

    Zumindest so wie das Skript z.Zt. aufgebaut ist, läuft es mit StringSplit($CMDLINE[$i], '=', 2) nicht, da Flag 2 ($STR_NOCOUNT) das Array 0-based macht, d.h. statt :

    [0] = Anzahl der Werte , [1] = Switch) , [2] = Value

    sieht das Array so aus : [0] = Switch , [1] = Value

    Folge : man müsste statt $aProperty[1] -> [0] und statt $aProperty[2] -> [1] schreiben. Da sehe ich jetzt nicht den großen Vorteil.

    Wieso mit StringRegExpReplace? Reicht Number() nicht?

    Ja reicht - habe ich einfach so übernommen ;).

    EDIT : SCCSSF

    Hier eine überarbeitete Version, bei der auch Switches ohne = berücksichtigt werden.

    Wohl nicht die eleganteste aller Lösungen, aber sollte so funktionieren ;).

    Für Testläufe von Skripten mit Parametern kannst Du Dir auch mal folgenden Link anschauen :

    Tipp zum Setzen von Übergabeparametern ($CMDLINE) im SciTE-Editor

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (7. März 2019 um 12:33) aus folgendem Grund: Skript überarbeitet