Hallo in die Runde,
nachdem das mit dem verpacken von Maps in JSON so gut geklappt hat,stelle ich mir die Frage ob man auch selbst gebastelte AU3 Funktionen darin ablegen könnte?
Was ja kein Problem darstellt, aber wie lasse ich z.B. die Zeichenkette wo eine Funktion definiert würde, zur Laufzeit interpretieren, so das diese aufgerufen werden könnte?
Mit konstruktiven Grüßen
AU3 Code während der Laufzeit nachladen?
-
uuchip -
26. Januar 2024 um 17:23 -
Erledigt
-
-
Nun nur mit Einschränkungen.
Du kannst Code aus Strings oder Dateien ausführen lassen aber da gibt es ein paar Einschränkungen.
Methode 1 - Execute():hierbei kann kurzer Code in Strings ausgeführt werden und deren Rückgabewert im Hauptskript weiterverwendet werden.
Mehrzeilige Konstrukte wie Schleifen oder Funktionsdefinitionen gehen damit nicht.
Auch Variablenzuweisungen klappen nicht.
Variablen aus dem Hauptskript können zwar in diesen Ausdrücken verwendet, aber nicht überschrieben werden - nur der Return-Wert von Execute() könnte hierfür dienen.Methode 2 - /AutoIt3ExecuteLine bzw. /AutoIt3ExecuteScript:
Man kann den AutoIt-Interpreter aufrufen und entweder eine Codezeile oder ein ganzes Skript angeben, welches ausgeführt werden soll.
Das geht auch mit der kompilierten Exe-Datei des Hauptskriptes, wenn es mit der richtigen Compileroption kompiliert wurde.
Damit kann man auch umfangreichere Skripte ausführen, aber diese haben keine Verknüpfung zum Hauptskript - teilen sich also keine Variablen usw.
Es wird einfach nur aufgerufen:AutoIt
Alles anzeigen#pragma compile(AutoItExecuteAllowed, True) ; je nachdem ob Skript kompiliert vorliegt oder direkt über den Interpreter aufgerufen wird $sAutoItExe = @Compiled ? @ScriptFullPath : @AutoItExe ; einzelne Zeile Code ausführen: $sVar = "msgbox(0,'','Test')" ; AutoIt-Code, welcher irgendwie in eine Variable gelangt ist RunWait(StringFormat('"%s" /AutoIt3ExecuteLine "%s"', $sAutoItExe, $sVar)) ; ein anderes AutoIt-Skript aufrufen, welches noch nicht kompiliert vorliegt RunWait(StringFormat('"%s" /AutoIt3ExecuteScript "%s"', $sAutoItExe, @ScriptDir & "\other.au3"))
-
Nun nur mit Einschränkungen.
Du kannst Code aus Strings oder Dateien ausführen lassen aber da gibt es ein paar Einschränkungen.
Methode 1 - Execute():hierbei kann kurzer Code in Strings ausgeführt werden und deren Rückgabewert im Hauptskript weiterverwendet werden.
Mehrzeilige Konstrukte wie Schleifen oder Funktionsdefinitionen gehen damit nicht.
Auch Variablenzuweisungen klappen nicht.
Variablen aus dem Hauptskript können zwar in diesen Ausdrücken verwendet, aber nicht überschrieben werden - nur der Return-Wert von Execute() könnte hierfür dienen.Methode 2 - /AutoIt3ExecuteLine bzw. /AutoIt3ExecuteScript:
Man kann den AutoIt-Interpreter aufrufen und entweder eine Codezeile oder ein ganzes Skript angeben, welches ausgeführt werden soll.
Das geht auch mit der kompilierten Exe-Datei des Hauptskriptes, wenn es mit der richtigen Compileroption kompiliert wurde.
Damit kann man auch umfangreichere Skripte ausführen, aber diese haben keine Verknüpfung zum Hauptskript - teilen sich also keine Variablen usw.
Es wird einfach nur aufgerufen:AutoIt
Alles anzeigen#pragma compile(AutoItExecuteAllowed, True) ; je nachdem ob Skript kompiliert vorliegt oder direkt über den Interpreter aufgerufen wird $sAutoItExe = @Compiled ? @ScriptFullPath : @AutoItExe ; einzelne Zeile Code ausführen: $sVar = "msgbox(0,'','Test')" ; AutoIt-Code, welcher irgendwie in eine Variable gelangt ist RunWait(StringFormat('"%s" /AutoIt3ExecuteLine "%s"', $sAutoItExe, $sVar)) ; ein anderes AutoIt-Skript aufrufen, welches noch nicht kompiliert vorliegt RunWait(StringFormat('"%s" /AutoIt3ExecuteScript "%s"', $sAutoItExe, @ScriptDir & "\other.au3"))
Das erste nutze ich schon im Kontext mit Assign() um via Maps->JSON->Maps dynamisch Variablen zuzuweisen, und das klappt wunderbar. Beim zweiten bin ich mit nicht ganz sicher, darum mein evtl. doofe Nachfrage, ob wenn man ein Skript mit AutoIt3ExecuteScript() aufruft, dessen Funktionen nach dem Aufruf im "Hauptprogramm" zur Verfügung stehen?
-
ob wenn man ein Skript mit AutoIt3ExecuteScript() aufruft, dessen Funktionen nach dem Aufruf im "Hauptprogramm" zur Verfügung stehen?
Nein
-
@AspirinJunkie
Klare Antwort, Danke sehr! -
Nachtrag -> es scheint wohl einige Möglichkeiten zu geben, ob sie funktionieren, und wenn ja wie gut, teste ich mal aus.
https://www.autoitscript.com/forum/topic/20…e-autoitobject/