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 Befehle beim Start der Reihe nach von oben nach unten aus.

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 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.

Der Anfang des Skripts (automatischer Ausführungsbereich)

Nachdem das Skript geladen wurde, beginnt die Ausführung bei der obersten Zeile, bis ein Return, Exit, das erste Hotkey-/Hotstring-Label oder das physische Ende des Skripts erreicht wird (je nachdem, was zuerst kommt). Dieser oberste Bereich des Skripts wird auch als automatischer Ausführungsbereich bezeichnet, ist aber eigentlich nur eine Subroutine, die nach dem Programmstart aufgerufen wird.

Hinweis: Während das erste Hotkey/Hotstring-Label des Skripts denselben Effekt wie Return hat, haben andere Hotkeys und Labels diesen nicht.

Wenn das Skript nicht persistent ist, wird es nach Abschluss des automatischen Ausführungsbereichs terminiert. Andernfalls läuft das Skript im Leerlauf weiter und reagiert auf Ereignisse wie Hotkeys, Hotstrings, GUI-Ereignisse, benutzerdefinierte Menüpunkte und Timer. Ein Skript ist automatisch persistent, wenn es Hotkeys, Hotstrings, OnMessage() oder GUI enthält, sowie in einigen anderen Fällen. Mit der #Persistent-Direktive kann das Skript explizit persistent gemacht werden.

Jeder Thread, der per Hotkey, Hotstring, Menüpunkt, GUI-Ereignis oder Timer gestartet wird, 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.

Wenn der automatische Ausführungsbereich sehr lange dauert (oder nie sein Ende erreicht), werden die Standardwerte für die obigen Einstellungen automatisch nach 100 Millisekunden wirksam. Wenn der automatische Ausführungsbereich schließlich sein 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 auch, dass jeder Thread seine eigene Sammlung der obigen Einstellungen hat. Das bedeutet, dass Einstellungen, die in einem Thread geändert werden, keinen Einfluss auf die Einstellungen in anderen Threads haben.

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.

Methode #1: Eine Zeile, die mit "and", "or", ||, &&, einem Komma oder einem Punkt beginnt, wird automatisch mit der darüber liegenden Zeile zusammengeführt (in [v1.0.46+] gilt dies auch für alle anderen Ausdrucksoperatoren außer ++ und --). 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)

Obwohl die Einrückungen in den obigen Beispielen optional sind, können sie die Lesbarkeit verbessern, da sie die Zusammengehörigkeit der Zeilen verdeutlichen. Außerdem ist es nicht notwendig, zusätzliche Leerzeichen für Zeilen einzufügen, die mit den Wörtern "AND" und "OR" beginnen; das Programm tut dies automatisch. In den obigen Beispielen 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. Obwohl diese Methode besonders für automatisch-ersetzende Hotstrings nützlich ist, kann sie auch für jeden anderen Befehl oder Ausdruck verwendet werden. Zum Beispiel:

; BEISPIEL #1:
Var =
(
Eine Textzeile.
Standardmäßig wird der Zeilenumbruch (Enter) zwischen der vorherigen und dieser Zeile als LF-Zeichen (`n) gespeichert.
    Standardmäßig werden auch die Leerzeichen links von dieser Zeile gespeichert (dasselbe gilt 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 Variablen stattdessen wie folgt an:" Var "
)"

; BEISPIEL #3:
FileAppend,  ; Das Komma ist in diesem Fall erforderlich.
(
Zeile 1 des Textes.
Zeile 2 des Textes. Standardmäßig ist ein LF-Zeichen (`n) zwischen den Zeilen.
), C:\Meine Datei.txt

In den obigen Beispielen sind mehrere Zeilen in runde Klammern eingeschlossen. Dies nennt sich Fortsetzungsbereich. Beachten Sie, dass die unterste Zeile den letzten Parameter von FileAppend hinter der runden Endklammer enthält. Diese Schreibweise ist optional; sie wird in Fällen wie diesem angewandt, damit das Komma als Parametertrennung gesehen wird, nicht als direkt geschriebenes Komma.

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 (`s gibt ein direkt geschriebenes Leerzeichen an - eine spezielle Escapesequenz, die nur von dieser Option erkannt 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.

Bekannte Einschränkung: Wenn das letzte Zeichen von Zkette ein Doppelpunkt ist, darf Join nicht die letzte Option in der Zeile sein. Zum Beispiel wird (Join: als Label "(Join" behandelt und (LTrim Join: nicht unterstützt, während (Join: C völlig in Ordnung ist.

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. Die #LTrim-Direktive ist positionsabhängig, d.h. sie beeinflusst nur Fortsetzungsbereiche, die sich physisch darunter befinden. Die Einstellung kann mit #LTrim Off ausgeschaltet werden.

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

Comments (oder Comment oder Com oder C) [v1.0.45.03+]: 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.

% (Prozentzeichen): Behandelt Prozentzeichen als direkt geschriebenen Text, nicht als Variablenreferenzen. Dadurch entfällt die Notwendigkeit, jedes Prozentzeichen mit einem Escapezeichen zu versehen, um es als direkt geschriebenen Text zu behandeln. Diese Option kann weggelassen werden, wenn der Fortsetzungsbereich an Stellen verwendet wird, wo Prozentzeichen bereits als direkt geschriebener Text behandelt werden, wie z.B. bei automatisch-ersetzenden Hotstrings.

, (Komma): Behandelt Kommas als Trennzeichen, nicht als direkt geschriebenen Text. Diese selten verwendete Option wird nur für die Kommas zwischen den Befehlsparametern benötigt, da in Funktionsaufrufen die Art des Kommas keine Rolle spielt. Außerdem werden mit dieser Option nur Kommas transformiert, die tatsächlich Parameter trennen. Mit anderen Worten: Sobald der letzte Parameter des Befehls erreicht ist (oder wenn keine Parameter vorhanden sind), werden nachfolgende Kommas als direkt geschriebener Text behandelt, unabhängig von dieser Option.

` (Akzent/umgekehrtes Häkchen): Behandelt jedes umgekehrte Häkchen als direkt geschriebenen Text, nicht als Escapezeichen. Dies verhindert auch, dass Kommas und Prozentzeichen explizit und einzeln mit einem Escapezeichen versehen werden können oder dass explizit angegebene Escapesequenzen wie `r und `t übersetzt werden.

) [v1.1.01+]: Eine runde Endklammer in den Optionen des Fortsetzungsbereichs (außer als Parameter der Join-Option) bewirkt, dass die Zeile als Ausdruck neu interpretiert wird, nicht als Beginn eines Fortsetzungsbereichs. 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 (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.

Ein Fortsetzungsbereich kann keine Zeilen erzeugen, die länger als 16383 Zeichen sind (das Programm warnt Sie bei dem Versuch). Eine Möglichkeit, dies zu umgehen, besteht darin, mehrere Fortsetzungsbereiche via Verkettung zu einer Variable zusammenzufassen. Zum Beispiel:

Var := "
(
...
)"
Var .= "`n  ; Mehr Text zur Variable via anderen Fortsetzungsbereich hinzufügen.
(
...
)"
FileAppend, %Var%, C:\Meine Datei.txt

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: `).

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.

Ein Skript in eine EXE-Datei umwandeln (Ahk2Exe)

Im Lieferumfang des Programms ist ein Skriptcompiler enthalten (von fincs bereitgestellt und von TAC109 um Features erweitert).

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. [v1.1.33+]: 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.

[v1.1.34+]: 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

[v1.1.33+]: 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 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 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

In [v1.1.33.10+] 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?
/f oder /force Skript bedingungslos starten und Warndialogfenster überspringen. Diese Option hat denselben Effekt wie #SingleInstance Off. Ja
/r oder /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 vom Reload-Befehl 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. Diese Option kann mit /iLib kombiniert werden, um die Gültigkeit des Skripts zu prüfen, ohne es auszuführen.

[v1.1.33+]: 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.

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 die Standardcodepage, mit der die Skriptdateien gelesen werden. Weitere Informationen finden Sie unter Skriptdateicodepage.

[v1.1.33+]: Wenn "Default to UTF-8" im Installer aktiviert ist, wird der Dateityp ".ahk" mit einer Befehlszeile registriert, die /CP65001 enthält. Dies hat zur Folge, dass alle Skripte, die über die Shell (Explorer) gestartet werden, standardmäßig UTF-8 verwenden, wenn keine UTF-16-Byte-Order-Markierung vorhanden ist. Skripte, die direkt über AutoHotkey.exe gestartet werden, verwenden weiterhin standardmäßig CP0, da der Parameter /CP65001 fehlt.

Nein
/iLib "AusgabeDatei"

[v1.0.47+]: AutoHotkey lädt das Skript, ohne es auszuführen. Für jedes Skript, das mit dem Bibliotheksmechanismus automatisch inkludiert wurde, werden zwei Zeilen in AusgabeDatei geschrieben. Diese Zeilen werden im folgenden Format geschrieben, wobei BiblVerz der vollständige Pfad des Bibliotheksordners und BiblDatei der Dateiname der Bibliothek ist:

#Include BiblVerz\
#IncludeAgain BiblVerz\BiblDatei.ahk

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"

[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 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 (z.B. wenn AutoHotkey direkt über das Startmenü gestartet wird), sucht das Programm nach einer Skriptdatei namens AutoHotkey.ahk an folgenden Orten (in dieser Reihenfolge):

Der Dateiname AutoHotkey.ahk hängt vom Namen der EXE-Datei ab, mit der das Skript gestartet wurde. Wenn Sie z.B. AutoHotkey.exe in MeinSkript.exe umbenennen, wird das Programm versuchen, MeinSkript.ahk zu finden. Wenn Sie AutoHotkeyU32.exe ohne Parameter starten, sucht das Programm nach AutoHotkeyU32.ahk.

Hinweis: In den Versionen vor Revision 51 wurde im Arbeitsverzeichnis nach AutoHotkey.ini oder im Ordner "Dokumente" nach AutoHotkey.ahk gesucht.

[v1.1.17+]: Geben Sie ein Sternchen (*) als Dateinamen an, um den Text des Skripts aus der Standardeingabe (stdin) zu lesen. Siehe das Beispiel SkriptAusführen().

[v1.1.34+]: 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 StringReplace, 1, 1, ",, All können solche Anführungszeichen entfernt werden.

[v1.1.27+]: 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%
}

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 sind. Um das zu umgehen, können Sie z.B. das Skript kompilieren und dann die Dateien auf die resultierende EXE-Datei ziehen.

Legacy: Die Befehlszeilenparameter sind auch in den Variablen %1%, %2% usw. enthalten, wie in den Versionen vor [v1.1.27]. Zusätzlich enthält %0% die Anzahl der übergebenen Parameter (andernfalls 0). Allerdings können diese Variablen nicht direkt in einem Ausdruck referenziert werden, da sie dort als Zahlen und nicht als Variablen interpretiert werden. Das folgende Beispiel beendet das Skript, wenn zu wenig Parameter übergeben wurden:

if 0 < 3  ; Die linke Seite einer Nicht-Ausdrucks-If-Anweisung ist immer der Name einer Variable.
{
    MsgBox Das Skript benötigt mindestens 3 Parameter`, hat aber nur %0% 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:

Loop, %0%  ; Für jeden Parameter:
{
    param := %A_Index%  ; Den Inhalt der Variable abrufen, deren Name in A_Index enthalten ist.
    MsgBox, 4,, Parameter Nr. %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%  ; Den Inhalt der Variable abrufen, 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%
}

Skriptdateicodepage [AHK_L 51+]

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: ANSI '?' oder Unicode '�'. In Unicode-Builds geschieht dies 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="%A_AhkPath%"%Codepage% "`%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%

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

Ein Skript debuggen

Befehle wie ListVars und Pause können Ihnen dabei helfen, ein Skript zu debuggen (Fehler zu finden und zu beheben). 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 einem WinActivate-Befehl. Auf diese Weise kann das Skript seine Ausführung ordnungsgemäß fortsetzen, sobald Sie es entpausieren.

Die folgenden Befehle 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 [AHK_L 11+]

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"

[AHK_L 59+]: 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
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 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.