Run / RunWait

Startet ein externes Programm. RunWait wartet zusätzlich auf dessen Beendigung.

Run, Ziel , ArbeitVerz, Optionen, AusgabeVarPID
RunWait, Ziel , ArbeitVerz, Optionen, AusgabeVarPID

Parameter

Ziel

Ein Dokument, eine URL, eine ausführbare Datei (.exe, .com, .bat usw.), eine Verknüpfung (.lnk), eine CLSID oder ein Systemverb (siehe Bemerkungen). Wenn Ziel eine lokale Datei ohne Pfadangabe ist, hängt die Ortsbestimmung der Datei normalerweise vom Dateityp und anderen Bedingungen ab. Weitere Informationen finden Sie unter Interpretation von Ziel.

Um Parameter zu übergeben, fügen Sie diese wie folgt direkt nach dem Programm- oder Dokumentnamen hinzu:

Run, MeinProgramm.exe Param1 Param2

Wenn der Programm-/Dokumentname oder ein Parameter Leerzeichen enthält, ist es am sichersten, ihn wie folgt in doppelte Anführungszeichen zu setzen (obwohl es in einigen Fällen auch ohne geht):

Run, "Mein Programm.exe" "Param mit Leerzeichen"
ArbeitVerz

Wenn leer oder weggelassen, wird das Arbeitsverzeichnis des Skripts verwendet (A_WorkingDir). Andernfalls geben Sie das anfängliche Arbeitsverzeichnis an, das vom neuen Prozess verwendet werden soll. Dies betrifft in der Regel auch relative Pfade in Ziel, aber die Interpretation von Befehlszeilenparametern hängt vom Zielprogramm ab. Umschließen Sie den Namen nicht mit doppelten Anführungszeichen, selbst wenn er Leerzeichen enthält.

Optionen

Wenn leer oder weggelassen, wird Ziel normal gestartet und ein Warndialogfenster angezeigt, wenn Ziel nicht gestartet werden konnte. Andernfalls geben Sie eine oder mehrere der folgenden Optionen an:

Max: Maximiert starten

Min: Minimiert starten

Hide: Versteckt starten (kann nicht zusammen mit einem der obigen verwendet werden)

Hinweis: Einige Anwendungen (z.B. Calc.exe) ignorieren den angeforderten Startzustand, so dass Max/Min/Hide keine Wirkung hat.

UseErrorLevel: UseErrorLevel kann allein oder zusammen mit einem der obigen Wörter verwendet werden (die Wörter müssen jeweils mit einem Leerzeichen voneinander getrennt werden). Wenn der Start fehlschlägt, bewirkt diese Option, dass das Warndialogfenster übersprungen wird, ErrorLevel auf das Wort ERROR gesetzt wird und der aktuelle Thread fortgesetzt werden kann. Wenn der Start erfolgreich war, wird RunWait ErrorLevel auf den Exitcode des Programms setzen, während Run es auf 0 setzt.

Wenn UseErrorLevel angegeben ist, wird die interne Variable A_LastError auf den Rückgabewert der systeminternen GetLastError()-Funktion gesetzt. A_LastError ist eine Zahl zwischen 0 und 4294967295 (immer dezimal, nicht hexadezimal). Null (0) bedeutet Erfolg, während jede andere Zahl bedeutet, dass der Start fehlgeschlagen ist. Jede Nummer entspricht einem bestimmten Fehlerzustand (eine Liste finden Sie unter www.microsoft.com mit Suchbegriffen wie "system error codes"). A_LastError ist wie ErrorLevel eine threadspezifische Einstellung, d.h. es kann nicht durch Unterbrechungen anderer Threads geändert werden. Allerdings wird A_LastError auch von DllCall() gesetzt.

AusgabeVarPID

Wenn weggelassen, wird der zugehörige Wert nicht gespeichert. Andernfalls geben Sie den Namen der Ausgabevariable an, in der die eindeutige Prozess-ID (PID) des neuen Programms, das gestartet wurde, gespeichert werden soll. Die Variable wird leer gemacht, wenn die PID nicht ermittelt werden konnte. Dies geschieht in der Regel, wenn ein Systemverb, ein Dokument oder eine Verknüpfung anstelle einer direkt ausführbaren Datei gestartet wird. RunWait unterstützt diesen Parameter auch, allerdings muss seine AusgabeVarPID in einem anderen Thread geprüft werden (andernfalls wäre die PID ungültig, weil der Prozess nach der Ausführung von RunWait nicht mehr existiert).

Nachdem der Run-Befehl eine PID abgerufen hat, ist es möglich, dass die vom Prozess zu erstellenden Fenster noch nicht existieren. Um auf mindestens eines dieser Fenster zu warten, verwenden Sie WinWait ahk_pid %AusgabeVarPID%.

Fehlerbehandlung

[v1.1.04+]: Dieser Befehl ist in der Lage, bei Misserfolg eine Ausnahme auszulösen. Weitere Informationen finden Sie unter Laufzeitfehler.

Run: Setzt kein ErrorLevel, es sei denn, UseErrorLevel (oben) ist wirksam, dann wird ErrorLevel bei Misserfolg auf das Wort ERROR und bei Erfolg auf 0 gesetzt.

RunWait: Setzt ErrorLevel auf den Exitcode des Programms (ein vorzeichenfähiger 32-Bit-Integer). Wenn der Start fehlschlägt, während UseErrorLevel aktiv ist, wird das Wort ERROR gesetzt.

Interpretation von Ziel

Run/RunWait selbst interpretiert keine Befehlszeilenparameter und sucht nicht die Zieldatei. Stattdessen wird versucht, das Ziel wie folgt auszuführen:

Wenn Ziel einen Namen, aber kein Verzeichnis angibt, wird das System die Datei suchen und ggf. starten, wenn sie integriert ("bekannt") ist, z.B. weil sie in einem der PATH-Ordner enthalten ist. Die genaue Suchreihenfolge hängt davon ab, ob CreateProcess und/oder ShellExecuteEx aufgerufen wird. Wenn CreateProcess aufgerufen wird, hat das Programmverzeichnis (das den AutoHotkey-Interpreter oder das kompilierte Skript enthält) Vorrang vor ArbeitVerz. Um das zu verhindern, geben Sie das Verzeichnis an, z.B. .\Programm.exe.

Wenn ShellExecuteEx versucht wird, wird Ziel wie folgt interpretiert:

Bemerkungen

RunWait wartet im Gegensatz zu Run, bis Ziel geschlossen oder beendet wird und setzt dann ErrorLevel auf den Exitcode des Programms (ein vorzeichenfähiger 32-Bit-Integer). Einige Programme geben sofort einen Exitcode zurück, obwohl sie noch laufen; solche Programme erzeugen einen weiteren Prozess.

Wenn Ziel Kommas enthält, müssen diese mit einem Escapezeichen versehen werden, wie im folgenden Beispiel dreimal hervorgehoben:

Run rundll32.exe shell32.dll`,Control_RunDLL desk.cpl`,`, 3  ; Öffnet Systemsteuerung > Anzeige > Einstellungen

Wenn ein Programm via ComSpec (cmd.exe) gestartet wird, um z.B. die Ein- oder Ausgabe des Programms umzuleiten, muss, sofern Leerzeichen im Pfad oder Namen der ausführbaren Datei enthalten sind, die komplette Zeichenkette mit einem äußeren Paar von Anführungszeichen umschlossen werden. Im folgenden Beispiel sind die äußeren Anführungszeichen gelb hervorgehoben:

Run %ComSpec% /c ""C:\Mein Tool.exe" "param 1" "zweiter param" >"C:\Meine Datei.txt""

Wenn Ziel nicht gestartet werden kann, wird eine Fehlermeldung angezeigt und der aktuelle Thread beendet, es sei denn, UseErrorLevel ist im dritten Parameter angegeben oder der Fehler wird mit einer Try/Catch-Anweisung abgefangen.

Die Performanz kann etwas verbessert werden, wenn Ziel ein genauer Pfad ist, z.B. Run, C:\Windows\Notepad.exe "C:\Meine Dokumente\Test.txt" anstelle von Run, C:\Meine Dokumente\Test.txt.

Es können spezielle CLSIDs via Run geöffnet werden. Die meisten von ihnen können mit dem Präfix shell: geöffnet werden. Einige können auch ohne dieses Präfix geöffnet werden. Zum Beispiel:

Run shell:::{D20EA4E1-3957-11D2-A40B-0C5020524153}  ; Windows-Tools.
Run ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}  ; Dieser PC (ehemals Arbeitsplatz oder Computer).
Run ::{645FF040-5081-101B-9F08-00AA002F954E}  ; Papierkorb.

Systemverben beziehen sich auf Aktionen, die im Rechtsklickmenü einer Datei innerhalb des Explorers verfügbar sind. Wenn eine Datei ohne Verb gestartet wird, wird das Standardverb (üblicherweise "open") für diesen bestimmten Dateityp verwendet. Andernfalls geben Sie das Verb vor dem Namen der Zieldatei an. Zurzeit werden folgende Verben unterstützt:

Verb Beschreibung
*verb [AHK_L 57+]: Ein beliebiges systemdefiniertes oder benutzerdefiniertes Verb. Zum Beispiel: Run *Compile %A_ScriptFullPath%. In Windows Vista und höher kann das Verb *RunAs als Ersatz für den Kontextmenüpunkt Als Administrator ausführen verwendet werden.
properties

Zeigt das Eigenschaftenfenster des Explorers für die angegebene Datei an. Zum Beispiel: Run, properties "C:\Meine Datei.txt".

Hinweis: Das Eigenschaftenfenster wird automatisch bei Beendigung des Skripts geschlossen. Um das zu verhindern, verwenden Sie WinWait, um auf das Erscheinen des Fensters zu warten, und dann WinWaitClose, um auf das Schließen des Fensters zu warten.

find Öffnet eine Instanz des Suchassistenten oder des Suchergebnisfensters des Explorers im angegebenen Ordner. Zum Beispiel: Run, find D:\
explore Öffnet eine Instanz des Explorers im angegebenen Ordner. Zum Beispiel: Run, explore %A_ProgramFiles%.
edit Öffnet die angegebene Datei zum Editieren. Dieser Vorgang kann fehlschlagen, wenn der Dateityp der angegebenen Datei keine Edit-Aktion hat. Zum Beispiel: Run, edit "C:\Meine Datei.txt".
open Öffnet die angegebene Datei (normalerweise nicht notwendig, da es die Standardaktion für die meisten Dateitypen ist). Zum Beispiel: Run, open "Meine Datei.txt".
print Druckt die angegebene Datei mit der zugehörigen Anwendung, falls vorhanden. Zum Beispiel: Run, print "Meine Datei.txt".

Während RunWait wartet, können neue Threads via Hotkeys, benutzerdefinierte Menüpunkte oder Timer gestartet werden.

Als Administrator ausführen [AHK_L 57+]

Bei einer ausführbaren Datei entspricht das Verb *RunAs der Auswahl des Menüpunkts Als Administrator ausführen im Rechtsklickmenü der Datei. Zum Beispiel versucht der folgende Code, das aktuelle Skript mit Adminrechten neu zu starten:

full_command_line := DllCall("GetCommandLine", "str")

if not (A_IsAdmin or RegExMatch(full_command_line, " /restart(?!\S)"))
{
    try
    {
        if A_IsCompiled
            Run *RunAs "%A_ScriptFullPath%" /restart
        else
            Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%"
    }
    ExitApp
}

MsgBox A_IsAdmin: %A_IsAdmin%`nCommand line: %full_command_line%

Wenn der Benutzer das Bestätigungsfenster der Benutzerkontensteuerung (engl. User Account Control, kurz UAC) abbricht oder wenn Run aus einem anderen Grund fehlschlägt, wird das Skript einfach beendet.

Das /restart stellt sicher, dass keine Einzelinstanz-Nachfrage erscheint, wenn eine neue Instanz des Skripts gestartet wird, bevor ExitApp aufgerufen wird.

Wenn UAC deaktiviert ist, wird *RunAs den Prozess ohne Erhöhung seiner Berechtigungen starten. Es wird geprüft, ob /restart in der Befehlszeile vorkommt, um sicherzustellen, dass das Skript nicht in eine ausweglose Schleife gerät. Beachten Sie, dass /restart ein interner Parameter ist und daher nicht im Befehlszeilenparameter-Array enthalten ist.

Das Beispiel kann jederzeit nach Belieben angepasst werden:

[v1.0.92.01+]: Wenn UAC aktiviert ist, registriert der AutoHotkey-Installer das RunAs-Verb für .ahk-Dateien, wodurch Run *RunAs skript.ahk ein Skript als Administrator mit der Standard-EXE starten kann.

RunAs, Process, Exit, CLSID-Liste, DllCall()

Beispiele

Run kann Windows-Systemprogramme aus einem beliebigen Verzeichnis heraus starten. Beachten Sie, dass Endungen von ausführbaren Dateien wie z.B. ".exe" weggelassen werden können.

Run, notepad

Run kann URLs starten:

Folgendes öffnet eine Internetadresse im Standard-Webbrowser des Benutzers.

Run, https://www.google.com

Folgendes öffnet die Standard-E-Mail-Anwendung mit ausgefülltem Empfänger.

Run, mailto:someone@somedomain.com

Folgendes macht dasselbe wie oben, plus Betreff und Haupttext.

Run, mailto:someone@somedomain.com?subject=Das ist die Betreffzeile.&body=Das ist der Haupttext der Nachricht.

Öffnet ein Dokument in einer maximierten Anwendung und zeigt bei Misserfolg eine benutzerdefinierte Fehlermeldung an.

Run, ReadMe.doc, , Max UseErrorLevel
if (ErrorLevel = "ERROR")
    MsgBox Das Dokument konnte nicht geöffnet werden.

Führt den dir-Befehl im minimierten Zustand aus und speichert die Ausgabe in eine Textdatei. Anschließend wird die Textdatei geöffnet und ihr Eigenschaftenfenster angezeigt.

#Persistent
RunWait, %ComSpec% /c dir C:\ >>C:\DirTest.txt, , Min
Run, C:\DirTest.txt
Run, properties C:\DirTest.txt

Run kann CLSIDs starten:

Folgendes öffnet den Papierkorb.

Run, ::{645FF040-5081-101B-9F08-00AA002F954E}

Folgendes öffnet Dieser PC (ehemals Arbeitsplatz oder Computer).

Run, ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}

Mit "&&" können mehrere Befehle nacheinander ausgeführt werden.

Run, %ComSpec% /c dir /b > C:\Liste.txt && type C:\Liste.txt && pause

Die folgenden Funktionen können verwendet werden, um einen einzelnen Befehl auszuführen und dessen Ausgabe abzurufen oder um mehrere Befehle auf einmal auszuführen und deren Ausgabe abzurufen. Bezüglich des WshShell-Objekts siehe Microsoft Docs.

MsgBox % RunWaitEin("dir " A_ScriptDir)

MsgBox % RunWaitViele("
(
echo Fügen Sie hier Ihre Befehle ein,
echo die ausgeführt werden sollen,
echo um danach ihre Ausgaben zu erhalten.
)")

RunWaitEin(Befehl) {
    shell := ComObjCreate("WScript.Shell")
    ; Einen Befehl via cmd.exe ausführen
    exec := shell.Exec(ComSpec " /C " Befehl)
    ; Ausgabe des Befehls lesen und zurückgeben
    return exec.StdOut.ReadAll()
}

RunWaitViele(Befehle) {
    shell := ComObjCreate("WScript.Shell")
    ; cmd.exe mit deaktivierter Textanzeige öffnen
    exec := shell.Exec(ComSpec " /Q /K echo off")
    ; Befehle zum Ausführen senden, getrennt durch Zeilenumbruch
    exec.StdIn.WriteLine(Befehle "`nexit")  ; Immer ein Exit am Ende!
    ; Ausgaben aller Befehle lesen und zurückgeben
    return exec.StdOut.ReadAll()
}

Führt den angegebenen Code als neuen AutoHotkey-Prozess aus.

SkriptAusführen(Skript, Warten:=true)
{
    shell := ComObjCreate("WScript.Shell")
    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")
    exec.StdIn.Write(Skript)
    exec.StdIn.Close()
    if Warten
        return exec.StdOut.ReadAll()
}

; Beispiel:
InputBox Ausdruck,, Tragen Sie einen Ausdruck ein`, der als neuer Skript ausgewertet werden soll.,,,,,,,, Asc("*")
Ergebnis := SkriptAusführen("FileAppend % (" Ausdruck "), *")
MsgBox % "Ergebnis: " Ergebnis