You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用PowerShell参数异常:数组格式丢失,求原因及解决方法

问题:PHP调用PowerShell传递数组参数格式异常

之前PHP调用PowerShell脚本传递参数一切正常,现在出现异常:PHP侧生成格式为@(\"grp1\",\"grp2\")的字符串,到PowerShell端却变成了grp1 grp2,其中$_POST["groups"]是数组。

相关代码

PHP代码

<?php

$ADJoinGroups = "C:\Scripts\AD_Joingrps.ps1";

$entity = $_POST["entity"];
$fName = $_POST["fName"];
$lName = $_POST["lName"];
$desc = $_POST["description"];
$password = "#####";

$groups = '@(\&quot;'.implode('\&quot;,\&quot;',$_POST["groups"]).'\&quot;)';

echo '<pre>'; print_r($groups); echo '</pre>';

if (isset($_POST['cGrps'])) {
$res1 = shell_exec("powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command $ADJoinGroups $fName $lName $groups 2>&1");
echo $res1;
}

?>

PowerShell代码

###### Args ######
$fName = $args[0];
$lName = $args[1];
$groups = $args[2];

Write-output $groups;

问题原因

核心问题是Windows命令行(cmd.exe)的参数解析规则:

  1. PHP生成的@("grp1","grp2")字符串,在通过shell_exec传递时会经过cmd.exe解析。cmd会将双引号视为参数的边界标记,而非参数内容的一部分,因此直接剥离引号,导致PowerShell接收到的是grp1 grp2。
  2. PHP中使用的\&quot;是HTML实体转义,最终生成带双引号的字符串,但这种转义对命令行解析无效,反而会被cmd错误处理。

解决方法

方法一:从PHP端修正传参(推荐)

通过正确的命令行转义,确保PowerShell能完整接收数组格式的参数:

<?php

$ADJoinGroups = "C:\Scripts\AD_Joingrps.ps1";

$entity = $_POST["entity"];
$fName = $_POST["fName"];
$lName = $_POST["lName"];
$desc = $_POST["description"];
$password = "#####";

// 用单引号包裹组名,生成PowerShell兼容的数组语法
$groupItems = implode("','", $_POST["groups"]);
$groups = "@('$groupItems')";

echo '<pre>'; print_r($groups); echo '</pre>';

if (isset($_POST['cGrps'])) {
    // 用单引号包裹所有参数,避免cmd解析引号时出错
    $command = "powershell -InputFormat none -ExecutionPolicy ByPass -NoProfile -Command & '$ADJoinGroups' '$fName' '$lName' '$groups' 2>&1";
    $res1 = shell_exec($command);
    echo $res1;
}

?>

这种方式从源头避免了命令行解析的问题,即使组名包含空格或特殊字符也能正常传递。

方法二:在PowerShell端恢复格式(仅应急使用)

如果无法修改PHP代码,可以在PowerShell中将接收到的字符串重新格式化为目标样式:

###### Args ######
$fName = $args[0];
$lName = $args[1];
$groupsRaw = $args[2];

# 将空格分隔的字符串拆分为数组
$groupArray = $groupsRaw -split '\s+'
# 重新生成@("grp1","grp2")格式的字符串
$groups = "@(`"$($groupArray -join '","')`")"

Write-output $groups;

注意:如果组名包含空格,这种拆分方法会失效,因此仅作为临时应急方案。


内容的提问来源于stack exchange,提问作者Ben74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 08:55:56