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-Programme aus AutoIt heraus ausführen?
7. Warum erhalte ich Fehlermeldungen, wenn ich doppelte Anführungszeichen (") 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 Skript ü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?
16. Ich habe ein Symbol wie bei fehlenden Bildern unter den Beispielen in der Hilfe.
![]()
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 Syntaxstruktur 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 standardisierte und BASIC-artige Sprache zu entwerfen. Das bedeutet auch, dass sich AutoIt 3 sehr leicht aneignen lässt, wenn man die alte Skriptsprache beherrscht.
![]()
Nein. Tatsächlich ist sie in vielen Bereichen viel einfacher als die vorherigen Versionen, weil man nicht so sehr herumprobieren und die Sprache zu etwas zwingen muss, 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ältigende 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, muss man sich nicht mehr mit führenden und abschließenden Leerzeichen herumschlagen. Außerdem werden viele Skripteditoren unterstützt, sodass neue Skripte z.B. mit Syntaxhervorhebung geschrieben werden können, was die ganze Arbeit deutlich vereinfacht.
![]()
Als aller erstes stellt sich die Frage: "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 aufzurufen.
Einer der Autoren von AutoIt v3 hat einen Konverter geschrieben, der deine alten Skripte automatisch umwandeln kann. Das funktioniert 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 realisieren, 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 Programmiersprache in wenigen Minuten programmieren 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 aufzunehmen, 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-Programms 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 doppeltes 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"" Satz hat Anführungszeichen um sich!"
Oder du benutzt stattdessen einfache Anführungszeichen:
$var = 'Ein Wort in "diesem" Satz hat doppelte Anführungszeichen 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 einbinden 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ührt 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 benutze die HotKeySet()-Funktion, um eine selbstdefinierte Funktion auszuführen. Diese sollte einfach das Schlüsselwort Exit enthalten.
Hier ein Stück Code, das 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 Maustaste auf das Skript klicken und "Compile" (=Kompilieren) auswählen. Diese Seite beschreibt den Compiler en detail.
![]()
Verwende die _Singleton() Funktion. Schau in der Dokumentation zu den benutzerdefinierten Funktion nach mehr Informationen für _Singleton() und wie es zu verwenden ist.
![]()
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 (Fließkommazahlen (floating point)): 1.7E–308 bis 1.7E+308 mit 15 Stellen Genauigkeit
Wertebereich (Ganzzahlen (integer)): 64-bit vorzeichenbehafteter Integer
Hexadezimalzahlen: 32-bit vorzeichenbehafteter Integer (0x80000000 bis 0x7FFFFFFF)
Arrays: Ein Maximum von 64 Dimensionen und/oder ein Maximum von 16 Millionen Elementen
Maximale Tiefe rekursiver Funktionsaufrufe: 5100 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: unlimitiert
Maximale Anzahl von GUI-Controls pro Fenster: 65532
![]()
An dieser Stelle sollte eine Schaltfläche "Öffnen" sein, mit der man das Beispiel direkt im Editor öffnen kann.
In diesem Fall ist möglicherweise die Datei hhctrl.ocx nicht im System registriert oder beschädigt.
Man kann versuchen, "regsvr32 hhctrl.ocx" bei "Start", "Ausführen..." einzugeben, um damit dieses Problem zu beheben.
![]()