Run Problem

  • Hallo,

    der Tag beginnt mal wieder mit einem Problem.

    Ich versuch das ganze mal zu erklären.

    1. Es gibt eine Main.au3
    2. Diese Main Datei hat einen Button START
    3. Mit diesem Button wird eine andere AU3 im Scriptverzeichnis gestartet.

    Soweit kein Problem.

    Aber dann:

    1. Ich kompiliere die Main.au3 (Main.exe)
    2. Der Button Start macht nun nichts mehr (Seltsam)

    Hier mal der Code des Buttons

    Spoiler anzeigen
    [autoit]


    Case $btnProgStart

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

    $ProgLink = @ScriptDir&""&"Meine.au3" ; hier ist das Script das gestartet werden soll
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $ProgLink)
    ;ShellExecute("Meine.au3.exe","",@ScriptDir,"open"); auch wenn das Script kompiliert wurde
    ;run(@ScriptDir &""&"Meine.au3","",@SW_MAXIMIZE)

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

    endif

    [/autoit]

    Beide Scripte funktionieren einzeln einwandfrei.

    Liebe Grüße
    ;) Ilse

    Einmal editiert, zuletzt von Ilse (14. März 2014 um 12:43)

    • Starte folgendes Skript:[autoit]MsgBox(0,"", @AutoItExe)[/autoit]
    • Kompiliere das Skript
    • Starte das kompilierte Skript
    • Vergleiche die Ausgaben der kompilierten mit der unkompilierten Variante.
    • Rufe folgendes Skript auf:[autoit]MsgBox(0,"", @ScriptDir&""&"Meine.au3")[/autoit]
    • Überlege ob der angezeigte Pfad sinnvoll ist.
    • Rufe folgendes Skript auf:[autoit]$ProgLink = @ScriptDir&""&"Meine.au3" ; hier ist das Script das gestartet werden soll
      MsgBox(0,"", @AutoItExe & ' /AutoIt3ExecuteScript ' & $ProgLink)[/autoit]
    • Überlege ob der angezeigte Aufruf immer funktionieren wird (Leerzeichen im Pfad?)
    • Lerne wie man debuggt anstatt immer gleich einen neuen Thread aufzumachen.

    Einmal editiert, zuletzt von AspirinJunkie (13. März 2014 um 09:01)

  • Guten Morgen Aspirin Junkie,

    diese debug-Varianten habe ich alle hinter mir.

    Ich mache nicht sofort einen neuen Thread auf ohne mir Gedanken zu machen.
    Ich lasse mir zum deguggen immer MsgBoxen anzeigen,
    überprüfe alles mögliche...erst wenn ich nicht mehr weiterkomme....

    Also:
    1. Pfadangaben stimmen.
    2. Auch in den ExeDateien werde Pfade korrekt angezeigt
    3. Dateinamen hat keine Leerzeichen
    4. Rechte Maustaste RunScript (beide funktionieren)
    5. Scite (Main F5 Go) als au3 funktioniert
    6. Main.exe zeigt den korrekten Pfad zur ausführenden au3.Datei

    Keine Ahnung was ich noch debuggen kann

    Liebe Grüße
    Ilse ;)

  • Zu 1:
    Ich vermisse da ein Backslash zwischen Pfad und Dateiname.

    Zu 2.:
    Es ändert sich nichts bei dir am Pfad für @AutoItExe? Das wäre skurril.
    Im unkompilierten Zustand sollte es auf den AutoIt-Compiler verweisen (welcher in der Lage ist .au3-Dateien in exe-Dateien zu kompilieren) und im kompilierten Zustand sollte es auf dein erstelltes Programm verweisen (welches nur das kann was du ihm beigebracht hast).
    Ich glaube nicht, dass du in deinem Programm Kommandozeilenparameter wie /AutoIt3ExecuteScript auswertest, so dass sie sich verhalten wie der AutoIt-Compiler (dann müsstest du ja auch alle abhängigen Dateien wie z.B. UDFs usw mitgeben).

    Zu 3:
    Wenn @Scriptdir mal ein Leerzeichen hat wird der Aufruf nicht mehr funktionieren. WIe kann man das umgehen?

    Zu 6.:
    Meinst du vielleicht "auszuführenden" statt "ausführenden"?
    Ich sehe da folgenden Ausgabe bei mir z.B.:

    Code
    C:\Users\User XXX\Desktop\Test.exe /AutoIt3ExecuteScript C:\Users\User XXX\DesktopMeine.au3


    Und der ausgebenene Pfad ist alles andere als korrekt bei mir.
    Auf Anhieb sehe ich folgende Probleme:

    • Pfad zur Test.exe hat ein Leerzeichen und ist nicht in Anführungszeichen gesetzt - Aufruf muss scheitern.
    • Test.exe wird mit Kommandozeilenbefehl /AutoIt3ExecuteScript und anschließendem au3-Pfad aufgerufen.
      Ich habe im Skript aber niemals eine Funktion /AutoIt3ExecuteScript implementiert - nichts sollte passieren.
    • Pfad zur Meine.au3 hat ein Leerzeichen und ist nicht in Anführungszeichen gesetzt - falsche Pfadangabe.
    • Pfad zur Meine.au3 fehlt ein Backslash - falsche Pfadangabe.


    Keine Ahnung wie du darauf kommst, dass die Pfadangabe korrekt ist - zeig mal bitte deine Ausgabe die mit dem Skript herauskommt.
    Hast du den Aufruf mal ausgegeben und mal manuell per Kommandozeile aufgerufen? - dann erst wirst du sehen ob der Aufruf wirklich korrekt ist.

  • Man kann im Forum keinen Backslash posten der alleine in Anführungszeichen steht.
    Ist ein Bug irgendwo in der Forensoftware. Hab das schonmal gemeldet aber irgendwie kümmert sich keiner darum :(

  • @ Aspirin Junkie
    ...mußte kurz weg...

    hier mal die Pfadangaben der Msgboxen der Main.exe
    sind identisch mit der Main.au3

    [autoit]


    MsgBox(0,"", @AutoItExe)
    MsgBox(0,"", @ScriptDir&""&"Meine.au3")
    MsgBox(0,"", @AutoItExe & ' /AutoIt3ExecuteScript ' & $ProgLink)

    [/autoit]

    1.

    Zitat


    c:\Users\PC\Autoit\2011\Main.exe


    2.

    Zitat


    c:\Users\PC\Autoit\2011\Meine.au3


    3.

    Zitat


    c:\Users\PC\Autoit\2011\Main.exe/Autoit3ExecuteScript
    c:\Users\PC\Autoit\2011\Meine.au3

    Was ich nicht verstehe:

    Zitat


    Keine Ahnung wie du darauf kommst, dass die Pfadangabe korrekt ist


    Wenn es doch Probleme mit den Pfaden gibt, dann sollte das ganze doch auch nicht
    mit den AU3 Files funktionieren. Es wird lediglich eine EXE gemacht!

    P.S.: Pfadnachtrag
    C:\Programm Files\Autoit3\autoit3.exe

    Einmal editiert, zuletzt von Ilse (13. März 2014 um 11:23)

  • Der fehlende Backslash konnte von Schnitzel auf die Forensoftware zurückgeführt werden.
    Deine Pfade haben in deinem Fall keine Leerzeichen - daher funktioniert das.
    Was du allerdings anscheinend überlesen hast ist mein Hinweis auf /AutoIt3ExecuteScript und dein Skript.
    Warum gehst du davon aus, dass dein Skript etwas mit /AutoIt3ExecuteScript anfangen kann?

  • Hallo Aspirin Junkie,

    aber wie kriege ich das ganze rein,
    damit mein Script was mit AutoIt3ExecuteScript anfangen kann?
    Muß ich was includieren?
    Ich probiere schon den ganzen morgen.

    Ich habe mal zum Testen das gebastelt:
    Einfach beide Files ins Scriptverzeichnis!

    Wie "Schnitzel" schon gesagt hat: Die \ werden hier nicht angezeigt!

    Main.au3
    Au3File.au3

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Main", 615, 438, 192, 124)
    $btnAu3 = GUICtrlCreateButton("Start", 408, 112, 179, 65)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $btnAu3
    $ProgLink = @ScriptDir&""&"Au3File.au3"

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

    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $ProgLink)
    EndSwitch
    WEnd

    [/autoit]

    Dann die Datei die geöffnet wird:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Files", 615, 438, 192, 124)
    $btnStart = GUICtrlCreateButton("Ein Au3-File", 32, 40, 155, 49)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $btnStart
    $ProgLink2 = @ScriptDir&""&"Main.au3"

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

    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $ProgLink2)
    EndSwitch
    WEnd

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

    Wird die Main.au3 kompiliert dann startet nichts mehr!

  • Dein Skript ist kein Compiler.
    Die AutoIt3.exe ist ein Compiler.
    Dein Skript kann keine externen au3-Dateien genauso wie AutoIt3.exe ausführen.
    Du kannst nur im begrenzten Rahmen innerhalb des Skriptes mit Execute() AutoIt-Befehle in einem String interpretieren lassen.

    Warum soll dein Skript überhaupt au3-Dateien ausführen?
    Erläutere den Sachverhalt, dann kann man schauen wie man das besser lösen kann.

    Willst du das dennoch machen musst du den gesamten Autoit3-Compiler samt aller benötigten Dateien mitliefern und diesen anstatt deinem Skript aufrufen.

  • Huh...Der Sachverhalt.

    Kurz mit meinen Worten:

    1. Es gibt eine Ini mit Pfaden zu au3 Files
    2. Ein Hauptprogram (Main.exe) organisiert das ganze (greift auf Ordner, au3 Files und Masken zu.
    3. Eine Combobox liest die Ini und startet die Au3

    Das mit einzelnen au3 Files und der Ini ist sehr übersichtlich.
    Es kommen ständig weitere dazu und so ist das ganze gut zu organisieren.

    Ich wollte zuerst alle au3 Files in Exe Files kompilieren
    und dann später mit ShellExcecute starten...
    muß ich anscheinend auch so machen, oder hast du eine Idee?

    Liebe Grüße
    Ilse ;)

  • Du hast nur beschrieben wie du es machen willst - nicht warum.
    Ich fragte warum du dynamisch au3s aufrufen willst.
    Was sind das für au3s - was stehen da für Informationen drin die man nicht anders einbinden kann?
    Erkläre mal den Hintergrund.

  • Es handelt sich um viele kleine Lösungen.
    z.B. Text-Anpassung
    ein kleiner Code

    Spoiler anzeigen
    [autoit]


    #include<txt-Func.au3>

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

    ShellExecute("Info.txt", "", @ScriptDir, "edit")
    MouseClick("left",1166,375,1)
    MouseClick("left",1129,585,1)
    MouseClick("left",1452,277,1)
    MouseClick("left",879,901,1)

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

    exit

    [/autoit]

    Dynamisch, weil ich das ganze ständig erweitern muß.
    Das Main-Programm ist fertig, es kommen aber immer weitere CodeTeile dazu,
    auf die das Main-Programm zugreift.
    Es werden lediglich au3 Files ergänzt und die Ini erweitert.

    Wenn ich das ganze mit #includes einbinden würde, müßte jedesmal am Hauptprogramm
    was geändert werden.

  • Mal ganz davon abgesehen dass es mich grad gruselt weil du eine Textdatei mit MouseClicks bearbeitet...
    Sind das immer Mausklicks oder Ähnliches?
    Könnte man nicht einfach für jedes Problem eine Liste von Koordinaten als Textdatei speichern und diese vom Programm abarbeiten lassen?

    Die Alternative bleibt immer noch den ganzen AutoItCompiler mitzuliefern.

  • Hey,

    das war doch nur ein Beispiel.
    Natürlich kenn ich ControlCommand usw.
    Darum geht es doch nicht.

    Zitat


    Sind das immer Mausklicks oder Ähnliches?


    Ja, aber auch
    Funcs, ShellExcecute, Inputboxen Splash...
    im Prinzip kleine "Programme"!

    Das mit der AutoItCompiler Alternative
    würde bedeuten:

    Meine ini greift auf au3 Files zu.
    die weden dann kompiliert und gestartet?

    Ich kopiere den Aut2Exe Ordner ins Scriptverzeichnis...?
    Oder ist es besser einfach alle au3 Files als exe zu machen
    und die exe Files mit der Ini aufzurufen?

    ;) Ilse

  • man muss den backslash auch nicht einzeln angeben, sondern kann ihn ja wie folgt übergeben ...

    @ScriptDir & "\Meine.au3"

    [autoit]


    $ProgLink = @ScriptDir & "\Meine.au3" ; hier ist das Script das gestartet werden soll
    MsgBox(0,"", @AutoItExe & ' /AutoIt3ExecuteScript ' & $ProgLink)

    [/autoit]

    gruß gmmg

  • Ich denke mal die AutoItCompiler Alternative ist folgende:
    Du kopierst die AutoIt3.exe aus deinen AutoIt Verzeichnis in den selben Ordner in den dein 'Hauptscript' ist.
    Um dann ein Script auszuführen verwendest du das:

    [autoit]

    $sFile = @ScriptDir & "\test.au3"
    Run('"' & @ScriptDir & '\AutoIt3.exe" /AutoIt3ExecuteScript "' & $sFile & '"')

    [/autoit]

    Natürlich kannst du auch den Ordner Include gleich mit kopieren... ^^

  • Dein Skript kann keine externen au3-Dateien genauso wie AutoIt3.exe ausführen.


    Diese Aussage muss ich leider korrigieren. Solange nicht

    [autoit]

    #NoAutoIt3Execute ;*

    [/autoit]


    im Skript eingefügt wird kann auch jedes kompilierte AutoIt-Skript eine Au3-Dateien ausführen. Und zwar mit den gleichen Parametern wie die Standart-AutoItExe:
    /AutoIt3ExecuteLine und /AutoIt3ExecuteScript

    Ich glaube hier liegt das Problem eher darin das der komplette Pfad in Anführungszeichen gesetzt werden muss beim Ausführen (wegen eventuell vorhandenen Leerzeichen):

    [autoit]

    ;Ich habe die Anführungszeichen einmal extra hervorgehoben...
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & '"' & @ScriptDir & '\Script.au3' & '"')
    ;ODER (mit Variable):
    Local $scriptfile=@ScriptDir & '\Script.au3'
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & '"' & $scriptfile & '"')

    [/autoit]

    Übrigens könntest du auch einfach folgendermaßen lösen. Es geht dann allerdings natürlich nur wenn AutoIt auf dem Computer installiert ist auf dem das Skript ausgeführt wird.

    [autoit]

    ShellExecute(@ScriptDir & '\Script.au3', '', '', 'run') ;run hinzugefügt weil man vielleicht auch edit als Standart eingestellt haben könnte
    ;ODER (mit Variable):
    Local $scriptfile=@ScriptDir & '\Script.au3'
    ShellExecute($scriptfile, '', '', 'run')

    [/autoit]

    * Ich glaube in den neueren Versionen geht dies (auch) mit einem #pragma-"Befehl".

  • Test.exe wird mit Kommandozeilenbefehl /AutoIt3ExecuteScript und anschließendem au3-Pfad aufgerufen.
    Ich habe im Skript aber niemals eine Funktion /AutoIt3ExecuteScript implementiert - nichts sollte passieren.


    Was du allerdings anscheinend überlesen hast ist mein Hinweis auf /AutoIt3ExecuteScript und dein Skript.
    Warum gehst du davon aus, dass dein Skript etwas mit /AutoIt3ExecuteScript anfangen kann?


    Dein Skript kann keine externen au3-Dateien genauso wie AutoIt3.exe ausführen.
    Du kannst nur im begrenzten Rahmen innerhalb des Skriptes mit Execute() AutoIt-Befehle in einem String interpretieren lassen.


    Du irrst dich hier ein wenig. Jedes kompilierte Autoitscript ist auch ein Autoitinterpreter und kann genauso wie die autoit.exe dafür verwendet werden. Zumindestens solange man beim kompilieren nicht ausdrücklich diese Interpreterfunktionalität abschält:

    [autoit]

    #NoAutoIt3Execute

    [/autoit]

    In den Standard compiler Settings existiert jedenfalls sehr wohl der Parameter "/AutoIt3ExecuteScript" bei jeder ausführbaren Autoit Datei. Man ist hier allerdings auf die nativen Autoit Funktionen beschränkt. Die auszuführenden au3 Dateien dürfen keine includes enthalten, bzw. wenn sie includes enthalten müssen diese mitgeliefert werden und mit korrektem (relativem) Pfad in der au3 eingebunden sein.

    Hier ein Beispiel das auch funktioniert und das Problem von Ilse lösen sollte, sofern keine includes in den Miniklickscripten verwendet werden:


    main.exe / main.au3:

    [autoit]


    ; main.exe, welche als au3 interpreter mißbraucht wird

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

    Global $interpreter
    If @Compiled Then
    $interpreter = @ScriptFullPath
    Else
    $interpreter = @AutoItExe
    EndIf

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

    Global $ProgLink = @ScriptDir & '\test.au3'
    Global $cmd = '"' & $interpreter & '" /AutoIt3ExecuteScript "' & $ProgLink & '"'

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

    debug($interpreter)
    debug($cmd)

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

    Run($cmd)

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

    Func debug($sText)
    If @Compiled Then
    MsgBox(0,@ScriptName,$sText)
    Else
    ConsoleWrite($sText & @CRLF)
    EndIf
    EndFunc

    [/autoit]

    beliebiege test.au3:

    [autoit]


    msgbox(0,@ScriptName,"unkompiliertes au3 script das von main.exe ausgeführt wird")

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (13. März 2014 um 20:28)