Verwandte Themen:
Jedes Skript ist eine reine Textdatei mit mehreren Zeilen, die das Programm (AutoHotkey.exe) ausführen soll. Solche Skripte können Hotkeys und Hotstrings enthalten oder sogar nur aus diesen bestehen. Falls keine Hotkeys und Hotstrings vorhanden sind, wird ein Skript, sobald es gestartet wird, seine Befehle von oben nach unten und der Reihe nach ausführen.
Das Programm lädt das Skript zeilenweise in den Speicher. Jede Zeile kann bis zu 16383 Zeichen lang sein. Während des Ladevorgangs wird das Skript optimiert und überprüft, ob es gültig ist. Wenn das Programm auf einen Syntaxfehler stößt, wird er angezeigt. Solche Fehler müssen korrigiert werden, bevor das Skript ausgeführt werden kann.
Das Skript startet, sofern es erfolgreich geladen wurde, bei der ersten Zeile und endet, wenn es entweder ein Return, Exit, Hotkey-/Hotstring-Label oder das physische Ende des Skripts erreicht hat (je nachdem was zuerst kommt). Dieser oberste Bereich des Skripts wird auch als automatischer Ausführungsbereich bezeichnet.
Hinweis: Während das erste Hotkey/Hotstring-Label im Skript die gleiche Wirkung wie Return hat, haben andere Hotkeys und Label dies nicht.
Wenn das Skript nicht persistent ist, wird es nach Abschluss des automatischen Ausführungsbereichs terminiert. Ansonsten läuft das Skript im Leerlauf weiter, wo es nur noch auf Ereignisse wie Hotkeys, Hotstrings, GUI-Ereignisse, benutzerdefinierte Menüpunkte und Timer reagieren kann. Ein Skript ist automatisch persistent, wenn es Hotkeys, Hotstrings, OnMessage() oder GUI enthält, sowie in einigen anderen Fällen. Die #Persistent-Direktive kann verwendet werden, um das Skript explizit persistent zu machen.
Jeder neu gestartete Thread via Hotkey, Hotstring, Menüpunkt, GUI-Ereignis oder Timer verwendet vorerst die Standardwerte von folgenden Einstellungen, die im automatischen Ausführungsbereich festgelegt werden können. Wenn diese nicht festgelegt sind, werden die vordefinierten Standardwerte verwendet (welche das sind, finden Sie auf den folgenden Seiten): AutoTrim, CoordMode, Critical, DetectHiddenText, DetectHiddenWindows, FileEncoding, ListLines, SendLevel, SendMode, SetBatchLines, SetControlDelay, SetDefaultMouseSpeed, SetFormat, SetKeyDelay, SetMouseDelay, SetRegView, SetStoreCapsLockMode, SetTitleMatchMode, SetWinDelay, StringCaseSense, und Thread.
Falls der automatische Ausführungsbereich zu lange dauert (oder nie das Ende erreicht), werden die Standardwerte der oben genannten Einstellungen automatisch nach 100 Millisekunden wirksam. Wenn der automatische Ausführungsbereich schließlich das Ende erreicht hat (wenn überhaupt), werden die Standardwerte mit den benutzerdefinierten Standardwerten aus dem automatischen Ausführungsbereich überschrieben. In der Regel ist es am besten, die Standardwerte von Hotkeys, Hotstrings, Timern oder benutzerdefinierten Menüpunkten im oberen Bereich des Skripts zu ändern. Beachten Sie außerdem, dass jedem Thread eine eigene Sammlung von den oben genannten Einstellungen zugewiesen ist. Das heißt, dass Einstellungen, die in einem Thread geändert werden, die Einstellungen von anderen Threads nicht beeinflussen können.
Lange Zeilen können in mehreren kurzen Zeilen aufgeteilt werden, um die Übersichtlichkeit und Wartbarkeit des Skripts zu erhöhen. Die Ausführungsgeschwindigkeit des Skripts wird dabei nicht reduziert, weil solche Zeilen bereits beim Starten des Skripts im Speicher zusammengeführt werden.
Methode #1: Eine Zeile, die mit "and", "or", ||, &&, einem Komma oder einem Punkt beginnt, wird automatisch mit der oberen Zeile zusammengeführt (in v1.0.46+ gilt das auch für alle anderen Ausdrucksoperatoren, außer ++ und --). Im folgenden Beispiel wird die zweite Zeile an die erste Zeile angefügt, weil sie mit einem Komma beginnt:
FileAppend, Das ist der Text, der angefügt wird.`n ; Kommentar hier möglich. , %A_ProgramFiles%\BeliebigeAnwendung\Log-Datei.txt ; Kommentar.
Die Zeilen im nächsten Beispiel werden zu einer einzelnen Zeile zusammengeführt, weil die letzten beiden Zeilen mit "and" oder "or" beginnen:
if (Farbe = "Rot" or Farbe = "Grün" or Farbe = "Blau" ; Kommentar. or Farbe = "Schwarz" or Farbe = "Grau" or Farbe = "Weiß") ; Kommentar. and ProduktIstInFarbeVerfügbar(Produkt, Farbe) ; Kommentar.
Der ternäre Operator ist auch ein guter Kandidat:
ProduktIstVerfügbar := (Farbe = "Rot") ? false ; Rote Produkte sind nicht verfügbar, daher ist der folgende Funktionsaufruf irrelevant. : ProduktIstInFarbeVerfügbar(Produkt, Farbe)
Obwohl die Einrückungen in den oberen Beispielen optional sind, machen sie eventuell deutlich, welche Zeilen zusammengehören. Außerdem müssen keine Leerzeichen bei Zeilen eingefügt werden, die mit den Wörtern "AND" und "OR" beginnen; das Programm macht das automatisch. In den Beispielen oben können leere Zeilen oder Kommentare zwischen oder am Ende jeder Zeile eingefügt werden.
Methode #2: Diese Methode sollte verwendet werden, wenn sehr viele Zeilen zusammengeführt werden müssen oder wenn die Zeilen nicht für Methode #1 geeignet sind. Diese Methode kann sowohl bei automatisch-ersetzenden Hotstrings als auch bei Befehlen oder Ausdrücken angewendet werden. Zum Beispiel:
; BEISPIEL #1: Var = ( Eine Textzeile. Standardmäßig wird das CR-Zeichen (Enter) zwischen der vorherigen und dieser Zeile als LF-Zeichen (`n) gespeichert. Standardmäßig werden die Leerzeichen auf der linken Seite dieser Zeile auch gespeichert (das gleiche gilt auch für Tabulatoren). Standardmäßig werden Variablenreferenzen wie %Var% mit dem Inhalt der Variable ersetzt. ) ; BEISPIEL #2 - Ausdruckssyntax (empfohlen): Var := " ( Wie oben, außer dass Variablenreferenzen wie %Var% nicht aufgelöst werden. Geben Sie stattdessen Variablen wie folgt an:" Var " )" ; BEISPIEL #3: FileAppend, ; Das Komma ist in diesem Fall erforderlich. ( Zeile 1 vom Text. Zeile 2 vom Text. Standardmäßig befindet sich ein Zeilenumbruchszeichen (`n) zwischen den Zeilen. ), C:\Meine Datei.txt
In den oberen Beispielen sieht man oben und unten runde Klammern, die mehrere Zeilen eingrenzen. Auch Fortsetzungsbereich genannt. Beachten Sie, dass in der untersten Zeile nach der runden Endklammer der letzte Parameter von FileAppend enthalten ist. Diese Anwendungsart ist optional; das wird in solchen Fällen getan, um das Komma nicht als direkt geschriebenes Komma, sondern als Parametertrennung zu behandeln.
Das Standardverhalten eines Fortsetzungsbereichs kann überschrieben werden, indem man eine oder mehrere der folgenden Optionen auf der rechten Seite der runden Startklammer einfügt. Mehrere Optionen müssen mit Leerzeichen voneinander getrennt werden. Zum Beispiel: ( LTrim Join| %
.
Join: Gibt an, wie die Zeilen verbunden werden sollen. Lässt man diese Option weg, wird jeder Zeile, außer die letzte, mit einem Zeilenumbruchszeichen (`n) enden. Wenn nur das Wort Join angegeben ist, werden die Zeilen ohne Zeichen miteinander verbunden. Ansonsten können unmittelbar nach dem Wort Join bis zu 15 Zeichen erfolgen. Zum Beispiel würde Join`s
bewirken, dass nach jeder Zeile, außer der letzten, ein Leerzeichen erfolgt ("`s" kennzeichnet ein direkt geschriebenes Leerzeichen - eine spezielle Escapesequenz, die nur von Join erkannt wird). Join`r`n
würde hingegen CR+LF zwischen den Zeilen einfügen, während Join|
einen Vertikalstrich zwischen den Zeilen einfügen würde. Damit die letzte Zeile auch mit einem Trennungszeichen endet, ist es erforderlich, direkt über der runden Endklammer des Bereichs eine leere Zeile einzufügen.
Bekannte Einschränkung: Eine Join-Zeichenkette, die mit einem Doppelpunkt endet, darf nicht als letzte Option auf dieser Zeile angegeben werden. Dies würde dazu führen, dass (Join:
beispielsweise als Label "(Join" behandelt oder dass (LTrim Join:
nicht unterstützt wird, während (Join: C
vollkommen in Ordnung wäre.
LTrim: Entfernt Leer- und Tabulatorzeichen am Anfang jeder Zeile. Diese Option erlaubt es, den Fortsetzungsbereich eingerückt zu lassen. Geben Sie #LTrim
ohne Parameter an, um diese Option für mehrere Fortsetzungsbereiche einzuschalten. #LTrim
ist von der Position abhängig; diese Direktive beeinflusst nur Fortsetzungsbereiche, die sich physisch darunter befinden. Die Einstellung kann via #LTrim Off
wieder ausgeschaltet werden.
RTrim0 (RTrim gefolgt von einer 0): Verhindert, dass Leer- und Tabulatorzeichen am Ende jeder Zeile automatisch entfernt werden.
Comments (oder Comment oder Com oder C) [v1.0.45.03+]: Ermöglicht Semikolon-Kommentare innerhalb des Fortsetzungsbereichs (aber nicht /*..*/
). Solche Kommentare (sowie alle links vorkommenden Leer- und Tabulatorzeichen) werden im Endergebnis entfernt, anstatt als direkt geschriebener Text behandelt zu werden. Jeder Kommentar kann auf der rechten Seite einer Zeile oder auf einer neuen Zeile vorkommen.
% (Prozentzeichen): Behandelt Prozentzeichen nicht als Variablenreferenzen, sondern als direkt geschriebene Zeichen. Dadurch wird verhindert, dass jedes einzelne Prozentzeichen mit einem Escapezeichen versehen werden muss. Diese Option kann weggelassen werden, wenn der Fortsetzungsbereich an Stellen z. B. automatisch-ersetzende Hotstrings verwendet wird, wo Prozentzeichen bereits als direkt geschriebener Text behandelt werden.
, (Komma): Behandelt Kommas nicht als direkt geschriebener Text, sondern als Trennzeichen. Diese selten verwendete Option ist nur für die Kommas zwischen den Befehlsparametern notwendig, weil in Funktionsaufrufen der Typ des Kommas keine Rolle spielt. Zudem transformiert diese Option nur Kommas, die tatsächlich Parameter trennen. Mit anderen Worten: Sobald der letzte Parameter des Befehls erreicht wird (oder wenn keine Parameter vorhanden sind), werden nachfolgende Kommas unabhängig von dieser Option als direkt geschriebener Text behandelt.
` (umgekehrtes Häkchen): Behandelt umgekehrte Häkchen nicht als Escapezeichen, sondern als direkt geschriebene Zeichen. Dies hat auch den Effekt, dass Kommas und Prozentzeichen nicht direkt und individuell mit einem Escapezeichen versehen werden können, oder dass explizit angegebene Escapesequenzen wie `r und `t nicht umgewandelt werden.
) [v1.1.01+]: Eine runde Endklammer in den Optionen des Fortsetzungsbereichs (außer als Parameter der Join-Option) bewirkt, dass die Zeile nicht als Beginn eines Fortsetzungsbereichs, sondern als Ausdruck interpretiert wird. Auf diese Weise können Ausdrücke wie (x.y)[z]()
funktionsfähig gemacht werden, ohne die runde Startklammer mit einem Escapezeichen versehen zu müssen.
Bemerkungen
Escapesequenzen wie `n (Zeilenumbruch) und `t (Tabulator) werden innerhalb des Fortsetzungsbereichs unterstützt, solange die Akzent-Option (`) nicht vorhanden ist.
Wenn die Comment-Option fehlt, werden Semikolon- und /*..*/-Kommentare innerhalb eines Fortsetzungsbereichs als direkt geschriebener Text angesehen. Allerdings können Kommentare am untersten oder obersten Ende des Bereichs eingefügt werden. Zum Beispiel:
FileAppend, ; Kommentar. ; Kommentar. ( LTrim Join ; Kommentar. ; Das ist kein Kommentar; es ist direkt geschrieben. Fügen Sie das Wort Comments in die Zeile darüber ein, um es zu einem Kommentar zu machen. ), C:\Datei.txt ; Kommentar.
Der oben genannte Punkt ist der Grund, warum Semikolons innerhalb eines Fortsetzungsbereichs nie mit einem Escapezeichen versehen werden müssen.
Ein Fortsetzungsbereich kann keine Zeile erzeugen, deren Länge 16383 Zeichen überschreitet (das Programm warnt Sie bei dem Versuch, sobald es gestartet wird). Diese Einschränkung kann zum Beispiel mit mehreren Verkettungen umgangen werden. Zum Beispiel:
Var := " ( ... )" Var .= "`n ; Füge mithilfe eines weiteren Fortsetzungsbereichs mehr Text hinzu. ( ... )" FileAppend, %Var%, C:\Meine Datei.txt
Aufgrund der Tatsache, dass eine runde Endklammer das Ende eines Fortsetzungsbereichs kennzeichnet, muss eine direkt geschriebene runde Endklammer mit einem Escapezeichen (Akzent/umgekehrtes Häkchen) versehen werden: `)
.
Unmittelbar nach einem Fortsetzungsbereich kann eine Zeile angegeben werden, die die runde Startklammer eines weiteren Fortsetzungsbereichs enthält. Auf diese Weise können unterschiedliche Optionen beim Konstruieren einer einzelnen Zeile angewendet werden.
Die stückweise Konstruktion eines Fortsetzungsbereichs via #Include wird nicht unterstützt.
Es ist ein Skript-Compiler im Lieferumfang des Programms enthalten (von fincs bereitgestellt und von TAC109 um Features erweitert).
Ein kompiliertes Skript ist eine eigenständige ausführbare Datei; das heißt, dass das Skript ohne AutoHotkey.exe gestartet werden kann. Der Kompilierungsvorgang bestückt die ausführbare Datei mit folgenden Dingen: der AutoHotkey-Interpreter, das Skript, via #Include definierte Dateien und via FileInstall definierte Dateien. [v1.1.33+]: Zusätzliche Dateien können mittels Compiler-Direktiven eingebunden werden.
Für v1.1- und v2-Skripte wird derselbe Compiler verwendet. Der Compiler unterscheidet Skriptversionen durch Überprüfung der Hauptversion der bereitgestellten Basisdatei.
Ahk2Exe kann auf folgenden Arten verwendet werden:
GUI-Schnittstelle: Starten Sie die Verknüpfung "Convert .ahk to .exe" im Startmenü. (Nach dem Aufruf der GUI kann es zu einer Verzögerung kommen, bevor das Fenster angezeigt wird; Einzelheiten finden Sie unter Hintergrundinformationen.)
Rechtsklick: Rechtsklicken Sie in einem Explorer-Fenster auf eine .ahk-Datei und wählen Sie "Compile Script" aus (nur verfügbar, wenn die Option "Script Compiler" in der Installation von AutoHotkey ausgewählt wurde). Nach einer kurzen Zeit wird im Verzeichnis des Skripts eine gleichnamige EXE-Datei erstellt. Hinweis: Das Erstellen der EXE-Datei erfolgt mit den Einstellungen (Symbol, .bin-Datei, Komprimierung), die zuletzt in Methode #1 oben gespeichert wurden, oder wie im Skript per Compiler-Direktive angegeben.
Befehlszeile: Der Compiler kann von der Befehlszeile aus mit den unten gezeigten Parametern gestartet werden. Jeder Befehlszeilenparameter, außer /gui
, führt dazu, dass das Skript sofort kompiliert wird. Alle Parameter sind optional, außer dass ein /gui
- oder /in
-Parameter vorhanden sein muss.
Parameterpaar | Bedeutung |
---|---|
/in Skriptname | Der Pfad und Name des Skripts, das kompiliert werden soll. Dies muss angegeben werden, sobald mindestens einer der anderen Parameter verwendet wird, es sei denn, es wird /gui verwendet. |
/out EXE_Name | Der Pfad\Name der EXE-Datei, die erstellt werden soll. Standardmäßig wird das Verzeichnis und der Basisname der Eingabedatei, plus ".exe" als Dateiendung, oder eine entsprechende Compiler-Direktive im Skript verwendet. |
/icon Symbolname | Die zu verwendende Symboldatei. Standardmäßig wird das zuletzt in der GUI-Oberfläche gespeicherte Symbol oder eine SetMainIcon-Compiler-Direktive im Skript verwendet. |
/base Dateiname | [v1.1.33.10+]: Die zu verwendende Basisdatei (eine BIN-Datei oder in [v1.1.34+] eine EXE-Datei). Die Hauptversion der verwendeten Basisdatei muss mit der Version des zu kompilierenden Skripts übereinstimmen. Standardmäßig wird der zuletzt in der GUI-Oberfläche gespeicherte Basisdateiname oder eine Base-Compiler-Direktive im Skript verwendet. |
/resourceid Name | [v1.1.34+]: Weist eine untypische Ressourcen-ID zu, die für das Hauptskript bei Kompilierungen verwendet wird, die eine EXE-Basisdatei verwenden (siehe Eingebettete Skripte). Numerische Ressourcen-IDs müssen aus einem Rautezeichen (#), gefolgt von einer Dezimalzahl, bestehen. Standardmäßig wird #1 oder eine ResourceID-Compiler-Direktive im Skript verwendet. |
/cp Zeichensatz | [v1.1.23.01+]: Überschreibt den Standard-Zeichensatz, mit dem die Skript-Dateien gelesen werden. Eine Liste möglicher Werte finden Sie unter Code Page Identifiers. Beachten Sie, dass Unicode-Skripte mit einer Byte-Order-Markierung (BOM) beginnen sollten, was die Verwendung dieses Parameters überflüssig macht. |
/compress n | [v1.1.33+]: Soll die EXE-Datei komprimiert werden? 0 = nein, 1 = MPRESS verwenden (falls vorhanden), 2 = UPX verwenden (falls vorhanden). Standardmäßig wird die zuletzt in der GUI-Oberfläche gespeicherte Einstellung verwendet. |
/gui | [v1.1.33+]: Zeigt die GUI, anstatt sofort zu kompilieren. Die anderen Parameter können verwendet werden, um die zuletzt in der GUI gespeicherten Einstellungen zu überschreiben. /in ist in diesem Fall optional. |
/silent [verbose] | [v1.1.33.10+]: Deaktiviert alle Mitteilungsfenster und gibt stattdessen die Fehler in der Standardfehlerausgabe (stderr) aus; oder in der Standardausgabe (stdout), wenn stderr fehlschlägt. Sonstige Meldungen werden ebenfalls in stdout ausgegeben. Geben Sie optional das Wort verbose an, um Statusmeldungen ebenfalls in stdout auszugeben. |
Veraltet: /ahk Dateiname |
[v1.1.33+]: Der Pfad\Name der AutoHotkey.exe-Datei, die zum Kompilieren des Skripts verwendet werden soll. |
Veraltet: /mpress 0oder1 |
Soll die EXE-Datei mit MPRESS komprimiert werden? 0 = nein, 1 = ja. Standardmäßig wird die zuletzt in der GUI-Oberfläche verwendete Einstellung verwendet. |
Veraltet: /bin Dateiname |
Die zu verwendende BIN-Datei. Standardmäßig wird der zuletzt in der GUI-Oberfläche gespeicherte BIN-Dateiname verwendet. |
Zum Beispiel:
Ahk2exe.exe /in "Skript.ahk" /icon "Symbol.ico"
Hinweise:
Den Quellcode sowie neuere Versionen des Compilers finden Sie auf GitHub.
Jede EXE-Datei eines kompilierten Skripts basiert auf einer ausführbaren Datei, die den Interpreter implementiert. Die im Compiler-Verzeichnis enthaltenen Basisdateien haben die Dateiendung ".bin"; diese Dateien sind Versionen des Interpreters, die nicht die Möglichkeit bieten, externe Skriptdateien zu laden. Stattdessen wird das Programm nach einer Win32-Ressource (RCDATA) namens ">AUTOHOTKEY SCRIPT<" suchen und diese laden, oder fehlschlagen, wenn sie nicht gefunden wird.
[v1.1.34+]: Die ausführbaren Standard-AutoHotkey-Dateien können auch als Basis für ein kompiliertes Skript verwendet werden, indem eine Win32-Ressource (RCDATA) mit der ID 1 eingebettet wird. (Weitere Skripte können mit der AddResource-Compiler-Direktive hinzugefügt werden.) Dadurch kann die EXE-Datei eines kompilierten Skripts zusammen mit der Befehlszeilenoption /script verwenden werden, um anstelle des eingebetteten Hauptskripts andere Skripte auszuführen. Weitere Informationen finden Sie unter Eingebettete Skripte.
[v1.1.33+]: Skript-Compiler-Direktiven ermöglichen es dem Benutzer, genaue Angaben darüber zu machen, wie ein Skript kompiliert werden soll. Einige der Features sind:
Weitere Informationen finden Sie unter Skript-Compiler-Direktiven.
Ahk2Exe kann optional MPRESS- oder in [v1.1.33+] UPX-Freeware verwenden, um kompilierte Skripte zu komprimieren. Wenn MPRESS.exe und/oder UPX.exe in den Compiler-Unterordner von AutoHotkey kopiert wurde, kann die EXE-Datei via /compress
-Parameter oder GUI-Einstellung komprimiert werden.
MPRESS - offizielle Webseite (Downloads und Information): http://www.matcode.com/mpress.htm
MPRESS Mirror: https://www.autohotkey.com/mpress/
UPX - offizielle Webseite (Downloads und Information): https://upx.github.io/
Hinweis: Eine auf diese Weise komprimierte EXE-Datei unterbindet eine einfache Einsicht in den Quellcode des Skripts mithilfe eines Texteditors wie z. B. Notepad oder PE-Resource-Editor. Allerdings kann es nicht verhindern, dass der Quellcode mit Tools extrahiert werden kann, die speziell dafür entwickelt worden sind.
In [v1.1.33.10+] wird die folgende Ordnerstruktur unterstützt, wobei sich die ausführende Version von Ahk2Exe.exe
im ersten, unten dargestellten \Compiler-Verzeichnis befindet:
\AutoHotkey AutoHotkeyA32.exe AutoHotkeyU32.exe AutoHotkeyU64.exe \Compiler Ahk2Exe.exe ; die Hauptversion von Ahk2Exe ANSI 32-bit.bin Unicode 32-bit.bin Unicode 64-bit.bin \AutoHotkey v2.0-a135 AutoHotkey32.exe AutoHotkey64.exe \Compiler \v2.0-beta.1 AutoHotkey32.exe AutoHotkey64.exe
Der Suchalgorithmus zum Finden der Basisdatei wird beim Starten von Ahk2Exe kurz ausgeführt und funktioniert wie folgt:
Der Algorithmus sucht nach qualifizierten AutoHotkey-EXE-Dateien und allen BIN-Dateien im Verzeichnis des Compilers, im übergeordneten Verzeichnis des Compilers und in allen Nebenverzeichnissen des Compilers, deren Namen mit AutoHotkey
oder V
beginnen, aber nicht mit AutoHotkey_H
. Die ausgewählten Verzeichnisse werden rekursiv durchsucht. Es werden alle gefundenen AutoHotkey.exe-Dateien ausgeschlossen - übrig bleiben Dateien wie AutoHotkeyA32.exe, AutoHotkey64.exe usw. sowie alle gefundenen BIN-Dateien. Alle enthaltenen EXE-Dateien müssen einen Namen haben, der mit AutoHotkey
beginnt, und eine Dateibeschreibung, die das Wort AutoHotkey
enthält, sowie die Version 1.1.34+
oder 2.0-a135+
.
Für eine erfolgreiche Kompilierung wird auch eine Version des AutoHotkey-Interpreters (als Hilfsprogramm) benötigt. Es wird einer nach einem ähnlichen Algorithmus ausgewählt. In den meisten Fällen wird die Version des genutzten Interpreters mit der Version der Basisdatei übereinstimmen, die der Benutzer für die Kompilierung ausgewählt hat.
Skripte unterstützen Befehlszeilenparameter. Das Format ist:
AutoHotkey.exe [Optionen] [Skript-Dateiname] [Skript-Parameter]
Bei kompilierten Skripten ist das Format:
KompiliertesSkript.exe [Optionen] [Skript-Parameter]
Optionen: Folgende können angegeben werden:
Option | Bedeutung | Kompiliert? |
---|---|---|
/f oder /force | Skript bedingungslos starten und Warndialogfenster überspringen. Diese Option hat den gleichen Effekt wie #SingleInstance Off. | Ja |
/r oder /restart | Gibt an, dass das Skript neu gestartet werden soll und dass eine ältere Instanz des Skripts, sofern möglich, geschlossen werden soll (diese Option wird auch intern vom Reload-Befehl verwendet). | Ja |
/ErrorStdOut /ErrorStdOut=Codierung |
Sendet alle Syntaxfehler, die den Start eines Skripts verhindern, zur Standardfehlerausgabe (stderr), anstatt ein Dialogfenster anzuzeigen. Siehe #ErrorStdOut für weitere Details. Diese Option kann mit /iLib kombiniert werden, um die Gültigkeit des Skripts zu überprüfen, ohne es auszuführen. [v1.1.33+]: Es kann optional eine Codierung angegeben werden. |
Ja |
/Debug | [AHK_L 11+]: Stellt eine Verbindung zu einem Debugger-Client her. Weitere Informationen finden Sie unter Interaktives Debuggen. | Nein |
/CPn |
[AHK_L 51+]: Überschreibt den Standard-Zeichensatz, mit dem die Skript-Dateien gelesen werden. Weitere Informationen finden Sie unter Zeichensatz einer Skript-Datei. [v1.1.33+]: Wenn "Default to UTF-8" im Installer aktiviert ist, wird der Dateityp ".ahk" mit einer Befehlszeile registriert, die |
Nein |
/iLib "AusgabeDatei" |
[v1.0.47+]: AutoHotkey lädt das Skript, ohne es auszuführen. Für jedes Skript, das mithilfe des Bibliotheksmechanismus automatisch eingebunden wurde, werden zwei Zeilen in die AusgabeDatei geschrieben. Diese Zeilen werden im folgenden Format geschrieben - dabei ist BiblVerz der vollständige Pfad des Bibliotheksordners und BiblDatei der Dateiname der Bibliothek: #Include BiblVerz\ #IncludeAgain BiblVerz\BiblDatei.ahk Wenn die Ausgabedatei bereits existiert, wird sie überschrieben. AusgabeDatei kann Enthält das Skript Syntaxfehler, wird die Ausgabedatei eventuell leer sein. Der Exitcode des Prozesses kann verwendet werden, um diesen Zustand zu erkennen; bei einem Syntaxfehler ist der Exitcode eine 2. Mit der /ErrorStdOut-Option kann die Fehlermeldung unterdrückt oder abgefangen werden. |
Nein |
/include "IncDatei" |
[v1.1.34+]: Inkludiert eine Datei vor dem Hauptskript. Mit dieser Methode kann nur eine einzelne Datei inkludiert werden. Wenn das Skript neu geladen wird, wird diese Befehlszeilenoption automatisch an die neue Instanz übergeben. |
Nein |
/script |
[v1.1.34+]: Wenn diese Befehlszeilenoption mit einem kompilierten Skript basierend auf einer EXE-Datei verwendet wird, veranlasst sie das Programm, das eingebettete Hauptskript zu ignorieren. Dadurch kann die EXE-Datei eines kompilierten Skripts anstelle des Hauptskripts externe Skriptdateien oder eingebettete Skripte ausführen. Andere Befehlszeilenoptionen, die normalerweise von kompilierten Skripten nicht unterstützt werden, können ebenfalls verwendet werden, müssen aber rechts von dieser Befehlszeilenoption angegeben werden. Zum Beispiel: KompiliertesSkript.exe /script /ErrorStdOut MeinSkript.ahk "Skript-Arg 1" Wenn die aktuelle ausführbare Datei kein eingebettetes Skript hat, ist diese Befehlszeilenoption erlaubt, aber wirkungslos. Diese Befehlszeilenoption wird von kompilierten Skripten, die auf einer BIN-Datei basieren, nicht unterstützt. Siehe auch: Ausführbare Basisdatei (Ahk2Exe) |
N/A |
Skript-Dateiname: Dieser Parameter kann weggelassen werden, falls keine Skript-Parameter vorhanden sind. Wenn dieser Parameter nicht verwendet wird (z. B. wenn man AutoHotkey direkt über das Startmenü startet), wird das Programm in dieser Reihenfolge nach einer Skriptdatei namens AutoHotkey.ahk
an folgenden Standorten suchen:
Der Dateiname AutoHotkey.ahk
ist abhängig vom Namen der ausführbaren Datei, mit der das Skript gestartet wurde. Wenn Sie beispielsweise AutoHotkey.exe in MeinSkript.exe umbenennen, versucht das Programm MeinSkript.ahk
zu finden. Starten Sie AutoHotkeyU32.exe ohne Parameter, sucht das Programm nach AutoHotkeyU32.ahk.
Hinweis: In den Versionen vor Revision 51 wurde AutoHotkey.ini im Arbeitsverzeichnis oder AutoHotkey.ahk in "Eigene Dokumente" gesucht.
[v1.1.17+]: Geben Sie als Dateiname ein Sternchen (*) an, um den Skript-Text aus der Standardeingabe (stdin) zu lesen. Ein Beispiel dazu finden Sie unter ExecScript().
[v1.1.34+]: Wenn die aktuelle ausführbare Datei eingebettete Skripte enthält, kann für diesen Parameter ein Sternchen gefolgt vom Ressourcennamen oder der ID eines eingebetteten Skripts angegeben werden. Bei kompilierten Skripten (also wenn ein eingebettetes Skript mit der ID #1 existiert) muss diesem Parameter die Befehlszeilenoption /script
vorangestellt werden.
Skript-Parameter: Eine oder mehrere Zeichenketten, die an das Skript übergeben werden sollen, jeweils durch mindestens ein Leerzeichen voneinander getrennt. Jeder Parameter, der Leerzeichen enthält, muss in Anführungszeichen gesetzt werden. Wenn Sie eine leere Zeichenkette als Parameter übergeben wollen, geben Sie zwei aufeinanderfolgende Anführungszeichen an. Um ein direkt geschriebenes Anführungszeichen zu übergeben, muss ein umgekehrter Schrägstrich davorgesetzt werden (\"). Daraus folgt, dass jeder Schrägstrich am Ende innerhalb eines in Anführungszeichen gesetzten Parameters (z. B. "C:\Meine Dokumente\") als direkt geschriebenes Anführungszeichen behandelt wird (das heißt, dass das Skript die Zeichenkette C:\Meine Dokumente" als Parameter erkennt). Mit StringReplace, 1, 1, ",, All
können solche Anführungszeichen entfernt werden.
[v1.1.27+]: Eingehende Parameter, sofern vorhanden, werden als Array in die interne Variable A_Args gespeichert, und können mithilfe der Array-Syntax abgerufen werden. A_Args[1]
enthält den ersten Parameter. Das folgende Beispiel zeigt, wie das Skript beendet werden kann, wenn zu wenig Parameter übergeben wurden:
if A_Args.Length() < 3 { MsgBox % "Das Skript benötigt mindestens 3 eingehende Parameter, aber es sind nur " A_Args.Length() " angekommen." ExitApp }
Wenn die Anzahl der Parameter variiert, die an das Skript übergeben werden sollen (z. B. wenn der Benutzer mit dem Mauszeiger mehrere Dateien auf ein Skript zieht und ablegt), kann das folgende Beispiel verwendet werden, um sie einzeln zu extrahieren:
for n, param in A_Args ; Für jeden Parameter: { MsgBox Parameter Nr. %n% ist %param%. }
Wenn die Parameter Dateinamen sind, kann das folgende Beispiel verwendet werden, um sie in lange Namen mit korrekter Groß-/Kleinschreibung (wie im Dateisystem gespeichert) und vollständigem/absolutem Pfad umzuwandeln:
for n, EingabePfad in A_Args ; Für jeden Parameter (oder für jede auf ein Skript gezogene Datei): { Loop Files, %EingabePfad%, FD ; Dateien und Verzeichnisse einbeziehen. LangerPfad := A_LoopFileFullPath MsgBox Der lange Pfadname mit korrekter Groß-/Kleinschreibung der Datei`n%EingabePfad%`nist:`n%LangerPfad% }
Bekannte Einschränkung: Das Ziehen und Ablegen von Dateien auf eine .ahk-Datei kann fehlschlagen, wenn 8.3-Namen (Kurznamen) in einem NTFS-Dateisystem deaktiviert worden sind. Eine Möglichkeit zur Umgehung des Problems ist es, das Skript zu kompilieren und die Dateien dann auf die resultierende EXE-Datei zu ziehen.
Altmodisch: Die Befehlszeilenparameter sind auch in den Variablen %1%, %2% und so weiter enthalten, wie in den Versionen vor [v1.1.27]. Darüber hinaus enthält %0% die Anzahl der Parameter, die übergeben worden sind (0, wenn keine). Allerdings können diese Variablen nicht direkt in einem Ausdruck verwiesen werden, weil sie dort als Zahlen statt als Variablen interpretiert werden. Das folgende Beispiel zeigt, wie das Skript beendet werden kann, wenn zu wenig Parameter übergeben wurden:
if 0 < 3 ; Die linke Seite einer if-Anweisung ohne Ausdruck ist immer der Name einer Variable. { MsgBox Das Skript benötigt mindestens 3 eingehende Parameter`, aber es sind nur %0% angekommen. ExitApp }
Wenn die Anzahl der Parameter variiert, die an das Skript übergeben werden sollen (z. B. wenn der Benutzer mit dem Mauszeiger mehrere Dateien auf ein Skript zieht und ablegt), kann das folgende Beispiel verwendet werden, um sie einzeln zu extrahieren:
Loop, %0% ; Für jeden Parameter: { param := %A_Index% ; Ruft den Inhalt der Variable ab, deren Name in A_Index enthalten ist. MsgBox, 4,, Parameternummer %A_Index% ist %param%. Weiter? IfMsgBox, No break }
Wenn die Parameter Dateinamen sind, kann das folgende Beispiel verwendet werden, um sie in lange Namen mit korrekter Groß-/Kleinschreibung (wie im Dateisystem gespeichert) und vollständigem/absolutem Pfad umzuwandeln:
Loop %0% ; Für jeden Parameter (oder für jede auf ein Skript gezogene Datei): { EingabePfad := %A_Index% ; Ruft den Inhalt der Variable ab, deren Name in A_Index enthalten ist. Loop %EingabePfad%, 1 LangerPfad := A_LoopFileLongPath MsgBox Der lange Pfadname mit korrekter Groß-/Kleinschreibung der Datei`n%EingabePfad%`nist:`n%LangerPfad% }
Damit ASCII-fremde Zeichen korrekt aus der Datei gelesen werden können, muss die Codierung, die beim Speichern der Datei verwendet wurde (meistens via Texteditor), mit der Codierung übereinstimmen, die AutoHotkey beim Lesen der Datei verwendet. Wenn sie nicht übereinstimmen, werden Zeichen falsch dekodiert. AutoHotkey entscheidet anhand folgender Regeln, welche Codierung verwendet werden soll:
Hinweis: Die Option "Default to UTF-8" im Installer von AutoHotkey [v1.1.33+] fügt /CP65001
zu den Befehlszeilen aller Skripte hinzu, die über die Shell (Explorer) gestartet werden.
Beachten Sie, dass die oben genannten Punkte nur für Skript-Dateien gelten, die AutoHotkey geladen hat, nicht für die Dateibearbeitung im Skript selbst. FileEncoding steuert die Standardcodierung von Dateien, die das Skript liest oder schreibt, während IniRead und IniWrite immer auf Basis von UTF-16 oder ANSI arbeiten.
Da der gesamte Text (wo nötig) in das native Zeichenkettenformat konvertiert wird, werden Zeichen, die im nativen Zeichensatz ungültig oder nicht vorhanden sind, durch einen Platzhalter ersetzt: ANSI '?' oder Unicode '�'. In Unicode-Builds passiert das nur, wenn in der Skript-Datei Codierungsfehler auftreten oder wenn der Zeichensatz, der zum Speichern oder Laden der Datei verwendet wird, nicht übereinstimmt.
RegWrite kann verwendet werden, um die Standardcodierung für Skripte festzulegen, die vom Explorer aus gestartet werden (z. B. per Doppelklick einer Datei):
; Heben Sie die Kommentierung der entsprechenden Zeile auf oder lassen Sie sie alle kommentiert, ; um den Standard des aktuellen Builds wiederherzustellen. Je nach Bedarf anpassen: ; Zeichensatz := 0 ; Standard-ANSI-Zeichensatz des Systems ; Zeichensatz := 65001 ; UTF-8 ; Zeichensatz := 1200 ; UTF-16 ; Zeichensatz := 1252 ; ANSI-Latin-1; Westeuropäisch (Windows) if (Zeichensatz != "") Zeichensatz := " /CP" . Zeichensatz Befehl="%A_AhkPath%"%Zeichensatz% "`%1" `%* Schlüssel=AutoHotkeyScript\Shell\Open\Command if A_IsAdmin ; Für alle Benutzer setzen. RegWrite, REG_SZ, HKCR, %Schlüssel%,, %Befehl% else ; Nur für den aktuellen Benutzer setzen. RegWrite, REG_SZ, HKCU, Software\Classes\%Schlüssel%,, %Befehl%
Das setzt natürlich voraus, dass AutoHotkey bereits installiert ist. Ansonsten wäre das Ergebnis alles andere als zufriedenstellend.
Befehle wie ListVars und Pause können Ihnen dabei helfen, ein Skript zu debuggen (Fehler zu finden und zu beseitigen). Wenn Sie zum Beispiel die folgenden beiden Zeilen an sorgfältig ausgewählten Positionen einfügen, können im Skript sogenannte "Haltepunkte" erstellt werden:
ListVars Pause
Sobald das Skript diese zwei Zeilen erreicht, zeigt es den aktuellen Inhalt aller Variablen an, die überprüft werden sollen. Wenn Sie bereit sind fortzufahren, kann die Pause via Datei- oder Tray-Menü aufgehoben werden. Das Skript wird dann bis zum nächsten "Haltepunkt" (falls vorhanden) fortgesetzt.
Generell empfiehlt es sich, diese "Haltepunkte" an Stellen einzufügen, wo das aktive Fenster für das Skript irrelevant ist, wie z. B. unmittelbar vor einem WinActivate-Befehl. Auf diese Weise kann das Skript wieder ordnungsgemäß fortgesetzt werden, sobald die Pause aufgehoben wird.
Die folgenden Befehle sind auch für das Debuggen geeignet: ListLines, KeyHistory und OutputDebug.
Häufig auftretende Fehler wie Tippfehler und fehlende "globale" Deklarationen können durch das Einschalten von Warnungen erkannt werden.
Interaktives Debuggen ist mit einem unterstützten DBGp-Client möglich. Üblicherweise sind folgende Aktionen möglich:
Beachten Sie, dass diese Funktionalität für kompilierte Skripte, die auf einer BIN-Datei basieren, deaktiviert ist. Für kompilierte Skripte, die auf einer EXE-Datei basieren, muss /debug nach /script angegeben werden.
Um interaktives Debuggen zu aktivieren, starten Sie zunächst einen unterstützten Debugger-Client und starten Sie danach das Skript mit der /Debug-Befehlszeilenoption.
AutoHotkey.exe /Debug=SERVER:PORT ...
SERVER und PORT können weggelassen werden. Zum Beispiel sind die folgenden Zeilen funktionsgemäß identisch:
AutoHotkey /Debug "MeinSkript.ahk" AutoHotkey /Debug=localhost:9000 "MeinSkript.ahk"
[AHK_L 59+]: Um den Debugger nachträglich mit einem Skript zu verbinden, senden Sie ihm wie folgt eine Meldung:
SkriptPfad := "" ; SETZEN SIE HIER DEN VOLLSTÄNDIGEN PFAD DES SKRIPTS EIN DetectHiddenWindows On if WinExist(SkriptPfad " ahk_class AutoHotkey") ; Optionale Parameter: ; wParam = IPv4-Adresse des Debugger-Clients als 32-Bit-Integer. ; lParam = Port, der vom Debugger-Client abgehört werden soll. PostMessage DllCall("RegisterWindowMessage", "str", "AHK_ATTACH_DEBUGGER")
Sobald eine Verbindung zum Debugger-Client aufgebaut ist, kann sie durch das Senden des DBGp-Befehls "detach" getrennt werden, ohne das Skript zu terminieren.
Auf dieser Seite kann man einige nützliche Skripte finden.