Run / RunWait

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

Run Ziel , ArbeitVerz, Optionen, &AusgabeVarPID
ExitCode := RunWait(Ziel , ArbeitVerz, Optionen, &AusgabeVarPID)

Parameter

Ziel

Typ: Zeichenkette

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

Typ: Zeichenkette

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.

Optionen

Typ: Zeichenkette

Wenn leer oder weggelassen, wird Ziel normal gestartet. 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.

&AusgabeVarPID

Typ: VarRef

Wenn weggelassen, wird der zugehörige Wert nicht gespeichert. Andernfalls geben Sie eine Referenz an, die auf eine Ausgabevariable verweist, 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 die Run-Funktion 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.

Rückgabewert

Typ: Integer

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

Fehlerbehandlung

Wenn Ziel nicht gestartet werden kann, wird eine Ausnahme ausgelöst (d.h. eine Fehlermeldung angezeigt) und der aktuelle Thread beendet, es sei denn, der Fehler wird mit einer Try/Catch-Anweisung abgefangen. Zum Beispiel:

try
    Run "NichtExistierendeDatei"
catch
    MsgBox "Datei existiert nicht."

Die interne Variable A_LastError wird auf das Ergebnis der Systemfunktion GetLastError() 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

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 A_ComSpec ' /c ""C:\Mein Tool.exe" "param 1" "zweiter param" >"C:\Meine Datei.txt""'

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 Ein beliebiges systemdefiniertes oder benutzerdefiniertes Verb. Zum Beispiel: Run "*Compile " A_ScriptFullPath. Das Verb *RunAs kann 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"'

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

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:

Der AutoHotkey-Installer registriert das RunAs-Verb für .ahk-Dateien, wodurch Run "*RunAs skript.ahk" ein Skript als Administrator starten kann.

RunAs, Process-Funktionen, 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.

try Run("ReadMe.doc", , "Max")
if A_LastError
    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.

RunWait A_ComSpec " /c dir C:\ >>C:\DirTest.txt", , "Min"
Run "C:\DirTest.txt"
Run "properties C:\DirTest.txt"
Persistent  ; Verhindern, dass sich das Skript beendet, sonst wird das Eigenschaftenfenster geschlossen.

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 A_ComSpec " /c dir /b > C:\Liste.txt && type C:\Liste.txt && pause"

Die folgenden benutzerdefinierten 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 := ComObject("WScript.Shell")
    ; Einen Befehl via cmd.exe ausführen
    exec := shell.Exec(A_ComSpec " /C " Befehl)
    ; Ausgabe des Befehls lesen und zurückgeben
    return exec.StdOut.ReadAll()
}

RunWaitViele(Befehle) {
    shell := ComObject("WScript.Shell")
    ; cmd.exe mit deaktivierter Textanzeige öffnen
    exec := shell.Exec(A_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 := ComObject("WScript.Shell")
    exec := shell.Exec("AutoHotkey.exe /ErrorStdOut *")
    exec.StdIn.Write(Skript)
    exec.StdIn.Close()
    if Warten
        return exec.StdOut.ReadAll()
}

; Beispiel:
ib := InputBox("Tragen Sie einen Ausdruck ein, der als neuer Skript ausgewertet werden soll.",,, 'Ord("*")')
if ib.result = "Cancel"
    return
Ergebnis := SkriptAusführen('FileAppend ' ib.value ', "*"')
MsgBox "Ergebnis: " Ergebnis