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 = '@(\"'.implode('\",\"',$_POST["groups"]).'\")'; 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)的参数解析规则:
- PHP生成的
@("grp1","grp2")字符串,在通过shell_exec传递时会经过cmd.exe解析。cmd会将双引号视为参数的边界标记,而非参数内容的一部分,因此直接剥离引号,导致PowerShell接收到的是grp1 grp2。 - PHP中使用的
\"是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
相关产品推荐
相关产品推荐

