Run / RunWait

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

Run, Ziel [, Arbeitsverz, Max|Min|Hide|UseErrorLevel, AusgabeVarPID]
RunWait, Ziel [, Arbeitsverz, Max|Min|Hide|UseErrorLevel, 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.

Damit Parameter übergeben werden können, müssen sie unmittelbar nach dem Programm- oder Dokumentnamen erfolgen. Wenn ein Parameter Leerzeichen enthält, sollte man ihn sicherheitshalber in Anführungszeichen setzen (auch wenn es in einigen Fällen ohne sie funktionieren würde).

Arbeitsverz

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

Max|Min|Hide
UseErrorLevel

Fehlt dieser Parameter, wird das Ziel normal gestartet. Ansonsten kann eines oder mehrere der folgenden Wörter angegeben werden:

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 Warnungsfenster ü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 system-internen 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 auch, eine Pro-Thread-Einstellung; das heißt, dass Unterbrechungen durch andere Threads den Wert nicht ändern können. Allerdings wird A_LastError auch von DllCall gesetzt.

AusgabeVarPID

Name der Variable, 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 ein Systemverb, ein Dokument oder eine Verknüpfung gestartet wird, anstatt eine ausführbare Datei. 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.

ErrorLevel

[v1.1.04+] Dieser Befehl ist in der Lage, bei Misserfolg eine Ausnahme auszulösen. Für mehr Informationen, siehe Laufzeitfehler.

Run: Setzt ErrorLevel nur, wenn UseErrorLevel (siehe oben) aktiv ist - dabei wird ErrorLevel bei Misserfolg auf ERROR und bei Erfolg auf 0 gesetzt.

RunWait: Setzt ErrorLevel auf den Exitcode des Programms (ein vorzeichenbehafteter 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 vorzeichenbehafteter 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 sie mit einem Escapezeichen versehen werden, wie es in dem folgenden Beispiel dreimal gemacht wird:

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 werden die äußeren Anführungszeichen in rot und alle inneren Anführungszeichen in schwarz dargestellt:

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

Wenn Ziel nicht gestartet werden kann, wird ein Fehlerfenster angezeigt und der aktuelle Thread beendet, sofern man UseErrorLevel nicht im dritten Parameter verwendet oder den Fehler nicht via Try/Catch-Anweisung abgefängt.

Die Performance 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 [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 beendet wird. Um das zu verhindern, wartet man via WinWait, bis das Fenster erscheint, und dann via WinWaitClose, bis der Benutzer das Fenster schließt.
find Öffnet eine Instanz vom Explorer's Such-Assistenten oder Suchergebnisfenster 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 per Hotkey, benutzerdefinierte Menüeinträge 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 neu zustarten:

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.

Siehe auch

RunAs, Process, Exit, CLSID-Liste, DllCall

Beispiele

Run, Notepad.exe, C:\Meine Dokumente, max

Run, mailto:someone@domain.com?subject=Das ist die Betreffzeile.&body=Das ist der Haupttext der Nachricht.
Run, ReadMe.doc, , Max UseErrorLevel  ; Startet maximiert und zeigt bei Misserfolg kein Dialogfenster an.
if ErrorLevel = ERROR
    MsgBox Das Dokument konnte nicht geöffnet werden.

RunWait, %comspec% /c dir c:\ >>c:\DirTest.txt, , min
Run, c:\DirTest.txt
Run, properties c:\DirTest.txt

Run, http://www.google.com ; Jede URL kann geöffnet werden.
Run, mailto:someone@somedomain.com  ; Dies sollte die voreingestellte E-Mail-Anwendung öffnen.

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

; Mit "&&" können mehrere Befehle hintereinander ausgeführt werden:
Run, %comspec% /c dir /b > C:\Liste.txt && type C:\Liste.txt && pause
; Das folgende Beispiel zeigt, wie ein Befehl ausgeführt und seine Ausgabe ermittelt werden kann:
MsgBox % RunWaitEin("dir " A_ScriptDir)

; ...oder wie mehrere Befehle in einem Rutsch ausgeführt und deren Ausgaben ermittelt werden können:
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) {
    ; WshShell-Objekt: http://msdn.microsoft.com/en-us/library/aew9yb99
    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()
}
; ExecScript: 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