[Release] Erweiterte Execute-UDF

01/22/2011 01:47 Shadow992#1
Ich denke einige von euch kennen die in AutoIt implementierte "Execute"-Funktion. Ich fand es schon immer schade, dass diese Funktion so sehr beschnitten ist.
Es ist zum Beispiel nicht möglich mehrere Zeilen ausführen zu lassen, bspw. soetwas:
Quote:
Execute("Msgbox(0,' ',' ')"&@crlf&"Msgbox(0,'2','2')")
Das schränkt die Funktion natürlich sehr ein und auch, dass die Funktion kein If/While/For kennt ist Schade.
Außerdem kann man Variablen innerhalb der Execute Funktion keine Werte zuweisen:
Quote:
Execute("$var=1")
Diese ganzen Eigenschaften machen die Execute-Funktion eigentlich überflüssig und man kann sie nur noch für Rechnungen/Obfuscator benutzen:
Quote:
$var=12
$var="12-3+"&$var
$var=Execute($var1)
Genau aus den oben genannten Gründen und weil ein Freund mich darauf angesprochen hatte, habe ich die Execute-Funktion ein bisschen erweitert.


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:
Quote:
$var="then"
if $var1=$var then
...
endif
4. Momentan funktionieren nur die Statements If/Else, While und For.
Elseif funtkioniert nicht, lässt sich aber mit einem Work-Around beheben:
Quote:
if $var=1 then

else
if $var2=2 then

endif
endif
5. Einzeilige Ifs (if $var=2 then Msgbox(...)) und Mehrzeilige Befehle
Quote:
Msgbox(0, _
"", _
"")
funktionieren nicht.

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:
Quote:
While 1
stattdessen sollte man
Quote:
While 1=1
schreiben.

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.
01/22/2011 11:33 Tarkrai#2
Danke hab ich schon gesucht mal wieder ein schönes und verständliches Tut von dir :P
01/22/2011 12:08 puzzlr#3
sehr schön. doch ich glaube, dass ist die falsche section hier. das gehört in die releases section. bin mir aber nicht sicher.
01/22/2011 12:12 Shadow992#4
Quote:
Originally Posted by u_failed View Post
sehr schön. doch ich glaube, dass ist die falsche section hier. das gehört in die releases section. bin mir aber nicht sicher.
Ich denke hier passt es hin, denn die meisten AutoItler suchen nicht in der Release-Sektion sondern direkt in der AutoIt-Sektion. Es ist ja auch eine UDF für AutoIt und nicht direkt eine allgemein ausführbare Exe. ;)
01/22/2011 12:46 TrickGamer#5
Nicht schlecht^^ kann man ja mal brauchen ;)
01/22/2011 14:04 PenGuin :O#6
Naja meiner Meinung nach nicht wirklich nötig, aber danke für die Bemühungen ;)
01/22/2011 14:15 Shadow992#7
Quote:
Originally Posted by PenGuin :O View Post
Naja meiner Meinung nach nicht wirklich nötig, aber danke für die Bemühungen ;)
Das muss jeder für sich selbst wissen ob er es benötigt oder nicht.
Wer es nicht benötigt, der muss es ja nicht downloaden.
01/22/2011 15:24 PenGuin :O#8
Quote:
Originally Posted by Shadow992 View Post
Das muss jeder für sich selbst wissen ob er es benötigt oder nicht.
Wer es nicht benötigt, der muss es ja nicht downloaden.

Quote:
Originally Posted by PenGuin :O View Post
meiner Meinung nach
:rolleyes: