## 在 Windows 系统的命令行上运行 PHP

本章包含有针对在 Windows 下以命令行运行 PHP 的说明与提示。

> 注意:

> 阅读 手工安装步骤！

要在命令行下运行 PHP，可以无需对 Windows 做任何改动。

    C:\php\php.exe -f "C:\PHP Scripts\script.php" -- -arg1 -arg2 -arg3

但是有几个很容易的步骤可以使其更加简便。某些步骤可能已经在之前完成了，不过还是在这里重复说明以便提供一个完整的步骤序列。

> 注意:

> PATH 和 PATHEXT 都是在 Windows 下已有的重要环境变量，要留意不要覆盖了其内容，仅仅是向其中添加内容。

- 将 PHP 可执行文件（php.exe，php-win.exe 或者 php-cli.exe）的路径添加到 PATH 环境变量中去。如何将 PHP 目录添加到 PATH 中请参阅与之相关的常见问题。

- 将 `.PHP` 后缀添加到 PATHEXT 环境变量中去。可以在修改 PATH 环境变量时同时进行。跟常见问题中说明的步骤一样，要修改的是 PATHEXT 环境变量而不是 PATH 环境变量。

  > 注意:

  > 把 `.PHP` 放置到什么位置将决定具有相同文件名时运行的优先级。例如将 `.PHP` 放到 `.BAT` 之前将导致如果有同名的 PHP 脚本和批处理文件，则 PHP 脚本会运行。

- 将 `.PHP` 后缀关联为一种文件类型，用以下命令完成：

      assoc .php=phpfile

- 将 `phpfile` 文件类型关联到适当的 PHP 可执行文件，用以下命令完成：

      ftype phpfile="C:\php\php.exe" -f "%1" -- %~2

按照以上步骤将使 PHP 脚本可以在任何目录下运行，不需要输入 PHP 可执行文件名以及 `.PHP` 后缀，并且所有参数都会被传递给脚本来处理。

以下例子说明了可以手工修改的注册表项目变化。

示例 #1 注册表变化

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.php]
    @="phpfile"
    "Content Type"="application/php"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile]
    @="PHP Script"
    "EditFlags"=dword:00000000
    "BrowserFlags"=dword:00000008
    "AlwaysShowExt"=""

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\DefaultIcon]
    @="C:\\php\\php-win.exe,0"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell]
    @="Open"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open]
    @="&Open"

    [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\phpfile\shell\Open\command]
    @="\"C:\\php\\php.exe\" -f \"%1\" -- %~2"

有了这些改变之后，本页顶端第一个例子中的命令可以写成这样：

    "C:\PHP Scripts\script" -arg1 -arg2 -arg3

或者如果 `"C:\PHP Scripts"` 目录位于 PATH 环境变量中的话：

    script -arg1 -arg2 -arg3

> 注意:

> 当打算使用这种技术作为命令行过滤器运行 PHP 脚本时，会出现一个小问题，例如以下例子：

>     dir | "C:\PHP Scripts\script" -arg1 -arg2 -arg3

> 或者

>     dir | script -arg1 -arg2 -arg3

> 脚本可能会直接挂起，没有任何输出。 要使其正常运行，需要对注册表进行另一项更改：

>     Windows Registry Editor Version 5.00

>     [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer]
>     "InheritConsoleHandles"=dword:00000001

> 有关此问题的更多信息见» 微软知识库文章：321788。 从 Windows 10 开始，此设置似乎被颠倒，请参考以下链接 » Microsoft 论坛帖子。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open