fehlender $cmd_Line Parameter resultiert in End 1

  • Hi,
    ich habe 2 Verlinkungen meines Skriptes. Eines welches beim hochfahren startet (ohne angefügte Parameter) und eines, mit dem mit Leerzeichen vom Datennamen getrennten Parameter shutdown.
    Ich frage ihn folgendermaßen ab:

    Code
    If $cmdLine[1] = "shutdown" Then Shutdown(1)


    Das Problem:
    Ohne Parameter beschwert sich der Interpreter folgerichtig - da kein weiterer Parameter angegeben worden ist - mit:
    Array variable has incorrect number of subscripts or subscript dimension range exceeded.
    Mit Parameter funktioniert es einwandfrei.
    Es muss doch eine elegantere Lösung geben, als beim normalen Programmstart einen funktionslosen Parameter anzugeben, nur um das Array zu füllen?
    Sonst gefällt mir AutoIT sehr gut;
    am ersten Tag schon 3 Programme programmiert, wo ich woanders noch Wochen oder Monate lernen müsste =)

    Einmal editiert, zuletzt von mille86 (14. April 2009 um 21:37)

  • also ich fange das so ab:

    Spoiler anzeigen
    [autoit]

    Switch $CmdLine[0]
    Case 0
    ;ohne Parameter
    Case 1
    ; mit einem Parameter
    EndSwitch

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Danke für die schnelle Antwort. Diese Option hilft aber auch nur bei einem Parameter (Unterscheidung Parameterzahl 0 / 1 ). Wenn ich Namen verwende (hier also ab $CmdLine[1]) geht das leider auch nicht.
    Edit: Also bräuchte man eine Abfrage, ob die Variable existiert...

  • tut mir Leid, aber ich verstehe Dein Problem nicht ?(

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Ok, also genau:
    Mein Programm soll beim normalen Abruf über das Skript / exe normal laufen.
    Wenn man aber nun eine lnk-Verknüpfung erstellt und einen Parameter anhängt, soll das Programm sich anders verhalten. In diesem Fall soll der Computer nach dem Programmablauf heruntergefahren werden, sobald der Parameter "shutdown" angehängt worden ist.
    Das Problem ist nur, wenn kein Parameter angegeben worden ist, dann existiert auch keine $CmdLine[1]. Demzufolge bricht das Programm bei der Abfrage dieser Array-Konstante in diesem Fall ab.
    Lösungsansatz:
    Wie oben editiert, müsste ich prüfen, ob $CmdLine[1] schon existiert und nur dann die Abfrage machen

  • in CMDLINE[0]steht die Anzahl der Parameter. Wenn diese >= 1 ist, existiert CMDLINE[1]. Wenn sie 0 ist, existiert der Array-Index nicht.
    Daher kannst du damit unterschieden, ob ein Parameter angegeben wurde oder nicht. wenn einer angegeben wurde, kannst du den Wert von CMDLINE[1] mit If überprüfen.
    Beispiel:

    [autoit]

    Global $RichtigerParameterAngegeben = False
    If $CMDLINE[0] = 1 Then
    If $CMDLINE[1] = "derParameter" Then $RichtigerParameterAngegeben = True
    EndIf

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

    If $RichtigerParameterAngegeben Then MsgBox(0,"","OK")

    [/autoit]
  • hast Du meinen Ansatz denn ausprobiert?

    ich habe das in einem meiner Scripte genau so verwendet und das funzt prima :D
    Link

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Hi,
    ist mir just auch eingeleuchtet zur gleichen Zeit =)
    Nur schade, dass Switch / Select kein break kennen, aber das ist eine andere Problematik...
    ist gelöst!
    Schönen Abend =)
    EDIT:@schnueffel: hat bei mir nicht funktioniert

  • Ich liebe die Hilfe(links). Sie spricht mit mit wortlos !!!

    Spoiler anzeigen


    Kommandozeilenparameter
    Das besondere Array $CmdLine wird mit den, deinem AutoIt-Skript übergebenen, Kommandozeilenparametern initialisiert. Der Skriptname wird dabei nicht als Parameter aufgefasst; den kann man über @ScriptName herausfinden. Ein Parameter, der Leerzeichen beinhaltet, muss von "doppelten Anführungszeichen" umgeben sein. Kompilierte Skripte akzeptieren Kommandozeilenparameter genauso.

    $CmdLine[0] ist die Anzahl der Parameter
    $CmdLine[1] ist Parameter 1 (nach dem Skriptnamen)
    $CmdLine[2] ist Parameter 2 etc.
    ...
    $CmdLine[$CmdLine[0]] ist einer der Wege, um den letzten Parameter auszulesen...


    Wenn man also sein Skript so ausführt:

    AutoIt3.exe meinskript.au3 param1 "das ist ein anderer Parameter"

    $CmdLine[0] ergibt... 2

    $CmdLine[1] ergibt... param1

    $CmdLine[2] ergibt... das ist ein anderer Parameter

    @ScriptName ergibt... meinskript.au3


    Zusätzlich zu $CmdLine gibt es noch eine Variable namens $CmdLineRaw, die unformatierten Kommandozeilenparameter enthält. Im obigen Beispiel:

    $CmdLineRaw ergibt... meinskript.au3 param1 "das ist ein anderer Parameter"


    Falls das Skript kompiliert wurde wird es dies ausführen:

    meinskript.exe param1 "das ist ein anderer Parameter"

    $CmdLineRaw entspricht... param1 "das ist ein anderer Parameter"

    Es ist zu beachten, dass $CmdLineRaw nur die Parameter zurückgibt.


    Es ist zu beachten, dass nur 63 Parameter durch $CmdLine[...] zurückgegeben werden können, aber $CmdLineRaw wird immer die komplette Befehlszeile zurückgeben.

    Und Dank der Suchfunktion dieses hier:
    - https://autoit.de/Ergebnis%20der%20Sufu%201
    - https://autoit.de/Ergebnis%20der%20SuFu%202

    Also was habe ich gleich am ersten Tag gelernt und was darfst Du "abschauen"? Lerne die Hilfe und Sufu zu lieben. Und keine Angst, sie lassen Dich nicht im STICH oder betrügen. Ab und an kann man sie nur nicht verstehen, was ja bei allen Menschen so ist. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hi,
    ist mir just auch eingeleuchtet zur gleichen Zeit =)
    Nur schade, dass Switch / Select kein break kennen, aber das ist eine andere Problematik...
    ist gelöst!
    Schönen Abend =)
    EDIT:@schnueffel: hat bei mir nicht funktioniert


    Schön, dass es dir auch selbst eingefallen ist ;)
    Und Switch / Select kennt kein break, da automatisch abgebrochen wird. Es gibt aber die Umkehrung von break:

    [autoit]

    ContinueCase

    [/autoit]
  • Die sehr gute Hilfe schaue ich mir immer vorher an, da stand es halt auch nicht drin. Suchfunktion habe ich nur halbherzig verwendet, sorry... :love:
    Edit: Wegen der Break-Sache: War heute über 6 Stunden proggen, wie dumm von mir... Zeit zum schlafen gehen ^^
    Edit2: Für Nachzügler die Lösung

    Code
    If $CmdLine[0] > 0 And $CmdLine[1] = "xxx" Then [...]


    Tatsächlich wird erst der linke Ausdruck, DANN der rechte Ausdruck und dann beide zusammen ausgewertet...

    Einmal editiert, zuletzt von mille86 (14. April 2009 um 21:47)

  • jetzt muß ich aber doch noch einen draufsetzen, auch wenn der Thread schon gelöst ist...

    ich meinte natürlich, dass man das Prinzip des Select gut für $CmdLine- Abfragen verwenden kann

    Spoiler anzeigen
    [autoit]

    Switch $CmdLine[0]
    Case 0
    ;ohne Parameter
    Case 1
    Switch $CmdLine[1]
    Case "shutdown", "herunterfahren", "ende" ; bei diesen Begriffen wird die Funktion _shutdown() ausgeführt ...
    _shutdown()
    EndSwitch
    Case 2
    ;...........
    EndSwitch

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Die sehr gute Hilfe schaue ich mir immer vorher an, da stand es halt auch nicht drin.

    Also das was ich in meinen letzten Beitrag über $CmdLine überlegen habe kommt aus der aktuellen Hilfe. Ist ja nicht schlimm das du es nicht gefunden hast. Es gibt in der Hilfe auch eine Suchfunktion und dort Parameter und oder $CmdLine eingeben und dann wärst du auch darauf gestoßen. Aber ich selber habe am Anfang auch viel in der Hilfe herum gesucht und noch heute nutze ich die dortige Suchfunktion.

    Also Geduld und immer dran denken, das die Suchfunktion auch mal "Suche" oder so heißen kann. ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Okay, jetzt noch ein kleiner Nachschlag von mir:
    Ohne die Hilfe, wäre ich gar nicht erst auf $cmdLine gekommen. In dem an sich sehr guten Erklärungen, gab es für das spezifisches Problem (keiner vs. einer Parameter) keine Lösung...