Dieser Abschnitt stellt einige der im Forum häufiger gestellten Fragen zusammen. Wenn du die Antwort auf deine Frage hier nicht findest, dann sollte das Forum deine erste Anlaufstelle sein.
1. Warum laufen meine alten Skripte aus der Version 2.64 in der Version 3 nicht (mehr)?
2. Ist die Version 3 nicht viel komplizierter als die vorherigen Versionen?
3. Wie kann ich meine Skripte aus der Version 2.64 in Version 3-konforme Skripte umwandeln?
4. Wo ist der "goto"-Befehl hingekommen?
5. Wie kann ich DOS-Programm aus AutoIt heraus ausführen?
7. Warum erhalte ich Fehlermeldungen, wenn ich doppelte Anführungszeihen (") verwende?
8. Was bedeuten die Fenstertitel und -text-Parameter?
10. Warum passieren merkwürdige Dinge, wenn ich Variablen an den Send-Befehl übergebe?
11. Was ist der Unterschied zwischen dem "return"-Wert und @error?
12. Wie kann ich mein Sckipt über einen HotKey beenden?
13. Wie kann ich ein selbst gewähltes Icon benutzen, wenn ich mein Skript kompiliere?
14. Wie kann ich sicher gehen, dass nur eine Instanz meines Skriptes läuft?
15. Wo liegen die derzeitigen technischen Grenzen von AutoIt v3?
![]()
Die Version 3 hat eine andere Sprachstruktur als die Version 2.64.
Frühere Versionen von AutoIt erfüllten den Zweck, für den sie gedacht waren - einfache Skripte zu schreiben, um bei Softwareinstallationen zu helfen - sehr gut. Aber mit der Zeit wollten die Nutzer das Programm immer universeller für kompliziertere Skripting-Aufgaben nutzen. Die alte Systaxstruktur ließ das zwar zu, es wäre aber sehr, sehr schwierig und hindernisreich geworden. Also haben wir die Entscheidung getroffen, AutoIt stärker auf verschiedenste Automationsaufgaben auszurichten und dafür eine besser standardiserte und BASIC-artige Sprache zu entwerfen. Das bedeutet auch, dass du dir, wenn du die alte Skriptsprache beherrschst, auch AutoIt 3 sehr leicht aneignen wirst.
![]()
Nein. Tatsächlich ist sie in vielen Bereichen viel einfacher als die vorherigen Versionen, weil du nicht so sehr herumprobieren und die Sprache zu etwas zwingen musst, für das sie nie gedacht war. Außerdem ist die Sprache BASIC-artig und BASIC ist dafür bekannt, nun ja, eben grundlegend und einfach zu erlernen zu sein.
Die überwäligende Masse der alten AutoIt-Skripte kümmerten sich v.a. um Softwareinstallationen und darum, in vielen Dialogen auf "Weiter" zu klicken. Die meisten dieser Skripte können einfach an die neue Version angepasst werden, indem hie und da einige Klammern hinzugefügt werden. Hier ein Beispiel eines solchen Skriptes in Version 2 und 3. Es simuliert eine Softwareinstallation mit einigen Dialogen, die einen Weiter- und einen Fertig stellen-Button haben.
; v2.64-Skript
WinWaitActive, Willkommen, Willkommen zur XSoft installation
Send, !w
WinWaitActive, Zielverzeichnis wählen, Bitte
Send, !w
WinWaitActive, Fertig zum Installieren, Weiter klicken zur Installation
Send, !w
WinWaitActive, Installation fertig gestellt, Beenden
Send, !f
WinWaitClose, Installation fertig gestellt
; v3-Skript
WinWaitActive("Willkommen", "Willkommen zur XSoft installation")
Send("!w")
WinWaitActive("Zielverzeichnis wählen", "Bitte")
Send("!w")
WinWaitActive("Fertig zum Installieren", "Weiter klicken zur Installation")
Send("!w")
WinWaitActive("Installation fertig gestellt", "Beenden")
Send("!f")
WinWaitClose("Installation fertig gestellt")
Nun, das war doch nicht so kompliziert, oder? Weil Zeichenketten nun in Anführungszeichen eingeschlossen werden, musst du nicht mehr mit führenden und abschließenbden Leerzeichen herumschlagen. Außerdem werden viele Skripteditoren unterstützt, sodass du neue Skripte z.B. mit Sysntaxhervorhebung schreiben kannst, was die ganze Arbeit deutlich vereinfacht.
![]()
Als allererstes solltest du dich folgendes fragen: "Muss ich meine Skripte überhaupt umwandeln?" Die Version 2.64 wird weiter heruntergeladen werden können und unterstützt werden. Passe also deine Skripte nicht nur um der Anpassung willen an - außer du stehst darauf ;-)
Es gibt in dieser Hilfe einen Abschnitt, der sich mit den Unterschieden in den Befehlen beschäftigt - klicke hier, um sie zu aufzurufen.
Einer der Autoren von AutoIt v3 hat einen Konverter geschrieben, der deine alten Skripte automatisch umwandeln kann. Das funktioert ganz gut, solange deine Skripte nicht voll wüster Sprunganweisungen sind. Du findest den Konverter im Unterordner "Extras" deines Installationsverzeichnisses von AutoIt v3 oder im entsprechenden Untermenü des Startmenüeintrages.
![]()
Weg. Er ist böse. Nein, im Ernst, frag' nicht warum, es ist einfach so. Das ist wie mit dem Steinbrocken, den sie im Film Time Bandits in der Mikrowelle finden ;-)
Die in AutoIt v3 verwendeten Schleifen machen den goto-Befehl schlicht überflüssig. Schau' dir die While-, do-, For, ExitLoop-, ContinueLoop-Befehle sowie die Funktionen an, um den modernen Weg, solche Dinge zu realisiern, kennen zu lernen :). Und wenn du schon dabei bist, schau dir doch auch gleich die Schleifen, Konditionelle Ausdrücke und Funktionen an. Ich verspreche dir, wenn du das erst einmal durchschaut hast, wirst du jede andere Prorgammiersprache in wenigen Minuten prorgammieren können.
Eine kurze Einführung: Die einfachste Verwendung des goto-Befehles in Version 2.64 war eine Endlosschleife.
:meinlabel
...mache etwas...
...mache etwas anderes...
goto, meinlabel
Eine einfache Umsetzung davon in AutoIt v3 ist eine "while"-Schleife, deren Abbruchbedingung immer "wahr" ist.
While 1 = 1
...mache etwas...
...mache etwas anderes...
Wend
Sollte es einen massiven Aufschrei darüber geben, nachdem die Version 3 freigegeben wird, würde ich mir überlegen, den goto-Befehl erneut aufnehmen, um die Arbeit beim Umschreiben der Skripte erträglich zu halten.
![]()
Wenn du etwas wie den DOS-Befehl "dir" ausführen möchtest, dann musst du dazu den Kommandozeileninterpreter verwenden (je nach Betriebssystem ist das "command.com" oder "cmd.exe"). Das Makro @Comspec beinhaltet den korrekten Ort dieser Datei. Du solltest den RunWait()-Befehl verwenden, weil es auf die Beendigung des DOS-Programmes abwartet, bevor die Ausführung des eigenen Skriptes fortgesetzt wird. Hier ein Beispiel, wie man den DOS-"dir"-Befehl auf das Laufwerk C:\ anwendet (tatsächlich wird folgendes ausgeführt: command.com /c Dir C:\ ):
RunWait(@COMSPEC & " /c Dir C:\")
![]()
Nur wenige Dateitypen sind per Definition "ausführbar" - nämlich .exe, .bat, .com, .pif. Andere Dateitypen wie .txt und .msi werden von einem anderen Programm wiedergegeben. Wenn du auf eine Datei namens "myfile.msi" doppelklickst, dann wird im Hintergrund "msiexec.exe myfile.msi" ausgeführt. Um eine .msi-Datei auszuführen, kann man also folgendes tun:
RunWait("msiexec myfile.msi")
Der noch einfachere Weg ist, den (DOS-)Befehl "start" aufzurufen, der sich selbst darum kümmert, wie die Datei auszuführen ist:
RunWait(@COMSPEC " /c Start myfile.msi")
![]()
Wenn du doppelte Anführungszeichen innerhalb eines Strings verwenden möchtest, dann musst du sie "verdoppeln". Also immer zwei statt ein dopppeltes Anführungszeichen. Wenn du also z.B. eine Variable in einen String einbinden willst (Ein Wort in "diesem" Satz hat Anführungszeichen um sich!), dann müsstest du das folgendermaßen schreiben:
$var = "Ein Wort in ""diesem"" hat Anführungszeichen um sich!"
Oder du benutzt stattdessen einfache Anführungszeichen:
$var = 'Ein Wort in "diesem" hat doppelte Anführunszeichen um sich!'
![]()
Dazu gibt es hier eine detaillierte Beschreibung.
![]()
Angenommen, du hast eine Variable namens $msg und du möchtest sie in einer MessageBox ausgeben, dann wird das NICHT funktionieren:
MsgBox(0, "Example", "Meine Variable ist $msg")
Das wird einfach folgendes ausgeben: Meine Variable ist $msg. Du musst AutoIt anweisen, den Text und den Inhalt der Variablen zu verbinden. Dazu benötigst du den &-Operator:
MsgBox(0, "Example", "Meine Variable ist " & $msg)
Für Fortgeschrittene: Wenn du viele Variablen in einen String einbinbden willst, dann könnte die StringFormat()-Funktion für dich interessant sein. Die Variablen $var1 bis $var5 bindest du so einfacher ein:
$msg = StringFormat("Var1 ist
%s, Var2 ist %s, Var3 ist %s, Var4 ist %s, Var5 ist %s", $var1, $var2,
$var3, $var4,
$var5)
MsgBox(0, "Beispiel", $msg)
![]()
Wenn du den Inhalt einer Variablen per Send-Befehl weitergibst, dann bedenke, dass spezielle Zeichen wie !, ^, + oder {SPACE} umgewandelt werden. Das ist aber nur selten erwünscht. Um das zu umgehen, benutzt man den "RAW"-Modus des Send-Befehls, der diese Umwandlung nicht durchführt:
Send($meinevariable, 1)
![]()
Normalerweise wird der "return"-Wert dazu benutzt, anzugeben, ob eine Funktion erfolgreich durchgefüthrt wurde. Gibt die Funktion (wie z.B. WinGetText()) aber schon einen anderen Wert zurück, dann brauchen wir eine andere Möglichkeit, festzustellen, ob die Funktion erfolgreich ausgeführt wurde. Dazu dient dann @error.
![]()
Ah, etwas leichtes. Wenn du willst, dass sich dein Skript beendet, wenn du eine bestimmte Tastenkombination drückst, dann benutztst du die HotKeySet()-Funktion, um eine selbstdefinierte Funktion auszuführen. Diese sollte einfach das Schlüsselwort Exit enthalten.
Hier ein Stück Code, dass das Skript beendet, wenn Strg + ALT + x gedrückt wird:
HotKeySet("^!x", "MeinExit")
...
...
; Rest des Skriptes
...
...
Func MeinExit()
Exit
EndFunc
![]()
Dazu musst du den richtigen Compiler starten und nicht nur mit der rechten Mausstaste auf das Skript klicken und "Compile" (=Kompilieren) auswählen. Diese Seite beschreibt den Compiler en detail.
![]()
Der einfachste Weg ist folgender: Du änderst den Titel des verborgenen AutoIt-Fensters, wenn dein Skript zum ersten Mal startet. Davor überprüfst du im selben Skript, ob das Fenster unter dem neuen Namen bereits existiert - wenn es das tut, dann läuft dein Skript bereits.
; Platziere das an den Beginn deines Skriptes
$g_szVersion = "Mein Skript 1.1"
If WinExists($g_szVersion) Then Exit ; Das Skript läuft bereits
AutoItWinSetTitle($g_szVersion)
; Der Rest des Skriptes kommt hier
![]()
Hier sind die technischen Limitierungen von AutoIt v3. Bedenke, dass manche Begrenzungen theoretischer Natur sind und du sie möglicherweise aufgrund zuvor auftretender Speicher- oder Performanceprobleme gar nicht erreichen kannst.
Maximale Länge einer einzelnen Skriptzeile: 4.095 Zeichen
Maximale Länge eines Strings: 2.147.483.647 Zeichen
Wertebereich (Fleißkommazahlen (floating point)): 1.7E–308 bis 1.7E+308 mit 15 Stellen Genauigkeit
Wertebereich (Ganzzahlen (integer)): 64-bit signed integer
Hexadezimalzahlen: 32-bit signierter integer (0x80000000 bis 0x7FFFFFFF)
Arrays: Ein Maximum von 64 Dimensionen und/oder ein Maximum von 16 Millionen Elementen
Maximale Tiefe rekursiver Funktionsaufrufe: 384 Level
Gleichzeitig geöffnete Dateien: 64
Gleichzeitig aktive HotKeys: 64
Maximale Anzahl gleichzeitig benutzter Variablen: unlimitiert
Maximale Anzahl benutzerdefinierter Funktionen: unlimitiert
Maximale Anzahl von GUI-Fenstern: 1024
Maximale Anzahl von GUI-Controls pro Fenster: 4096
![]()