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.
我在 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.