Verknüpfung oder Script

  • Hallo,

    (a)

    Wie kann ich feststellen, ob ein Skript über eine Windows-Verknüpfung wie zum Beispiel:

    "C:\Autoit\AutoIt3_x64.exe" "d:\test\test.au3"

    gestartet wurde?

    @Compiled unterscheidet nur zwischen exe und Script.

    (b)

    $CmdLine[0] ist 0, obwohl ein Parameter bei der Verknüpfung übergeben wurde, wie oben zu sehen ist.

    Wo liegt mein Fehler? Warum ist cmdline = 0 ?

    Eure Erfahrungen sind gefragt.

    Danke :)

  • Verstehe den Sinn deiner Frage nicht so wirklich.

    @compiled genügt um festzustellen ob das Script kompiliert wurde oder als au3 vorliegt und durch eine vorhandene Autoit Installation oder ggf. durch ein anderes kompiliertes Script interpretiert wird.

    Was willst du mehr wissen und vorallem wozu? Welchen Unterschied soll es machen ob ich eine Windows Verknüpfung zum Start verwende oder die Datei direkt im Explorer oder per CMD Fenster aufrufe?
    Da gibts einfach keinen Unterschied. Im Falle einer AU3 Datei wird immer ein Interpreter benötigt (autoit.exe) und im Falle einer EXE Datei wird Windows die Datei direkt mit Bordmitteln zur Ausführung bringen.

    $CMDline[0] ist null weil du eben keine Parameter an das Script übergibst, sondern nur einen Parameter an den Interpreter (Autoit.exe).

    Parameter an das Script kannst du aber auch bei der Nutzung eines Interpreters durchreichen:

    Code
    ; Interpreter-Aufruf mit 2 Parametern
    "C:\Program Files (x86)\AutoIt3\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\test.au3" -testtext -test2
    
    
    ; EXE Aufruf mit 2 Parametern:
    "C:\Program Files (x86)\AutoIt3\test.exe" -testtext -test2


    Beides liefert dir für $cmdline[0] eine 2. Du kannst also keinen Unterschied zwischen kompilierter Fassung oder interpretierter AU3 Fassung feststellen. Durchaus einen Unterschied siehst du aber wenn du dir $cmdlineraw ausgeben lässt. Hier siehst du bei der nicht kompilierten Fassung zusätzlich noch den Parameter mit dem Pfad zur au3-Datei.

    Sinn der Frage ist trotzdem nicht klar... @compiled reicht völlig um den Unterschied zu erkennen. $cmdline**** wird dir auch nicht sagen können wie der Benutzer das Script letztlich gestartet hat. Eine Windowsverknüpfung ist genau das selbe wie ein cmd Aufruf oder ein start im Explorer oder in Scite. Bei allen Varianten wird die Autoit.exe mit dem Scriptpfad als Parameter gestartet.

  • Vielen Dank für die sehr interessanten Ausführungen.

    Ich war fälschlicherweise davon ausgegangen, dass in der Zeile
    "C:\Autoit\AutoIt3_x64.exe" "d:\test\test.au3"
    der Ausdruck "d:\test\test.au3" ein Parameter ist.
    Das ist leider nicht so, wie ich Deinen Ausführungen entnehmen kann.

    Parameter können in meiner Fragestellung ignoriert werden, das war ein Missverständnis.

    Zu Deiner Warum-Frage:

    Ich möchte eine Fehlermeldung ausgeben, wenn das Script aus dem Editor heraus gestartet wurde,
    weil es Funktionen gibt, die nur per Interpreter (mit AutoIt3_x64.exe) oder als kompillierte exe Datei richtig ausführbar sind.

    Ich suche also "nur" eine Unterscheidung im Script zwischen Aufruf per Interpreter (mit AutoIt3_x64.exe) und Aufruf des Scripts aus dem Editor.


    Wäre $cmdlineraw dafür ebenfalls Deine erste Wahl?

    2 Mal editiert, zuletzt von AutoMit (26. November 2016 um 19:15)

  • Der Aufruf aus dem Editor ist identisch zum Aufruf mit dem Autoit Interpreter, denn Scite macht nichts anderes als das was du in deiner Windowsverknüpfung auch machst. Es ruft die vorhandene Autoit.exe mit AU3 als Parameter auf. Allerdings führt Scite bevor es das Script zur Ausführung bringt noch eine Syntaxprüfung deines Scriptes durch und bricht ggf. ab wenn dein Script Fehler enthält. Außerdem kann es sein, dass Scite standardmässig die 32bit Version des Interpreters nutzt. Das kannst du aber ändern bzw. erzwingen indem du am Scriptanfang definierst wie das Script zu interpretieren/auszuführen bzw. zu kompilieren ist.

    AutoIt
    #AutoIt3Wrapper_UseX64=y
    MsgBox(0,"x64?",@AutoItX64) ; sollte immer 1 ergeben
    oder:
    #AutoIt3Wrapper_UseX64=n
    MsgBox(0,"x64?",@AutoItX64) ; sollte immer 0 ergeben


    Und ja mit $cmdlineraw kannst du das bedingt erkennen, aber nur dann wenn bei dir alles dem Standard entspricht und du ausschließen kannst, dass bei manuellem Interpreteraufruf der Parameter "/ErrorStdOut" an den Interpreter übergeben wird. Zumindestens meine Scite Version tut dies standardmässig und unterscheidet sich dadurch evtl. von manuellen aufrufen via Interpreter.

    An deiner Stelle würde ich aber mal Details zum Fehler bei Scite Ausführung nennen. Dein Problem oder Fehler lässt sich mit Sicherheit lösen.
    Wie willst du dein Programm vernünftig entwickeln und testen wenn es schon bei der Ausführung via Scite zu Fehlern kommt?

    4 Mal editiert, zuletzt von misterspeed (26. November 2016 um 19:35)

  • Grünen Harken gesetzt - ich nehme erstmal $cmdlineraw. Danke @misterspeed für den Tipp! "/ErrorStdOut" wird hier auch ausgegeben.

    Es liegt wirklich in der Natur der einzelnen Scripte. Die laufen perfekt über den Interpreter, weil z.B. dlls eingebunden werden etc. Sie können nicht aus dem Editor laufen.
    Und daher ist ein entsprechender Hinweis aus dem Script hilfreich, wenn man das Script versehentlich aus dem Editor und nicht über den Interpreter startet. Somit kein Problem.

    Wenn jemand noch alternative Ideen hat, wie man den Unterschied zwischen Start aus Editor und Start per Verknüpfung kennt - bitte hier ergänzend posten.

  • Unsinn. Was von Hand lauffähig ist muss auch via Scite lauffähig sein. Bei der Nutzung von DLLs ist es hingegen wichtig, dass der korrekte zur DLL passende Autoit Interpreter genutzt wird (ein 32bit Interpreter kann nichts mit 64bit dlls Anfangen). Deswegen mein Hinweis zu #AutoIt3Wrapper_UseX64

    Aber ist ja letztlich dein Problem. ;)