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 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 16.383 Zeichen lang sein. Während des Ladevorgangs wird das Skript optimiert und überprüft, ob es gültig ist. Wenn das Programm auf ein Syntaxfehler stößt, wird er angezeigt. Solche Fehler müssen korrigiert werden, bevor das Skript ausgeführt werden kann.

Der obere Bereich des Skripts (automatischer Ausführungsbereich)

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

Ein Skript, das weder persistent noch Hotkeys, Hotstrings, OnMessage und GUI enthält, wird beendet, sobald es den automatischen Ausführungsbereich durchgeführt hat. 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.

Jeder neue Thread, den ein Hotkey, Hotstring, Menüpunkt, GUI-Ereignis oder Timer gestartet hat, greift auf die im automatischen Ausführungsbereich definierten Standardwerte der folgenden Attribute zurück. Ungesetzte Attribute benutzen ihre eigenen Standardwerte (welche das jeweils sind, finden Sie in den entsprechenden Dokumentationen): DetectHiddenWindows, DetectHiddenText, SetTitleMatchMode, SetBatchLines, SendMode, SetKeyDelay, SetMouseDelay, SetWinDelay, SetControlDelay, SetDefaultMouseSpeed, CoordMode, SetStoreCapsLockMode, AutoTrim, SetFormat, StringCaseSense, Thread, und Critical.

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.

Eine lange Zeile in mehreren kurzen Zeilen aufteilen

Lange Zeilen können in mehreren kurzen Zeilen aufgeteilt werden, um sie besser lesbar und verwaltbar zu machen. 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 =
(
Zeile 1 vom Text.
Zeile 2 vom Text. Standardmäßig befindet sich ein Zeilenumbruchszeichen (`n) zwischen den Zeilen.
)

; BEISPIEL #2:
FileAppend,  ; Das Komma ist in diesem Fall erforderlich.
(
Eine Textzeile.
Standardmäßig wird das CR-Zeichen (Enter) zwischen der vorherigen und dieser Zeile als LF-Zeichen (`n) in die Datei geschrieben.
    Standardmäßig wird der Tabulator auf der linken Seite dieser Zeile auch in die Datei geschrieben (das gleiche gilt auch für Leerzeichen).
Standardmäßig werden Variablenverweise wie %Var% in den Variableninhalt aufgelöst.
), 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. Wenn diese Option fehlt, erfolgt nach jeder Zeile, außer der letzten, ein Zeilenumbruchszeichen (`n). 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 senkrechten Strich 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 Variablenverweise, 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. Das heißt, 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 16.383 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 = %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.

Ein Skript in eine EXE-Datei umwandeln (ahk2exe)

Ein Skript-Compiler ist im Lieferumfang des Programms enthalten (zur Verfügung gestellt von fincs).

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.

Ahk2Exe kann auf folgenden Arten verwendet werden:

  1. GUI-Schnittstelle: Starten Sie die Verknüpfung "Convert .ahk to .exe" im Startmenü.
  2. Rechtsklick: Klicken Sie mit der rechten Maustaste 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, MPRESS), die Sie zuletzt für Methode #1 benutzt hatten.
  3. Befehlszeile: Der Compiler kann mit folgenden Parametern via Befehlszeile ausgeführt werden:
    Ahk2Exe.exe /in Skript.ahk [/out Skript.exe] [/icon Symbol.ico] [/bin AutoHotkeySC.bin] [/mpress 0oder1]
    Zum Beispiel:
    Ahk2exe.exe /in "Skript.ahk" /icon "Symbol.ico"
    Verwendung:

Hinweise:

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

Komprimieren von kompilierten Skripten

Ahk2Exe kann optional MPRESS (ein Freeware-Programm von MATCODE Software) verwenden, um kompilierte Skripte zu komprimieren. MPRESS wird automatisch benutzt, wenn mpress.exe im AutoHotkey-Unterordner "Compiler" vorhanden ist. Diese Automatik kann mit /mpress 0 oder GUI-Einstellung deaktiviert werden.

Offizielle Website (war im März 2016 offline): http://www.matcode.com/mpress.htm

Mirror (Downloads und Information): https://autohotkey.com/mpress/

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.

Befehlszeilenparameter an einem Skript übergeben

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:

OptionBedeutungKompiliert?
/f oder /force Skript bedingungslos starten und Warnmeldungen überspringen. Diese Option hat den gleichen Effekt wie #SingleInstance Off. Ja
/r oder /restart Gibt an, dass das Skript neu gestartet werden soll (das auch intern vom Reload-Befehl verwendet wird). Ja
/ErrorStdOut 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. 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. Nein
/iLib "AusgabeDatei"

[v1.0.47+]: AutoHotkey lädt das Skript, ohne es auszuführen. Für jedes Skript, das mithilfe des Library-Mechanismus automatisch eingefügt wurde, werden zwei Zeilen in die AusgabeDatei geschrieben. Diese Zeilen werden im folgenden Format geschrieben - dabei ist LibVerz der vollständige Pfad des Library-Ordners und LibDatei der Dateiname der Library:

#Include LibVerz\
#IncludeAgain LibVerz\LibDatei.ahk

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

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

Skript-Dateiname: Dieser Parameter kann weggelassen werden, falls keine Skript-Parameter vorhanden sind. Fehlt dieser Parameter (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().

Skript-Parameter: Eine oder mehrere durch Leerzeichen getrennte Zeichenketten, die an das Skript übergeben werden sollen. Jeder Parameter, der Leerzeichen enthält, muss in Anführungszeichen gesetzt werden. Um ein direkt geschriebenes Anführungszeichen zu übergeben, muss ein umgekehrter Schrägstrich davor gesetzt werden (\"). Daraus folgt, dass jeder nachfolgende Schrägstrich 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 des Array-Syntaxes 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, ÜbergebenerPfad in A_Args  ; Für jeden Parameter (oder abgelegte Datei auf das Skript):
{
    Loop Files, %ÜbergebenerPfad%, FD  ; Dateien und Verzeichnisse einbeziehen.
        LangerPfad := A_LoopFileFullPath
    MsgBox Der lange Pfadname mit korrekter Groß-/Kleinschreibung der Datei`n%ÜbergebenerPfad%`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 abgelegte Datei auf ein Skript):
{
    Pfadangabe := %A_Index%  ; Ruft den Inhalt der Variable ab, deren Name in A_Index enthalten ist.
    Loop %Pfadangabe%, 1
        LangerPfad = %A_LoopFileLongPath%
    MsgBox Der lange Pfadname mit korrekter Groß-/Kleinschreibung der Datei `n%Pfadangabe%`n ist:`n%LangerPfad%
}

Zeichensatz einer Skript-Datei [AHK_L 51+]

Die Zeichen, die eine Skript-Datei enthalten darf, sind vom Zeichensatz (Codepage) vorgegeben, mit der die Datei geladen wurde.

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" `%*
Key=AutoHotkeyScript\Shell\Open\Command
if A_IsAdmin    ; Für alle Benutzer setzen.
    RegWrite, REG_SZ, HKCR, %Key%,, %Befehl%
else            ; Nur für den aktuellen Benutzer setzen.
    RegWrite, REG_SZ, HKCU, Software\Classes\%Key%,, %Befehl%

Das setzt natürlich voraus, dass AutoHotkey bereits installiert ist. Ansonsten 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 finden und 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 [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 deaktiviert ist.

Um interaktives Debuggen zu aktivieren, startet man zuerst einen unterstützten Debugger-Client und 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, sendet man ihm wie folgt eine Meldung:

Skriptpfad = ; SETZEN SIE HIER DEN VOLLSTÄNDIGEN PFAD DES SKRIPTS EIN
DetectHiddenWindows On
IfWinExist %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 beenden.

Skript-Beispiele

Auf dieser Seite kann man einige nützliche Skripte finden.