Windows 上的 PHP CLI 是否针对 cmd.exe 进行了硬编码,或者我能否以某种方式使其使用 PowerShell?

Is PHP CLI on Windows hardcoded for cmd.exe, or can I somehow make it use PowerShell?

我在 Windows 上使用 PHP CLI。直到最近,我一直使用 .bat 文件来启动 PHP 脚本(基本上是 "php test.php"),它使用 cmd.exe 终端。出于多种原因,我正在尝试迁移到 PowerShell,与 cmd.exe 不同,它没有被正式弃用或 "semi-deprecated"。我遇到过很多问题,但这是关于 PHP CLI 的。

基本上,如果我使用 .ps1 脚本(即 PowerShell v1,我认为它是 PowerShell 的当前版本)到 运行 PHP 脚本(同样,"php test.php"),它按预期在 PowerShell 中启动,但如果我随后使用任何 shell_exec() 或 PHP 中的类似函数打开新的 PHP 脚本,它似乎总是默认使用 cmd.exe 而不是 PowerShell。

一个"workaround"好像是明确调用:

powershell actualcommand

但这与使用 PowerShell 实际上 不同。它似乎更像是将 PowerShell 嵌入 cmd.exe 终端。我希望专门使用 PowerShell 而不是 PHP 中的 cmd.exe。我搜索了又搜索,但我找不到任何类型的 php.ini 设置或任何可以指示 PHP 使用哪个终端的类型。

使 PHP CLI 将特定 shell/binary 用于终端相关内容的正确方法是什么?还是在 Windows 上硬编码为 cmd.exe?

如果我没理解错的话,你正在寻找一种方法让 PHP 使用 PowerShell 而不是 cmd.exe 作为 shell 在 system()shell_exec().

等函数中

鉴于 PowerShell 越来越多地取代 cmd.exe,这种愿望是可以理解的 - 为什么不在 所有 方面转向 PowerShell?

不幸的是,这样做将是一个巨大的破坏性变化,因为为 cmd.exe 编写的带有 system() / shell_exec() 调用的现有代码可能会中断,因为 cmd.exe 和 PowerShell 具有根本不同的语法。

所有为 运行 shell 命令提供功能的现有脚本语言都面临这个问题。

顺便说一句:一个更基本的问题是运行 shell 命令的代码是 平台特定的 .

即使有 opt-in 方法来更改默认 shell - 但没有 - 它也必须限定为 你的代码,以免破坏第三方代码。

一般来说,脚本语言只有两种方式来进行这种转换:

  • 致力于打破向后兼容性,要求为 PowerShell(重新)编写所有代码。

  • 每个代码单元的基础上选择加入,其中(新)代码必须明确表示希望使用 PowerShell 作为默认 shell.

因此,我认为 您将不得不放弃 shell_exec() 的便利性,而是使用 exec() 并显式调用 PowerShell's CLI;例如,执行命令 Get-Date; "Hello, world."; exit 42:

<?php

exec('powershell -noprofile -command Get-Date; \"Hello, world.\"; exit 42', $output, $exitCode);

// Output the captured stdout lines and the exit code.
echo implode("\n", $output);
echo "\nExit code: " . $exitCode

?>

exec()一般的优点是可以报告进程'退出代码,而shell_exec()不能。

如果调用 脚本文件 (*.ps1),请使用 -file 而不是 -command

要调用 PowerShell Core 而不是 Window PowerShell,请使用 pwsh.exe 而不是 powershell.exe

请注意,可能令人惊讶地需要 \-转义嵌入的 " 字符。 - 见 this GitHub issue.