Wie man Programme ausführt

Eines der einfachsten und nützlichsten Dinge, die Sie mit AutoHotkey tun können, ist das Erstellen von Tastaturkurzbefehlen (Hotkeys), die Programme starten.

Um ein Programm zu starten, rufen Sie die Run-Funktion auf und übergeben Sie die Befehlszeile des Programms als Parameter:

Run "C:\Windows\notepad.exe"

Dieses Beispiel startet Notepad (den Texteditor von Windows). Wie Sie es ausprobieren können, erfahren Sie unter Wie man Beispielcodes ausführt.

Zu diesem Zeitpunkt haben wir noch keinen Hotkey definiert (bzw. noch keinen Tastaturkurzbefehl zugewiesen), so dass die Anweisungen sofort ausgeführt werden. In diesem Fall muss das Skript nichts weiter tun und beendet sich daher automatisch. Wenn Sie lieber lernen möchten, wie man nützliche Hotkeys erstellt, befassen Sie sich zuerst mit Wie man Hotkeys schreibt.

Hinweis: Run kann auch zum Öffnen von Dokumenten, Ordnern und URLs verwendet werden.

Um andere Programme zu starten, ersetzen Sie einfach den Pfad im obigen Beispiel mit dem Pfad des Programms, das Sie starten möchten. Für einige Programme sind die Pfade im System registriert. In diesem Fall müssen Sie nur den Dateinamen des Programms angeben, entweder mit oder (manchmal) ohne die Endung ".exe". Zum Beispiel:

Run "notepad"

Befehlszeilenparameter

Wenn das Programm Befehlszeilenparameter akzeptiert, können diese als Teil des ersten Parameters der Run-Funktion übergeben werden. Das folgende Beispiel sollte license.txt in Notepad öffnen:

Run "notepad C:\Program Files\AutoHotkey\license.txt"

Hinweis: Dieses Beispiel setzt voraus, dass AutoHotkey im Standardverzeichnis installiert ist. Andernfalls erscheint eine Fehlermeldung.

Einfach, oder? Nehmen wir nun an, dass wir die Datei in WordPad statt in Notepad öffnen wollen.

Run "wordpad C:\Program Files\AutoHotkey\license.txt"

Führen Sie diesen Code aus, um zu sehen, was passiert.

Okay, der neue Code funktioniert also nicht. Hoffentlich haben Sie die Fehlermeldung nicht gleich weggeklickt; Fehlermeldungen bzw. Fehlerdialogfenster gehören zum Programmieren dazu und enthalten oft sehr nützliche Informationen. Es liefert uns die folgenden Informationen:

Aber warum hat Notepad funktioniert? Nur "notepad" oder "wordpad" auszuführen, funktioniert, aber aus unterschiedlichen Gründen. Im Gegensatz zu notepad.exe kann wordpad.exe nicht durch Überprüfen aller Verzeichnisse in der PATH-Umgebungsvariable gefunden werden. Es kann durch eine andere Methode lokalisiert werden, aber dazu muss die Run-Funktion den Programmnamen von den Parametern trennen.

Folglich benötigt die Run-Funktion in diesem Fall ein wenig Nachhilfe, wahlweise in einer oder allen der folgenden Formen:

Entscheiden wir uns zunächst für die einfachste Option:

Run "wordpad.exe C:\Program Files\AutoHotkey\license.txt"

WordPad startet nun, zeigt aber einen Fehler an: "C:\Program" wurde nicht gefunden.

Anführungszeichen und Leerzeichen

Bei der Übergabe von Befehlszeilenparametern an ein Programm ist es oft notwendig, jeden Parameter, der Leerzeichen enthält, in Anführungszeichen zu setzen. Bei Notepad war dies nicht notwendig, aber Notepad ist eine Ausnahme von der Grundregel. Ein naiver Lösungsversuch könnte sein, einfach mehr Anführungszeichen hinzuzufügen:

Run "wordpad.exe "C:\Program Files\AutoHotkey\license.txt""

Dies wird aber nicht funktionieren, weil Anführungszeichen standardmäßig verwendet werden, um den Anfang und das Ende von direkt geschriebenem Text zu markieren. Wie können wir also so ein Anführungszeichen in die Befehlszeile einfügen, anstatt die Befehlszeile damit zu beenden?

Methode 1: Setzen Sie ein ` (umgekehrtes Häkchen, Akzentzeichen oder Gravis) vor jedes dieser Anführungszeichen. Dies wird als Escapesequenz bezeichnet. Das Anführungszeichen wird dann in die Befehlszeile (also in die Zeichenkette, die an die Run-Funktion übergeben wird) eingefügt, während das umgekehrte Häkchen seinen Zweck erfüllt hat und daher wegfällt.

Run "wordpad.exe `"C:\Program Files\AutoHotkey\license.txt`""

Methode 2: Umschließen Sie die Befehlszeile mit einfachen statt doppelten Anführungszeichen.

Run 'wordpad.exe "C:\Program Files\AutoHotkey\license.txt"'

Natürlich müssten in diesem Fall alle direkt geschriebenen einfachen Anführungszeichen (oder Apostrophe) im Text mit einem Escapezeichen versehen werden (`').

Die Art und Weise, wie Sie den Code schreiben, beeinflusst, welche Anführungszeichen tatsächlich an die Run-Funktion übergeben werden. In den beiden obigen Beispielen wird der Run-Funktion die Zeichenkette wordpad.exe "C:\Program Files\AutoHotkey\license.txt" übergeben. Die Run-Funktion teilt diese Zeichenkette entweder in Programmname und Parameter auf oder überlässt dies dem System. In beiden Fällen hängt es vom Zielprogramm ab, wie die restlichen Anführungszeichen interpretiert werden.

Viele Programme behandeln ein Anführungszeichen als Teil des Parameters, wenn ihm ein umgekehrter Schrägstrich vorangestellt ist. Zum Beispiel könnte Run 'meine.exe "A\" B' einen Parameter mit dem Wert A" B anstelle von zwei Parametern erzeugen. Dies liegt im Ermessen des Programms und kann meist durch Verdopplung des umgekehrten Schrägstrichs vermieden werden, wie in Run 'meine.exe "A\\" B', das normalerweise zwei Parameter (A\ und B) erzeugt.

Die meisten Programme interpretieren Anführungszeichen als eine Art Schalter, der zwischen den Modi "Leerzeichen beendet den Parameter" und "Leerzeichen ist im Parameter enthalten" umschaltet. Mit anderen Worten, Run 'meine.exe "A B"' ist grundsätzlich äquivalent zu Run 'meine.exe A" "B'. Um Probleme mit Schrägstrichen zu vermeiden, gibt es auch die Möglichkeit, die Leerzeichen anstelle des gesamten Parameters in Anführungszeichen zu setzen, oder das Anführungszeichen vor dem Schrägstrich zu beenden, wie in Run 'meine.exe "A"\ B'.

Variablen einbeziehen

Oft muss eine Befehlszeile einige Variablen einfügen. Zum Beispiel kann der Ort des Verzeichnisses "Programme" von System zu System unterschiedlich sein. Ein Skript kann dies durch Verwendung der A_ProgramFiles-Variable berücksichtigen. Wenn die Variable die gesamte Befehlszeile enthält, übergeben Sie sie einfach an die Run-Funktion, um sie auszuführen.

Run A_ComSpec  ; Eine Eingabeaufforderung starten (fast immer cmd.exe).
Run A_MyDocuments  ; Den Ordner "Dokumente" des Benutzers öffnen.

Es ist nicht möglich, eine Variable in eine Zeichenkette einzufügen, die von Anführungszeichen umschlossen ist; stattdessen verwenden wir die sogenannte Verkettung, um direkt geschriebene Zeichenketten mit Variablen zu verbinden. Zum Beispiel:

Run 'notepad.exe "' A_MyDocuments '\AutoHotkey.ahk"'

Eine andere Methode ist die Verwendung von Format, um eine Substitution durchzuführen. Zum Beispiel:

Run Format('notepad.exe "{1}\AutoHotkey.ahk"', A_MyDocuments)

Hinweis: Format kann mehrere Formatierungen auf einmal durchführen, z.B. das Auffüllen mit Nullen oder Leerzeichen oder die Umwandlung von Dezimalzahlen in Hexadezimalzahlen.

Die Parameter von Run

Neben der auszuführenden Befehlszeile akzeptiert die Run-Funktion noch andere Parameter, um das Verhalten zu beeinflussen.

ArbeitVerz gibt das Arbeitsverzeichnis für den neuen Prozess an. Wenn Sie einen relativen Pfad für das Programm angeben, wird das Programm relativ zu diesem Verzeichnis ausgeführt. Relative Pfade in Befehlszeilenparametern sind oft auch relativ zu diesem Verzeichnis, aber das hängt vom Programm ab.

Run "cmd", "C:\"  ; Eine Eingabeaufforderung unter C:\ öffnen

Optionen kann oft verwendet werden, um ein Programm minimiert oder versteckt auszuführen, so dass es gar nicht erst auf dem Bildschirm erscheint, aber einige Programme ignorieren dies.

AusgabeVarPID liefert Ihnen die Prozess-ID. Diese ID wird oft mit WinWait oder WinWaitActive und ahk_pid verwendet, um zu warten, bis das Programm ein Fenster auf dem Bildschirm anzeigt, oder um eines seiner Fenster zu identifizieren. Zum Beispiel:

Run "mspaint",,, &pid
WinWaitActive "ahk_pid " pid
Send "^e"  ; STRG+E öffnet das Dialogfenster "Bildeigenschaften".

Systemverben

Systemverben sind Aktionen, die vom System oder von einigen Applikationen für bestimmte Dateitypen registriert werden. Diese sind normalerweise im Rechtsklickmenü der Datei im Explorer verfügbar, aber ihre tatsächlichen Namen stimmen nicht immer mit dem im Menü angezeigten Text überein. Zum Beispiel haben AutoHotkey-Skripte das Verb "edit", das das Skript in einem Editor öffnet, und das Verb "compile" (wenn Ahk2Exe installiert ist), das das Skript kompiliert.

"Edit" ist eines der üblichen Verben, die Run standardmäßig erkennt, und kann daher durch Eingabe des Wortes, gefolgt von einem Leerzeichen und dem Dateinamen, verwendet werden:

Run 'edit ' A_ScriptFullPath  ; Grundsätzlich äquivalent zu Edit

Jedes im System registrierte Verb kann mit dem Präfix * ausgeführt werden:

Run '*Compile-Gui ' A_ScriptFullPath

Wenn Ahk2Exe installiert ist, öffnet dies die Ahk2Exe-GUI, in der das aktuelle Skript vorab ausgewählt ist.

Umgebung

Jedes Mal, wenn ein neuer Prozess startet, erbt er in der Regel die Umgebung des Prozesses, der ihn gestartet hat (der übergeordnete Prozess). Grundsätzlich heißt das, dass alle Umgebungsvariablen des Skripts an Programme vererbt werden, die Sie mit Run starten.

In einigen Fällen können Umgebungsvariablen mit EnvSet gesetzt werden, bevor das Programm gestartet wird, um sein Verhalten zu beeinflussen oder ihm Informationen zu übergeben. Ein Skript kann auch EnvGet verwenden, um Umgebungsvariablen zu lesen, die es ggf. von seinem übergeordneten Prozess geerbt hat.

In 64-Bit-Systemen hängt die Umgebung des Skripts stark davon ab, ob die EXE, die es ausführt, 32-Bit oder 64-Bit ist. 32-Bit-Prozesse haben nicht nur andere Umgebungsvariablen, sondern unterliegen aus Kompatibilitätsgründen auch einer Dateisystemumleitung.

Run "cmd /k set pro"

Das obige Beispiel startet eine Eingabeaufforderung, die alle Umgebungsvariablen anzeigt, die mit "pro" beginnen. Wenn Sie diesen Code mit einem 32-Bit-Skript ausführen, werden Sie wahrscheinlich PROCESSOR_ARCHITECTURE=x86 und ProgramFiles=C:\Program Files (x86) sehen. Auch wenn der Titel so etwas wie "C:\Windows\System32\cmd.exe" anzeigt, entspricht dies nicht der Wahrheit; es handelt sich eigentlich um die 32-Bit-Version, die sich in "C:\Windows\SysWow64\cmd.exe" befindet.

In solchen Fällen ist es am einfachsten, die Umleitung von "System32" zu umgehen, indem man stattdessen "SysNative" verwendet. Dies funktioniert jedoch nur über einen 32-Bit-Prozess in einem 64-Bit-System und sollte daher nur unter Vorbehalt verwendet werden. Wenn das folgende Beispiel in einem 64-Bit-System ausgeführt wird, zeigt es eine 64-Bit-Eingabeaufforderung an, auch wenn das Skript 32-Bit ist:

if FileExist(A_WinDir "\SysNative")
    Run A_WinDir "\SysNative\cmd.exe /k set pro"
else
    Run "cmd /k set pro"