Es ist zum Beispiel nicht möglich mehrere Zeilen ausführen zu lassen, bspw. soetwas:
Das schränkt die Funktion natürlich sehr ein und auch, dass die Funktion kein If/While/For kennt ist Schade.Quote:
Execute("Msgbox(0,' ',' ')"&@crlf&"Msgbox(0,'2','2')")
Außerdem kann man Variablen innerhalb der Execute Funktion keine Werte zuweisen:
Diese ganzen Eigenschaften machen die Execute-Funktion eigentlich überflüssig und man kann sie nur noch für Rechnungen/Obfuscator benutzen:Quote:
Execute("$var=1")
Genau aus den oben genannten Gründen und weil ein Freund mich darauf angesprochen hatte, habe ich die Execute-Funktion ein bisschen erweitert.Quote:
$var=12
$var="12-3+"&$var
$var=Execute($var1)
Was ist jetzt möglich mit der neuen Execute-Funktion?
1. Ifs, Whiles und Fors können jetzt wie in jedem normalen Skript benutzt werden.
2. Das Ausführern mehrere Befehle mit nur einem Funktionsaufruf ist nun auch möglich.
3. Wertzuweisung von Variablen, die innerhalb der Execute Funktion stehen, ist nun möglich.
Wofür braucht man das?
Man kann damit allerlei Sachen machen, z.b.:
1. Makros in einem AutoIt-Programm hinzufügen.
2. Gewisse Sicherheitsspezifische Sachen lassen sich dadurch realisieren (Schutz vor Source-Code-Klau u.ä.)
3. Um nachträglich noch Befehle in ein Programm einzubauen oder variable Befehle von einem Server auszuführen.
Es gibt aber auch ein paar Einschränkungen:
1. Arrays verhalten sich in der Execute-Funktion etwas komisch, es ist zwar, soviel wie ich feststellen konnte, möglich mit Arrays zu arbeiten (das Erstellen per dim o.ä. ist nicht möglich!), aber die Ergebnisse sind teilweise komisch. Hat man ein Array mit der Größe 3 und fragt danach mit "isarray($array)" ab ob das Array ein Array ist, bekommt man immer false zurückgeliefert.
2. Es können keine eigenen Funktionen innerhalb der Execute-Funktion definiert werden. Das Benutzen von UDF-Funktionen u.ä. ist trotzdem möglich.
3. So Sachen wie if $var="then" then können Probleme verursachen, genauso wie while $var="while" u.ä.
Man sollte also möglichst schauen, dass man den Wert vorher in einer Variable speichert:
4. Momentan funktionieren nur die Statements If/Else, While und For.Quote:
$var="then"
if $var1=$var then
...
endif
Elseif funtkioniert nicht, lässt sich aber mit einem Work-Around beheben:
5. Einzeilige Ifs (if $var=2 then Msgbox(...)) und Mehrzeilige BefehleQuote:
if $var=1 then
else
if $var2=2 then
endif
endif
funktionieren nicht.Quote:
Msgbox(0, _
"", _
"")
6. Die Keywords Global/Local/Dim sollte man aus Skripts, die in Execute ausgeführt werden entfernen, da die Variable sonst nicht als Variable erkannt wird.
Was muss ich sonst noch wissen?
1. Die Variablen werden immer Global erstellt, auf sie kann also von überall im Skript (auch außerhalb der Execute-Funktion) zugegriffen werden.
2. Momentan implementierte Keywords sind "Exit" und "ExitLoop", andere Keywords werden noch nicht unterstützt, z.b. ContinueLoop.
3. Abkürzungen sollte man vermeiden:
stattdessen sollte manQuote:
While 1
schreiben.Quote:
While 1=1
4. Die Funktion _Execute braucht länger für das Ausführene eines Befehls, als wenn man ihn direkt in AutoIt schreibt.
Beispiele und die UDF sind im Anhang, die Execute.au3 einfach in den Include Ordner von AutoIt3 kopieren.