繁体   English   中英

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 不同,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM