[英]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 不同,PowerShell 并未正式弃用或“半弃用”。 我在这方面遇到了很多问题,但这是专门针对 PHP CLI 的。
基本上,如果我使用 .ps1 脚本(即 PowerShell v1,我认为这是 PowerShell 的当前版本)来运行 PHP 脚本(同样是“php test.php”),它会按预期在 PowerShell 中启动,但是如果我然后使用 PHP 中的任何 shell_exec() 或类似函数打开新的 PHP 脚本,它似乎总是默认使用 cmd.exe 而不是 PowerShell。
一种“解决方法”似乎是明确调用:
powershell actualcommand
但这与实际使用 PowerShell 不同。 这似乎更像是将 PowerShell 嵌入到 cmd.exe 终端中。 我希望专门使用 PowerShell 而不是 PHP 中的 cmd.exe。 我已经搜索并搜索过,但我找不到任何类型的 php.ini 设置或任何可以指示 PHP 使用哪个终端的类型。
使 PHP CLI 使用特定 shell/二进制文件来处理与终端相关的内容的正确方法是什么? 或者它是硬编码到 Windows 上的 cmd.exe 吗?
如果我理解正确,那么您正在寻找一种方法,让 PHP 使用PowerShell而不是cmd.exe
作为system()
和shell_exec()
等函数中的外壳。
鉴于 PowerShell 越来越多地取代cmd.exe
,这种愿望是可以理解的 - 为什么不在所有方面都转向 PowerShell?
不幸的是,这样做将是一个巨大的突破性变化,因为为cmd.exe
编写的具有system()
/ shell_exec()
调用的现有代码可能会中断,因为cmd.exe
和 PowerShell 具有根本不同的语法。
所有提供运行 shell 命令功能的现有脚本语言都面临这个问题。
顺便说一句:一个更基本的问题是运行 shell 命令的代码是特定于平台的。
即使有一种选择加入的方式来更改默认 shell - 并且没有 - 它也必须限于您的代码,以免破坏第三方代码。
一般来说,脚本语言只有两种方式来实现这种转变:
致力于打破向后兼容性,要求为 PowerShell(重新)编写所有代码。
在每个代码单元的基础上选择加入转换,其中(新)代码必须明确表示希望使用 PowerShell 作为默认 shell。
因此,我认为您必须通过使用exec()
并显式调用PowerShell 的 CLI来放弃shell_exec()
的便利性; 例如,执行命令Get-Date; "Hello, world."; exit 42
Get-Date; "Hello, world."; exit 42
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
。
请注意可能令人惊讶的需要\\
转义嵌入的"
字符。-请参阅此 GitHub 问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.