Skripte

Verwandte Themen:

Inhaltsverzeichnis

Einführung

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 nur aus diesen bestehen. Ohne Hotkeys und Hotstrings führt ein Skript jedoch seine Funktionen beim Start der Reihe nach von oben nach unten aus.

Das Programm lädt das Skript zeilenweise in den Speicher. Während des Ladevorgangs wird das Skript optimiert und auf seine Gültigkeit überprüft. Stößt das Programm auf einen Syntaxfehler, wird dieser angezeigt. Solche Fehler müssen korrigiert werden, bevor das Skript ausgeführt werden kann.

Startphase des Skripts (der Auto-Execute-Thread)

Nach dem Laden des Skripts beginnt der Auto-Execute-Thread mit der Ausführung der obersten Zeile des Skripts, bis er z.B. durch Return, ExitApp oder Exit zum Stoppen gebracht wird. Das physische Ende des Skripts fungiert ebenfalls als Exit.

Das Skript wird nach Abschluss der Startphase automatisch terminiert, wenn es keine Hotkeys, Hotstrings, sichtbare GUIs, aktive Timer, Überwachungen der Zwischenablage und InputHooks hat und die Persistent-Funktion nicht aufgerufen hat. Andernfalls läuft das Skript im Leerlauf weiter und reagiert auf Ereignisse wie Hotkeys, Hotstrings, GUI-Ereignisse, benutzerdefinierte Menüpunkte und Timer. Ändern sich diese Bedingungen nach Abschluss der Startphase des Skripts (z.B. beim Deaktivieren des letzten Timers), könnte sich das Skript beenden, sobald der letzte laufende Thread endet oder das letzte GUI-Fenster geschlossen wird.

Jedes Mal, wenn ein neuer Thread gestartet wird (sei es durch einen Hotkey, einen Hotstring, einen Timer oder ein anderes Ereignis), werden die folgenden Einstellungen vom Auto-Execute-Thread übernommen. Wenn diese nicht via Auto-Execute-Thread gesetzt sind, werden die vordefinierten Standardwerte verwendet (welche das sind, finden Sie auf den folgenden Seiten): CoordMode, Critical, DetectHiddenText, DetectHiddenWindows, FileEncoding, ListLines, SendLevel, SendMode, SetControlDelay, SetDefaultMouseSpeed, SetKeyDelay, SetMouseDelay, SetRegView, SetStoreCapsLockMode, SetTitleMatchMode, SetWinDelay, und Thread.

Jeder Thread hat seine eigene Sammlung der obigen Einstellungen, folglich wirken sich Änderungen an diesen Einstellungen nicht auf andere Threads aus.

Die "Standardeinstellung" für eine der oben genannten Funktionen bezieht sich in der Regel auf die aktuelle Einstellung des Auto-Execute-Threads, die zunächst mit der programmdefinierten Standardeinstellung übereinstimmt.

Traditionell wird der Anfang des Skripts als automatischer Ausführungsbereich bezeichnet. Der Auto-Execute-Thread ist jedoch nicht nur auf den Anfang des Skripts beschränkt. Alle im Auto-Execute-Thread aufgerufenen Funktionen können die Standardeinstellungen beeinflussen. Da Direktiven und Funktions-, Hotkey-, Hotstring- und Klassendefinitionen während der Ausführung übersprungen werden, ist es möglich, den Startcode überall in einer Datei zu platzieren. Zum Beispiel kann eine globale Variable für eine Gruppe von Hotkeys direkt über (oder sogar unter) diesen Hotkeys initialisiert werden, anstatt am Anfang des Skripts.

Eine lange Zeile in mehrere kurze Zeilen aufteilen

Lange Zeilen können in mehrere kurze Zeilen aufgeteilt werden, um die Lesbarkeit und Wartbarkeit des Skripts zu verbessern. Dies hat keinen negativen Einfluss auf die Ausführungsgeschwindigkeit des Skripts, da solche Zeilen bereits beim Start des Skripts im Speicher zusammengeführt werden.

Es gibt drei Methoden, die grundsätzlich zusammen verwendet werden können:

Fortsetzungsoperator: Eine Zeile, die mit einem Komma oder einem anderen Ausdrucksoperator (außer ++ und --) beginnt, wird automatisch mit der Zeile direkt darüber zusammengeführt. Ebenso wird eine Zeile, die mit einem Ausdrucksoperator endet, automatisch mit der Zeile darunter zusammengeführt. Im folgenden Beispiel wird die zweite Zeile an die erste angefügt, da sie mit einem Komma beginnt:

FileAppend "Das ist der Text, der angefügt wird.`n"   ; Kommentar hier möglich.
    , A_ProgramFiles "\BeliebigeApp\Log-Datei.txt"  ; Kommentar.

Ebenso werden die Zeilen im nächsten Beispiel zu einer einzelnen Zeile zusammengeführt, da die letzten beiden 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 ebenfalls ein guter Kandidat:

ProduktIstVerfügbar := (Farbe = "Rot")
    ? false  ; Rote Produkte sind nicht verfügbar, daher ist der folgende Funktionsaufruf irrelevant.
    : ProduktIstInFarbeVerfügbar(Produkt, Farbe)

Die folgenden Beispiele sind äquivalent zu den obigen:

FileAppend "Das ist der Text, der angefügt wird.`n",   ; Kommentar hier möglich.
    A_ProgramFiles "\BeliebigeApp\Log-Datei.txt"  ; Kommentar.

if Farbe = "Rot" or Farbe = "Grün" or Farbe = "Blau" or   ; Kommentar.
    Farbe = "Schwarz" or Farbe = "Grau" or Farbe = "Weiß") and   ; Kommentar.
    ProduktIstInFarbeVerfügbar(Produkt, Farbe)   ; Kommentar.

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 obigen Beispielen optional sind, können sie die Lesbarkeit verbessern, da sie die Zusammengehörigkeit der Zeilen verdeutlichen. In den obigen Beispielen können leere Zeilen oder Kommentare zwischen oder am Ende jeder Zeile eingefügt werden.

Ein Fortsetzungsoperator kann nicht mit einem automatisch-ersetzenden Hotstring oder einer Direktive außer #HotIf verwendet werden.

Fortsetzung durch Umschließen: Enthält eine Zeile einen Ausdruck oder eine Funktions-/Eigenschaftsdefinition mit einem ungeschlossenen (/[/{, wird sie mit nachfolgenden Zeilen verbunden, bis die Anzahl der Start- und Endklammern ausgeglichen ist. Mit anderen Worten, ein Teilausdruck, der mit runden, eckigen oder geschweiften Klammern umschlossen ist, kann in den meisten Fällen automatisch mehrere Zeilen umspannen. Zum Beispiel:

meinArray := [
  "Element 1",
  "Element 2",
]
MsgBox(
    "Der Wert von Element 2 ist " meinArray[2],
    "Titel",
    "ok iconi"
    )

Fortsetzungsausdrücke können beide Arten von Kommentaren enthalten.

Fortsetzungsausdrücke können normale Fortsetzungsbereiche enthalten. Wenn also eine Zeile mit einer escapezeichenlosen runden Startklammer (() beginnt, wird dies als Beginn eines Fortsetzungsbereichs interpretiert, es sei denn, es folgt in derselben Zeile eine runde Endklammer ()).

In Anführungszeichen gesetzte Zeichenketten können sich nicht über mehrere Zeilen erstrecken, wenn nur diese Methode verwendet wird. Siehe jedoch oben.

Fortsetzung durch Umschließen kann mit einem Fortsetzungsoperator kombiniert werden. Zum Beispiel:

meinArray :=  ; Der Zuweisungsoperator bewirkt eine Fortsetzung.
[  ; Eckige Klammern umschließen die folgenden zwei Zeilen.
  "Element 1",
  "Element 2",
]

Eine geschweifte Klammer ({) am Ende einer Zeile bewirkt keine Fortsetzung, wenn das Programm entschieden hat, dass sie als Beginn eines Blocks (OTB-Style) und nicht als Beginn eines direkt geschriebenen Objekts interpretiert werden soll. Konkret heißt das (in absteigender Priorität):

Eine geschweifte Klammer kann problemlos für eine Zeilenfortsetzung bei Funktionsaufrufen, Ausdrücken oder Kontrollanweisungen verwendet werden, die keinen Körper benötigen. Zum Beispiel:

meineFn() {
    return {
        key: "wert"
    }
}

Fortsetzungsbereich: Diese Methode sollte verwendet werden, wenn sehr viele Zeilen zusammengeführt werden müssen oder wenn die Zeilen nicht für die anderen Methoden geeignet sind. Obwohl diese Methode besonders für automatisch-ersetzende Hotstrings nützlich ist, kann sie auch für einen Ausdruck verwendet werden. Zum Beispiel:

; BEISPIEL #1:
Var := "
(
Eine Textzeile.
Standardmäßig wird der Zeilenumbruch (Enter) zwischen der vorherigen und dieser Zeile gespeichert.
	Diese Zeile ist mit einem Tabulatorzeichen eingerückt; standardmäßig wird es auch gespeichert.
Zusätzlich werden "Anführungszeichen" ggf. automatisch mit einem Escapezeichen versehen.
)"

; BEISPIEL #2:
FileAppend "
(
Zeile 1 des Textes.
Zeile 2 des Textes. Standardmäßig ist ein LF-Zeichen (`n) zwischen den Zeilen.
)", A_Desktop "\Meine Datei.txt"

In den obigen Beispielen sind mehrere Zeilen in runde Klammern eingeschlossen. Dies nennt sich Fortsetzungsbereich. Beachten Sie, dass jeglicher Code nach der runden Endklammer auch mit den anderen Zeilen verbunden wird (ohne Separator), allerdings sind die Start- und Endklammern nicht enthalten.

Wenn die Zeile über dem Fortsetzungsbereich mit einem Namenszeichen endet und der Bereich nicht innerhalb eines Anführungszeichens beginnt, wird automatisch ein einzelnes Leerzeichen eingefügt, um den Namen vom Inhalt des Fortsetzungsbereichs zu trennen.

Anführungszeichen werden automatisch mit einem Escapezeichen versehen (also als direkt geschriebene Zeichen interpretiert), wenn der Fortsetzungsbereich innerhalb einer in Anführungszeichen gesetzten Zeichenkette beginnt, wie in den Beispielen oben. Andernfalls verhalten sich Anführungszeichen wie gewohnt, d.h. Fortsetzungsbereiche können Ausdrücke mit in Anführungszeichen gesetzten Zeichenketten enthalten.

Standardmäßig werden Leer- und Tabulatorzeichen am Anfang weggelassen, abhängig von der Einrückung der ersten Zeile innerhalb des Fortsetzungsbereichs. Wenn die erste Zeile eine Mischung aus Leer- und Tabulatorzeichen enthält, wird nur der erste Zeichentyp als Einrückung behandelt. Wenn eine Zeile weniger eingerückt ist als die erste Zeile oder mit den falschen Zeichen eingerückt ist, bleiben alle Leerraumzeichen am Anfang dieser Zeile erhalten.

Standardmäßig werden Leer- und Tabulatorzeichen am Ende weggelassen.

Das Standardverhalten eines Fortsetzungsbereichs kann überschrieben werden, indem eine oder mehrere der folgenden Optionen rechts von der runden Startklammer eingefügt werden. Mehrere Optionen müssen mit Leerzeichen voneinander getrennt werden. Zum Beispiel: ( LTrim Join|.

JoinZkette: Gibt an, wie die Zeilen verbunden werden sollen. Wenn diese Option nicht verwendet wird, endet jede Zeile außer der letzten mit einem LF-Zeichen (`n). Wenn Zkette weggelassen wird, werden die Zeilen direkt miteinander verbunden, ohne Zeichen dazwischen. Andernfalls geben Sie für Zkette eine Zeichenkette von bis zu 15 Zeichen an. Zum Beispiel bewirkt Join`s, dass nach jeder Zeile außer der letzten ein Leerzeichen eingefügt wird. Weitere Beispiele sind Join`r`n, das ein CR-LF-Paar zwischen den Zeilen einfügt, und Join|, das einen Vertikalstrich zwischen den Zeilen einfügt. Um die letzte Zeile des Fortsetzungsbereichs ebenfalls mit Zkette enden zu lassen, fügen Sie direkt über der runden Endklammer des Bereichs eine Leerzeile ein.

LTrim: Entfernt alle Leer- und Tabulatorzeichen am Anfang jeder Zeile. Dies ist normalerweise wegen des "intelligenten" Standardverhaltens nicht notwendig.

LTrim0 (LTrim und eine 0): Verhindert das automatische Entfernen von Leer- und Tabulatorzeichen am Anfang jeder Zeile.

RTrim0 (RTrim gefolgt von 0): Verhindert das automatische Entfernen von Leer- und Tabulatorzeichen am Ende jeder Zeile.

Comments (oder Comment oder Com oder C): Erlaubt Semikolon-Kommentare innerhalb des Fortsetzungsbereichs (aber nicht /*..*/). Solche Kommentare (sowie links stehende Leer- und Tabulatorzeichen) werden im zusammengefügten Ergebnis entfernt, anstatt als direkt geschriebener Text behandelt zu werden. Jeder Kommentar kann auf der rechten Seite einer Zeile oder auf einer neuen Zeile stehen.

` (Akzent/umgekehrtes Häkchen): Behandelt jedes umgekehrte Häkchen als direkt geschriebenen Text, nicht als Escapezeichen. Dies verhindert auch die Übersetzung von explizit angegebenen Escapesequenzen wie `r und `t.

( oder ): Eine runde Start- oder Endklammer rechts von der ersten runden Startklammer (außer als Parameter der Join-Option) bewirkt, dass die Zeile als Ausdruck neu interpretiert wird, nicht als Beginn eines Fortsetzungsbereichs. Dies erlaubt es, Ausdrücke wie (x.y)[z]() am Anfang einer Zeile zu verwenden und mehrzeilige Ausdrücke mit einer Zeile wie (( oder (MeineFunk( zu beginnen.

Bemerkungen

Escapesequenzen wie `n (LF) und `t (Tabulator) werden innerhalb des Fortsetzungsbereichs unterstützt, es sei denn, die Akzent-Option (`) wird verwendet.

Wenn die Comment-Option fehlt, werden Semikolon- und /*..*/-Kommentare innerhalb eines Fortsetzungsbereichs nicht unterstützt, da diese als direkt geschriebener Text gesehen werden. Allerdings können Kommentare auf der untersten und obersten Zeile des Bereichs eingefügt werden. Zum Beispiel:

FileAppend "   ; Kommentar.
; Kommentar.
( LTrim Join    ; Kommentar.
     ; Dies ist kein Kommentar; es ist direkt geschriebener Text. Fügen Sie das Wort Comments in die Zeile darüber ein, um es zu einem Kommentar zu machen.
)", "C:\Datei.txt"   ; Kommentar.

Infolgedessen müssen Semikolons innerhalb eines Fortsetzungsbereichs nie mit einem Escapezeichen versehen werden.

Da eine runde Endklammer das Ende eines Fortsetzungsbereichs markiert, muss eine direkt geschriebene runde Endklammer am Zeilenanfang mit einem Escapezeichen (Akzent/umgekehrtes Häkchen) versehen werden: `). Dies kann jedoch nicht mit der Akzent-Option (`) kombiniert werden.

Unmittelbar nach einem Fortsetzungsbereich kann eine Zeile angegeben werden, die die runde Startklammer eines weiteren Fortsetzungsbereichs enthält. Auf diese Weise können verschiedene Optionen beim Zusammenbau einer einzelnen Zeile angewendet werden.

Die stückweise Konstruktion eines Fortsetzungsbereichs via #Include wird nicht unterstützt.

Skriptbibliotheksordner

Bibliotheksordner sind vordefinierte Orte für gemeinsam genutzte Skripte, die andere Skripte mittels #Include verwenden können. Ein Bibliotheksskript enthält typischerweise eine Funktion oder Klasse, die zur Verwendung und Wiederverwendung vorgesehen ist. Das Platzieren von Bibliotheksskripten an einen dieser Orte erleichtert das Schreiben von Skripten, die mit anderen geteilt werden und über mehrere Konfigurationen hinweg funktionieren können. Die Orte für Bibliotheken sind:

A_ScriptDir "\Lib\"  ; Lokale Bibliothek.
A_MyDocuments "\AutoHotkey\Lib\"  ; Benutzerbibliothek.
"Verzeichnis-der-aktuell-laufenden-AutoHotkey.exe\Lib\"  ; Standardbibliothek.

Die Bibliotheksordner werden in der oben gezeigten Reihenfolge durchsucht.

Wenn ein Skript beispielsweise die Zeile #Include <MeineBibl> enthält, sucht das Programm in der lokalen Bibliothek nach einer Datei mit dem Namen "MeineBibl.ahk". Wenn sie dort nicht ist, wird die Benutzerbibliothek und dann die Standardbibliothek durchsucht. Wenn sie auch dort nicht gefunden wird und enthält der Bibliotheksname einen Unterstrich (z.B. MeinPräfix_MeineFunk), wiederholt das Programm die Suche mit nur dem Präfix (z.B. MeinPräfix.ahk).

Obwohl eine Bibliotheksdatei konventionsgemäß in der Regel nur eine einzelne Funktion oder Klasse mit demselben Namen wie die Datei enthält, kann sie auch private Funktionen enthalten, die nur von ihr aufgerufen werden. Allerdings sollten solche Funktionen eindeutige Namen haben, da sie sich im globalen Namensraum befinden, d.h. sie können von überall im Skript aufgerufen werden.

Ein Skript in eine EXE-Datei umwandeln (Ahk2Exe)

Es gibt einen Skriptcompiler (von fincs bereitgestellt und von TAC109 um Features erweitert) als separaten automatischen Download.

Ein kompiliertes Skript ist eine eigenständige EXE-Datei, d.h. das Skript kann ohne AutoHotkey.exe gestartet werden. Der Kompiliervorgang erstellt eine EXE-Datei und fügt ihr Folgendes hinzu: Den AutoHotkey-Interpreter, das Skript, alle zu inkludierenden Dateien und alle via FileInstall zu integrierenden Dateien. Zusätzliche Dateien können mittels Compilerdirektiven inkludiert werden.

Für v1.1- und v2-Skripte wird derselbe Compiler verwendet. Der Compiler unterscheidet Skriptversionen durch Überprüfung der Hauptversion der bereitgestellten Basisdatei.

Compilerthemen

Compiler ausführen

Ahk2Exe kann auf folgende Arten verwendet werden:

Hinweise:

Den Quellcode sowie neuere Versionen des Compilers finden Sie auf GitHub.

Ausführbare Basisdatei

Jede EXE-Datei eines kompilierten Skripts basiert auf einer ausführbaren Datei, die den Interpreter implementiert. Die Basisdateien im Compiler-Verzeichnis haben die Endung ".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.

Die Standard-AutoHotkey-EXE-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-Compilerdirektive hinzugefügt werden.) Auf diese Weise kann die EXE-Datei eines kompilierten Skripts zusammen mit der Befehlszeilenoption /script verwendet werden, um ein anderes Skript als das eingebettete Hauptskript auszuführen. Weitere Informationen finden Sie unter Eingebettete Skripte.

Skriptcompilerdirektiven

Skriptcompilerdirektiven ermöglichen es dem Benutzer, genau anzugeben, wie ein Skript kompiliert werden soll. Einige der Features sind:

Weitere Informationen finden Sie unter Skriptcompilerdirektiven.

Kompilierte Skripte komprimieren

Ahk2Exe kann optional MPRESS- oder 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 Informationen): http://www.matcode.com/mpress.htm
MPRESS Mirror: https://www.autohotkey.com/mpress/

UPX - offizielle Webseite (Downloads und Informationen): https://upx.github.io/

Hinweis: Die Komprimierung einer EXE-Datei verhindert, dass der Quellcode des Skripts einfach mit einem Texteditor wie Notepad oder PE-Resource-Editor eingesehen werden kann, aber sie verhindert nicht, dass der Quellcode mit speziell dafür entwickelten Tools extrahiert werden kann.

Hintergrundinformationen

Es wird die folgende Ordnerstruktur unterstützt, wobei sich die standardmäßig verwendete Version von Ahk2Exe.exe im ersten \Compiler-Verzeichnis befindet, wie unten gezeigt:

\AutoHotkey 
   AutoHotkeyA32.exe 
   AutoHotkeyU32.exe
   AutoHotkeyU64.exe
   \Compiler
      Ahk2Exe.exe  ; die standardmäßig verwendete Version 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 Start 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 Elternverzeichnis des Compilers und in allen Geschwisterverzeichnissen des Compilers, deren Namen mit AutoHotkey oder V, aber nicht mit AutoHotkey_H beginnen. Die ausgewählten Verzeichnisse werden rekursiv durchsucht. Alle gefundenen AutoHotkey.exe-Dateien werden 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 außerdem eine Version des AutoHotkey-Interpreters (als Hilfsmittel) benötigt, die nach einem ähnlichen Algorithmus ausgewählt wird. In den meisten Fällen wird die Version des verwendeten Interpreters mit der Version der Basisdatei übereinstimmen, die der Benutzer für die Kompilierung ausgewählt hat.

Befehlszeilenparameter an ein Skript übergeben

Skripte unterstützen Befehlszeilenparameter. Das Format ist:

AutoHotkey.exe [Optionen] [Skriptdateiname] [Skriptparameter]

Für kompilierte Skripte lautet das Format:

KompiliertesSkript.exe [Optionen] [Skriptparameter]

Optionen: Folgende Optionen können angegeben werden:

OptionBedeutungKompiliert?
/force Skript bedingungslos starten und Warndialogfenster überspringen. Diese Option hat denselben Effekt wie #SingleInstance Off. Ja
/restart Gibt an, dass das Skript neu gestartet werden soll und dass eine ältere Instanz des Skripts, wenn möglich, geschlossen werden soll (diese Option wird auch intern von der Reload-Funktion verwendet). Ja
/ErrorStdOut

/ErrorStdOut=Kodierung

Sendet alle Syntaxfehler, die den Start eines Skripts verhindern, an die Standardfehlerausgabe (stderr), anstatt ein Dialogfenster anzuzeigen. Einzelheiten finden Sie unter #ErrorStdOut.

Es kann optional eine Kodierung angegeben werden. Zum Beispiel bewirkt /ErrorStdOut=UTF-8, dass Meldungen als UTF-8 kodiert werden, bevor sie in die Standardfehlerausgabe (stderr) geschrieben werden.

Nein
/Debug Stellt eine Verbindung zu einem Debugger-Client her. Weitere Informationen finden Sie unter Interaktives Debuggen. Nein
/CPn

Überschreibt die Standardcodepage, mit der die Skriptdateien gelesen werden. Weitere Informationen finden Sie unter Skriptdateicodepage.

Nein
/Validate

AutoHotkey lädt das Skript und beendet es dann, bevor es ausgeführt wird.

Standardmäßig werden Ladezeitfehler und Warnungen wie üblich angezeigt. Mit der /ErrorStdOut-Option können alle Fehlermeldungen unterdrückt oder abgefangen werden.

Der Prozess-Exitcode ist 0, wenn das Skript erfolgreich geladen wurde, oder ungleich 0, wenn ein Fehler aufgetreten ist.

Nein
/iLib "AusgabeDatei"

Veraltet: Verwenden Sie stattdessen /validate.

AutoHotkey lädt das Skript, ohne es auszuführen. In früheren Versionen von AutoHotkey wurden Dateinamen von automatisch inkludierten Dateien in die via AusgabeDatei angegebene Datei geschrieben, formatiert als #Include-Direktiven.

Wenn die Ausgabedatei bereits existiert, wird sie überschrieben. AusgabeDatei kann * sein, um die Ausgabe in die Standardausgabe (stdout) zu schreiben.

Wenn das Skript Syntaxfehler enthält, kann die Ausgabedatei leer sein. Der Exitcode des Prozesses kann verwendet werden, um diesen Zustand zu erkennen; im Falle eines Syntaxfehlers ist der Exitcode 2. Mit der /ErrorStdOut-Option kann die Fehlermeldung unterdrückt oder abgefangen werden.

Nein
/include "IncDatei"

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

Wenn diese Option mit einem kompilierten Skript verwendet wird, das auf einer EXE-Datei basiert, bewirkt sie, dass das Programm das eingebettete Hauptskript ignoriert. Dadurch kann die EXE-Datei eines kompilierten Skripts externe Skriptdateien oder eingebettete Skripte anstelle des Hauptskripts ausführen. Andere Optionen, die normalerweise von kompilierten Skripten nicht unterstützt werden, können ebenfalls verwendet werden, müssen aber rechts von dieser Option angegeben werden. Zum Beispiel:

KompiliertesSkript.exe /script /ErrorStdOut MeinSkript.ahk "Skript-Arg 1"

Diese Option kann auch angegeben werden, wenn die aktuelle EXE-Datei kein eingebettetes Skript hat, aber dann ist sie wirkungslos.

Diese Option wird von kompilierten Skripten, die auf einer BIN-Datei basieren, nicht unterstützt.

Siehe auch: Ausführbare Basisdatei (Ahk2Exe)

N/A

Skriptdateiname: Dies kann weggelassen werden, wenn keine Skriptparameter vorhanden sind. Wenn weggelassen, wird standardmäßig der Pfad und Name der AutoHotkey-EXE verwendet, wobei ".exe" mit ".ahk" ersetzt wird. Wenn Sie z.B. AutoHotkey.exe in MeinSkript.exe umbenennen, wird das Programm versuchen, MeinSkript.ahk zu laden. Wenn Sie AutoHotkey32.exe ohne Parameter starten, wird das Programm versuchen, AutoHotkey32.ahk zu laden.

Geben Sie ein Sternchen (*) als Dateinamen an, um den Text des Skripts aus der Standardeingabe (stdin) zu lesen. Dies hat folgende Auswirkungen:

Siehe das Beispiel SkriptAusführen().

Wenn die aktuelle EXE-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.

Skriptparameter: 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, stellen Sie diesem einen umgekehrten Schrägstrich voran (\"). Folglich wird jeder Schrägstrich am Ende in einem in Anführungszeichen gesetzten Parameter (z.B. "C:\Meine Dokumente\") wie ein direkt geschriebenes Anführungszeichen behandelt (d.h. das Skript erkennt die Zeichenkette C:\Meine Dokumente"). Mit A_Args[1] := StrReplace(A_Args[1], '"') können solche Anführungszeichen entfernt werden.

Eingehende Parameter werden, sofern vorhanden, als Array in die interne Variable A_Args gespeichert und können mit der Arraysyntax abgerufen werden. A_Args[1] enthält den ersten Parameter. Das folgende Beispiel beendet das Skript, wenn zu wenig Parameter übergeben wurden:

if A_Args.Length < 3
{
    MsgBox "Das Skript benötigt mindestens 3 Parameter, hat aber nur " A_Args.Length " empfangen."
    ExitApp
}

Wenn die Anzahl der Parameter, die an das Skript übergeben werden, variiert (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
}

Skriptdateicodepage

Damit ASCII-fremde Zeichen korrekt aus einer Datei gelesen werden, muss die Kodierung, die zum Speichern der Datei verwendet wurde (meist via Texteditor), mit der Kodierung übereinstimmen, die AutoHotkey zum Lesen der Datei verwendet. Ist dies nicht der Fall, werden die Zeichen falsch dekodiert. AutoHotkey entscheidet nach folgenden Regeln, welche Kodierung verwendet wird:

Beachten Sie, dass dies nur für Skriptdateien gelten, die von AutoHotkey geladen wurden, nicht für die Datei-Ein-/Ausgabe im Skript selbst. FileEncoding bestimmt die Standardkodierung für Dateien, die vom Skript gelesen oder geschrieben werden, während IniRead und IniWrite immer in UTF-16 oder ANSI arbeiten.

Da der gesamte Text (wo nötig) in das native Zeichenkettenformat umgewandelt wird, werden Zeichen, die ungültig sind oder in der nativen Codepage nicht existieren, mit einem Platzhalter ersetzt: '�'. Dies geschieht nur, wenn Kodierungsfehler in der Skriptdatei auftreten oder wenn die zum Speichern oder Laden der Datei verwendeten Codepages nicht übereinstimmen.

Mit RegWrite kann die Standardkodierung für Skripte festgelegt werden, die aus dem Explorer heraus gestartet werden (z.B. durch Doppelklick auf eine Datei):

; Entkommentieren Sie die entsprechende Zeile unten oder lassen Sie sie alle
; kommentiert, um den Standard des aktuellen Builds wiederherzustellen:
; Codepage := 0        ; Standard-ANSI-Codepage des Systems
; Codepage := 65001    ; UTF-8
; Codepage := 1200     ; UTF-16
; Codepage := 1252     ; ANSI-Latin-1; Westeuropäisch (Windows)
if (Codepage != "")
    Codepage := " /CP" . Codepage
Befehl := Format('"{1}"{2} "%1" %*', A_AhkPath, Codepage)
Schlüssel := "AutoHotkeyScript\Shell\Open\Command"
if A_IsAdmin    ; Für alle Benutzer setzen.
    RegWrite Befehl, "REG_SZ", "HKCR\" Schlüssel
else            ; Nur für den aktuellen Benutzer setzen.
    RegWrite Befehl, "REG_SZ", "HKCU\Software\Classes\" Schlüssel

Dies setzt natürlich voraus, dass AutoHotkey bereits installiert ist. Andernfalls wäre das Ergebnis alles andere als zufriedenstellend.

Ein Skript debuggen

Interne Funktionen wie ListVars und Pause können Ihnen dabei helfen, ein Skript zu debuggen (Fehler zu finden und zu beseitigen). Zum Beispiel erstellen die folgenden zwei Zeilen, wenn sie richtig platziert sind, sogenannte "Haltepunkte":

ListVars
Pause

Sobald das Skript diese zwei Zeilen erreicht, zeigt es den aktuellen Inhalt aller Variablen zur Überprüfung an. Wenn Sie bereit sind fortzufahren, entpausieren Sie das Skript via Datei- oder Tray-Menü. 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 einer WinActivate-Funktion. Auf diese Weise kann das Skript seine Ausführung ordnungsgemäß fortsetzen, sobald Sie es entpausieren.

Die folgenden Funktionen eignen sich ebenfalls zum Debuggen: 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

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 zuerst einen unterstützten Debugger-Client und dann das Skript mit der /Debug-Befehlszeilenoption.

AutoHotkey.exe /Debug[=SERVER:PORT] ...

SERVER und PORT können weggelassen werden. Zum Beispiel sind die folgenden Zeilen funktionsgleich:

AutoHotkey /Debug "MeinSkript.ahk"
AutoHotkey /Debug=localhost:9000 "MeinSkript.ahk"

Um den Debugger nachträglich mit einem Skript zu verbinden, senden Sie ihm eine Meldung wie folgt:

SkriptPfad := "" ; HIER DEN VOLLSTÄNDIGEN PFAD DES SKRIPTS SETZEN
A_DetectHiddenWindows := true
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 der Debugger-Client verbunden ist, kann die Verbindung durch Senden des DBGp-Befehls "detach" getrennt werden, ohne das Skript zu terminieren.

Skriptbeispiele

Auf dieser Seite finden Sie einige nützliche Skripte.