Run / RunWait

AutoHotkey

Run / RunWait

运行外部程序。与 Run 不同, RunWait 会等待程序结束才继续往后执行.

Run, Target [, WorkingDir, Max|Min|Hide|UseErrorLevel, OutputVarPID]

参数

Target

要运行的文档, URL, 可执行文件 (.exe, .com, .bat, 等等), 快捷方式 (.lnk) 或 系统动词 (请参阅备注). 如果 Target 是本地文件且指定时没有包含路径, 则首先搜索 A_WorkingDir. 如果那里没有找到匹配的文件, 如果它是集成的 ("已知") 则系统会搜索并运行此文件, 例如包含在 PATH 环境变量的其中某个文件夹中.

要传递参数, 请让它们紧跟在程序或文档名的后面. 如果参数包含空格, 则把它们括在双引号中是最可靠的 (虽然它在某些情况下没有括在双引号中也能工作).

WorkingDir

用于运行项目的工作目录. 即使它包含空格, 也不要括在双引号中. 如果省略, 则使用脚本自己的工作目录 (A_WorkingDir).

Max|Min|Hide
UseErrorLevel

如果省略, 则正常运行 Target. 或者, 它可以包含一个或多个这些单词:

Max: 最大化运行

Min: 最小化运行

Hide: 隐藏运行 (不能和上面任意一个选项组合使用)

注: 一些程序 (例如 Calc.exe) 不会遵循请求的启动状态, 因此对于它们 Max/Min/Hide 没有效果.

UseErrorLevel: 可以单独指定 UseErrorLevel 或和上面的其中一个单词组合使用 (把它和其他单词用空格分隔). 如果运行失败, 则使用此选项会跳过警告对话框, 设置 ErrorLevel 为单词 ERROR, 并让 当前线程 继续执行. 如果运行成功, 则 RunWait 会把 ErrorLevel 设置为程序的退出代码, 而 Run 把它设置为 0.

指定 UseErrorLevel 时, 变量 A_LastError 被设置为操作系统 GetLastError() 函数返回的结果. A_LastError 是一个介于 0 和 4294967295 之间的数字 (总是为十进制而非十六进制). 零 (0) 意味着成功, 但其他任何数字意味着运行失败. 每个数字对应一种特定的错误状态 (要获取整个列表, 请在 www.microsoft.com 中搜索 "system error codes"). 像 ErrorLevel 一样,A_LastError 是与每个线程关联的设置,即由其他线程产生的中断不会改变它。然而, A_LastError 还可能由 DllCall 设置.

OutputVarPID

变量名, 用来存储新运行程序的唯一 进程 ID (PID). 如果无法确定则 PID 被设置为空, 这经常发生在运行系统动词, 文档或快捷方式而不是直接的可执行文件时. RunWait 也支持此参数, 不过它获取的 OuputVarPID 必须在 另一个线程 中进行检查 (否则, 这个 PID 将是无效的, 因为 RunWait 后的代码执行时相应的进程已经终止了).

在 Run 命令获取 PID, 此进程要创建的窗口可能还不存在. 要等待它至少创建一个窗口,请使用 WinWait ahk_pid %OutputVarPID%

ErrorLevel

[v1.1.04+] 此命令失败时会抛出异常. 想了解更多信息, 请参阅 运行时错误.

Run: 只有在使用了 UseErrorLevel 时才会设置 ErrorLevel, 在这种情况下失败时 ErrorLevel 被设置为单词 ERROR 而成功时为 0.

RunWait: 设置 ErrorLevel 为程序的退出代码 (32 位的有符号整数). 如果使用了 UseErrorLevel 且运行失败, 则把它设置为单词 ERROR.

备注

与 Run 不同, RunWait 会等待 Target 关闭或退出, 此时 ErrorLevel 被设置为程序的退出代码 (32 位的有符号整数). 一些程序即使它们仍在运行但看起来立即返回了; 这些程序启动了另外的进程.

如果 Target 包含逗号, 则必须对它们进行 转义, 如同下面例子中的三次演示:

Run rundll32.exe shell32.dll`,Control_RunDLL desk.cpl`,`, 3  ; 打开控制面板 > 显示属性 > 设置

通过 Comspec (cmd.exe) 运行程序时 (也许由于您需要重定向程序的输入和输出), 如果可执行程序的路径或名称包含空格, 则整个字符串必须括在一对外部的引号中. 在下面的例子中, 外部引号显示为红色, 而内部所有的引号显示为黑色:

Run %comspec% /c ""C:\My Utility.exe" "param 1" "second param" >"C:\My File.txt""

如果无法启动 Target,则显示错误窗口,然后脚本表现的就像遇到 Exit 命令那样。要避免这种情况, 请在第三个参数中添加字符串 UseErrorLevel.

Target 为准确路径时可轻微提升性能,例如使用 Run, C:\Windows\Notepad.exe "C:\My Documents\Test.txt" 代替 Run, C:\My Documents\Test.txt

Run 还可以打开特殊的 CLSID 文件夹. 例如:

Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; 打开 "我的电脑" 文件夹.
Run ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 打开回收站.

系统动词对应于资源管理器中文件右键菜单的可用操作. 如果启动文件时没有指定动词, 则使用那种文件类型的默认动词 (通常为 "打开"). 如果指定了, 则动词后应该跟着默认文件名. 目前支持下列动词:

*动词 [AHK_L 57+]: 任何系统定义或自定义的动词. 例如: Run *Compile %A_ScriptFullPath%
在 Windows Vista 和更高版本中,可以使用 *RunAs 动词代替以管理员身份运行右键菜单。
properties 显示指定文件的资源管理器属性窗口. 例如: Run, properties "C:\My File.txt"
注: 当脚本终止时属性窗口会自动关闭. 要避免这种情况, 请使用 WinWait 等待窗口出现, 然后使用 WinWaitClose 等待用户关闭它.
find 在指定的文件夹中打开资源管理器的搜索助理或查找文件窗口实例. 例如: Run, find D:\
explore 打开指定文件夹的资源管理器实例. 例如:Run, explore %A_ProgramFiles%
edit 打开指定的文件进行编辑. 如果指定的文件类型没有关联 "edit" 动作时, 它不起作用. 例如: Run, edit "C:\My File.txt"
open 打开指定的文件 (一般不需要, 因为这对于大多数文件类型是默认的动作). 例如:Run, open "My File.txt"
print 使用关联的应用程序打印指定的文件,如果有。例如: Run, print "My File.txt"

当 RunWait 处于等待状态时, 可以通过 热键, 自定义菜单项计时器 启动新的 线程.

相关

RunAs, Process, Exit, CLSID 列表, DllCall

示例

Run, Notepad.exe, C:\My Documents, max

Run, mailto:[email protected]?subject=This is the subject line&body=This is the message body's text.
Run, ReadMe.doc, , Max UseErrorLevel  ; 最小化运行, 且在失败时不显示对话框.
if ErrorLevel = ERROR
    MsgBox The document could not be launched.

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

Run, http://www.google.com ; 即可以运行任意网址。
Run, mailto:[email protected]  ; 这样应该会打开默认的电子邮件程序。

Run ::{20d04fe0-3aea-1069-a2d8-08002b30309d}  ; 打开“我的电脑”文件夹。
Run ::{645ff040-5081-101b-9f08-00aa002f954e}  ; 打开回收站。

; 要连续执行多个命令,请在命令间使用“&&”分隔:
Run, %comspec% /c dir /b > C:\list.txt && type C:\list.txt && pause