# Run / RunWait

运行一外部程序。与 Run 不同，RunWait 会等待运行的程序结束再继续下一行命令。

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

#### 参数

Target | 运行一文档、网址、可执行文件（.exe, .com, .bat 等等）、快捷方式(.lnk)或系统动作（见备注）。如果 Target 是个本地文件并且没有给它指定路径，A_WorkingDir 将先被搜索。如果没在那找到匹配的文件，系统将查找并且运行假如是被整合的(“已知”)文件，例如通过被包含在 PATH 文件夹其中的一个。（译注：PATH 文件夹应该指的是操作系统环境变量中的 PATH，被包含在这个 PATH 中的文件夹下的文件，都可以按 Win 键+R 后直接输入文件名来运行） 要传递参数，将他们立即添加在程序或文档名字后面。如果一参数包含空格，将其用双引号括起是最安全的（虽然它也能在某些情况下不需要他们而运作）。
WorkingDir | 被运行项目的工作目录。不要将名称括在双引号中即使它包含空格。如果此参数忽略，脚本所在的工作目录(A_WorkingDir)将被使用。
Max|Min|Hide UseErrorLevel | 如果此参数忽略，Target 将只被正常地运行。或者，它能包含一个或多个这些单词： Max: 最大化运行 Min: 最小化运行 Hide: 隐藏运行（以上任一个不能组合使用） 注意：一些程序（例如 Calc.exe）不遵守请求的启动状态，因此 Max/Min/Hide 将无效。 UseErrorLevel: UseErrorLevel 可单独被指定或加在以上单词后（将它与其他单词用空格分开）。如果命令运行失败，此选项跳过提示对话框，设置 ErrorLevel 为单词 ERROR，并允许当前线程继续。如果命令运行成功，RunWait 将 ErrorLevel 设置为程序的退出代码，Run 设置其为零。 当 UseErrorLevel 被指定时，变量 A_LastError 被设置成操作系统的 GetLastError() 函数的结果。A_LastError 是一个在 0 与 4294967295 之间的数字（总为十进制格式，不是十六进制）。零（0）意味着成功，除此之外其他数字意味着运行失败。每一数字相当于一个特定的错误状态（要取得一个列表，在 www.microsoft.com 以“system error codes”搜索）。与 ErrorLevel 相同，A_LastError 是一个独立线程设定；也就是说，被其他线程打断并不能改变它。但是 A_LastError 也能被 DllCall 设定。
OutputVarPID | 变量的名字用来储存最近运行的程序的唯一 Process ID (PID)。如果 PID 不能被定义，变量将为空，其通常发生在一个系统动作、文档或快捷方式被运行，而不是一个直接可执行的文件。RunWait 也支持此参数，尽管它的 OutputVarPID 必须在另一个线程核实（否则，PID 将因为进程在 RunWait 下一行执行的时候终止而无效）。 在 Run 命令取得一个 PID 后，任何由进程创建的窗口可能还不存在。为了等待至少一个窗口被创建，使用 WinWait ahk_pid %OutputVarPID%

#### ErrorLevel

Run: 不设置 ErrorLevel 除非使用了 UseErrorLevel(上面的)，这样的话，ErrorLevel 在命令执行失败时被设置成单词 ERROR 或者在成功时设置为 0。

RunWait: 将 ErrorLevel 设为程序的退出代码（一个标记成 32 位的整数型）。如果使用了 UseErrorLevel 且命令执行失败，则 ErrorLevel 被存作单词 ERROR。

#### 备注

不同于 Run，RunWait 会等到 Target 关闭或者退出，这时 ErrorLevel 被设为程序的退出代码（作为一个标记为 32 位的整数型）。即使有些程序仍在运行，RunWait 也会马上出现返回；这些程序创建了另外的进程。

如果 Target 包含任何逗号，它们一定要像下面的例子里出现的三次一样被转义：

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

当通过 Comspec (即 cmd.exe，译注：命令解释程序 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

特殊的 CLSID 文件夹可以通过 Run 被打开。例如：

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

系统动作相当于在资源管理器中一个文件的右键菜单动作可用。如果一个文件没有一个动作来运行，这特殊的文件类型的默认动作（通常是“打开”）将被使用。如果指定了，这动作应该跟在 target 文件名的后面。下列动作是当前被支持的：

properties | 为指定文件显示资源管理器的属性窗口。例如：Run, properties "C:\My File.txt" 注意：当脚本终止的时候属性窗口会自动关闭。为避免这种情况，使用 WinWait 来等待窗口出现，然后用 WinWaitClose 等待用户去关闭它。
find | 打开一个资源管理器的搜索助理窗口或者在指定文件夹的查找文件窗口。例如：Run, find D:\
explore | 在指定文件夹打开一个资源管理器窗口。例如：Run, explore %A_ProgramFiles%
edit | 打开一个指定的文件来编辑。如果指定的文件类型没有“编辑”动作与之关联，它可能不起作用。例如：Run, edit "C:\My File.txt"
open | 打开指定的文件 (一般不需要，因为这是大多数文件类型的默认动作)。例如：Run, open "My File.txt"
print | 使用与之关联的应用程序来打印指定的文件，如果有的话。例如：Run, print "My File.txt"

当 RunWait 在等待状态时，新的线程能通过热键，自定义菜单项或者定时器来运行。

#### 相关命令

RunAs, Process, Exit, CLSID List, DllCall

#### 范例

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

    Run, mailto:someone@domain.com?subject=This is the subject line&body=This is the message body's text.
    Run, ReadMe.doc, , Max UseErrorLevel  ;以最小化运行并且如果失败则不显示对话框。
    if ErrorLevel = ERROR
        MsgBox 无法启动文档。

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

    Run, www.autohotkey.com ;也就是说能运行任何 URL。
    Run, mailto:someone@somedomain.com  ;这将打开默认的 e-mail 程序。

    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

翻译：天堂之门 menk33@163.com 2008年10月24日