Run / RunWait

Startet ein externes Programm. RunWait wartet, bis das Programm endet, bevor es fortfährt.

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

Parameter

Ziel

Ein Dokument, eine URL, eine ausführbare Datei (.exe, .com, .bat und so weiter), eine Verknüpfung (.lnk) oder ein Systemverb (siehe Bemerkungen). Wenn das Ziel eine lokale Datei ist, ohne dass ein Pfad angegeben wurde, wird A_WorkingDir zuerst durchsucht. Wenn eine Datei dort nicht gefunden wurde, wird das System nach dieser Datei suchen und sie gegebenenfalls starten, sofern sie integriert ("bekannt") ist, wie z. B. in einem der PATH-Ordner.

Um Parameter zu übergeben, geben Sie diese direkt nach dem Programm- oder Dokumentnamen an. Zum Beispiel Run, MeinProgram.exe Param1 Param2.

Wenn der Programm-/Dokumentname oder ein Parameter Leerzeichen enthält, ist es am sichersten, ihn in doppelte Anführungszeichen zu setzen (auch wenn es in einigen Fällen ohne sie funktionieren würde). Zum Beispiel Run, "Mein Programm.exe" "Param mit Leerzeichen".

ArbeitVerz

Das Arbeitsverzeichnis, in dem das Ziel gestartet werden soll. Umschließen Sie den Namen nicht mit doppelten Anführungszeichen, selbst wenn er Leerzeichen enthält. Lässt man diesen Parameter weg, wird das Arbeitsverzeichnis des Skripts verwendet (A_WorkingDir).

Optionen

Lässt man diesen Parameter weg, wird der Befehl das Ziel normal starten und ein Warndialogfenster anzeigen, wenn Ziel nicht gestartet werden konnte. Um dieses Verhalten zu ändern, geben Sie einen oder mehrere der folgenden Wörter an:

Max: maximiert starten

Min: minimiert starten

Hide: versteckt starten (kann nicht in Kombination mit den oben genannten Wörtern verwendet werden)

Hinweis: Einige Anwendungen (z. B. Calc.exe) ignorieren den angeforderten Anfangsstatus, wodurch Max/Min/Hide nicht funktionieren werden.

UseErrorLevel: UseErrorLevel kann einzeln oder in Kombination mit einem der oben genannten Wörtern verwendet werden (die Wörter müssen jeweils mit einem Leerzeichen getrennt werden). Wenn das Starten fehlschlägt, wird diese Option das Warndialogfenster überspringen, ErrorLevel auf ERROR setzen und den aktuellen Thread fortsetzen lassen. Wenn das Starten erfolgreich war, wird ErrorLevel auf 0 gesetzt, und von RunWait auf den Exitcode des Programms.

Wenn UseErrorLevel angegeben wurde, wird A_LastError auf den Rückgabewert der systeminternen GetLastError()-Funktion gesetzt. A_LastError ist eine Nummer zwischen 0 und 4294967295 (immer in dezimaler Form, nicht hexadezimal). Null (0) bedeutet Erfolg; jede andere Nummer bedeutet, dass das Starten fehlgeschlagen ist. Jede Nummer entspricht einem bestimmten Fehlerzustand (Sie erhalten eine Liste, wenn Sie auf www.microsoft.com nach "system error codes" suchen). A_LastError ist wie ErrorLevel eine Pro-Thread-Einstellung; das sind Einstellungen, die nicht von anderen Threads geändert werden können. Allerdings wird A_LastError auch von DllCall() gesetzt.

AusgabeVarPID

Name der Ausgabevariable, in der die eindeutige Prozess-ID (PID) des neu gestarteten Programms gespeichert werden soll. Die Variable wird leer gemacht, wenn die PID nicht ermittelt werden konnte - dies passiert üblicherweise nur, wenn nicht eine ausführbare Datei, sondern ein Systemverb, ein Dokument oder eine Verknüpfung gestartet wird. RunWait unterstützt diesen Parameter auch, allerdings muss seine AusgabeVarPID in einem anderen Thread überprüft werden (ansonsten wäre die PID ungültig, weil der Prozess nach RunWait nicht mehr existiert).

Nachdem der Run-Befehl eine PID ermittelt hat, kann es sein, dass Fenster, die vom Prozess erstellt werden, noch nicht verfügbar sind. Verwenden Sie WinWait ahk_pid %AusgabeVarPID%, um wenigstens auf eines dieser Fenster zu warten.

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 ERROR und bei Erfolg auf 0 gesetzt.

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

Bemerkungen

RunWait wird, im Gegensatz zu Run, warten, bis das 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 das Ziel Kommas enthält, müssen diese mit einem Escapezeichen versehen werden, wie es im folgenden Beispiel dreimal hervorgehoben ist:

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

Startet man ein Programm via ComSpec (cmd.exe) - z. B. um die Ein- oder Ausgabe des Programms umzuleiten - sollte, sofern Leerzeichen im Pfad oder Namen enthalten sind, die komplette Zeichenkette mit äußeren 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, man verwendet UseErrorLevel im dritten Parameter oder der Fehler wird via Try/Catch-Anweisung abgefangen.

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

Spezielle CLSID-Ordner können via Run geöffnet werden. Zum Beispiel:

Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; Öffnet den Arbeitsplatz/Computer.
Run ::{645ff040-5081-101b-9f08-00aa002f954e}  ; Öffnet den Papierkorb.

Systemverben beziehen sich auf Aktionen, die im Rechtsklickmenü einer Datei innerhalb des Explorers verfügbar sind. Startet man eine Datei ohne Verb, wird das Standardverb (üblicherweise "open") für diesen bestimmten Dateityp verwendet. Ansonsten sollte nach dem Verb der Name der Zieldatei erfolgen. Zurzeit werden folgende Verben unterstützt:

Verb Beschreibung
*verb [AHK_L 57+]: 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 benutzt werden.
properties

Öffnet das Explorer-Eigenschaftsfenster für die angegebene Datei. Zum Beispiel: Run, properties "C:\Meine Datei.txt".

Hinweis: Das Eigenschaftsfenster wird automatisch geschlossen, sobald das Skript terminiert wird. Um das zu verhindern, verwenden Sie WinWait, um auf das Erscheinen des Fensters zu warten, und danach WinWaitClose, um auf das Schließen des Fensters zu warten.

find Öffnet eine Instanz vom Such-Assistenten oder Suchergebnisfenster 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, weil 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 im Wartezustand ist, 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 ist das Verb *RunAs das gleiche wie, als würde man Als Administrator ausführen im Rechtsklickmenü der Datei auswählen. Zum Beispiel würde der folgende Code versuchen, das aktuelle Skript mit Administratorrechten neuzustarten:

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 im UAC-Dialogfenster auf Abbrechen drückt 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 startet, bevor ExitApp aufgerufen wird.

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

Das Beispiel kann jederzeit nach Belieben angepasst werden:

[v1.0.92.01+]: Wenn UAC aktiviert ist, wird der AutoHotkey-Installer das Verb RunAs bei .ahk-Dateien registrieren, wodurch Run *RunAs skript.ahk ein Skript als Administrator starten kann - mit der vordefinierten ausführbaren Datei.

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 .exe weggelassen werden können.

Run, notepad

Run kann URLs starten:

Das folgende Beispiel öffnet eine Internetadresse im Standard-Webbrowser des Benutzers.

Run, https://www.google.com

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

Run, mailto:someone@somedomain.com

Das folgende Beispiel macht das Gleiche wie oben, plus den Betreff und den 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 einem Fehler 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. Danach wird die Textdatei und ihr Eigenschaftsfenster geöffnet.

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

Run kann CLSIDs starten:

Das folgende Beispiel öffnet den Papierkorb.

Run, ::{645ff040-5081-101b-9f08-00aa002f954e}

Das folgende Beispiel öffnet das "Dieser PC"-Verzeichnis.

Run, ::{20d04fe0-3aea-1069-a2d8-08002b30309d}

Mit "&&" können mehrere Befehle hintereinander 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 in einem Rutsch 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")
    ; Führt einen einzelnen Befehl via cmd.exe aus
    exec := shell.Exec(ComSpec " /C " Befehl)
    ; Liest die Ausgaben aller Befehle und gibt sie zurück
    return exec.StdOut.ReadAll()
}

RunWaitViele(Befehle) {
    shell := ComObjCreate("WScript.Shell")
    ; Öffnet cmd.exe mit deaktivierter Textanzeige
    exec := shell.Exec(ComSpec " /Q /K echo off")
    ; Sendet die Befehle, die ausgeführt werden sollen, getrennt durch Newline
    exec.StdIn.WriteLine(Befehle "`nexit")  ; Immer ein Exit am Ende!
    ; Liest die Ausgaben aller Befehle und gibt sie zurück
    return exec.StdOut.ReadAll()
}

Startet den angegeben Code als neuen AutoHotkey-Prozess.

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

; Beispiel:
InputBox expr,, Tragen Sie einen Ausdruck ein`, der in einem neuen Skript ausgewertet werden soll.,,,,,,,, Asc("*")
Ergebnis := ExecScript("FileAppend % (" expr "), *")
MsgBox % "Ergebnis: " Ergebnis