PowerShell调用带3个参数PHP页面方法及无法打开文件报错修复
报错核心原因
现有代码将待传递的业务参数直接拼接在PHP文件路径字符串中,最终传入php.exe -f参数的内容为类似C:\Admin\www\xpress\testing.php 170 3的字符串,PHP CLI会将整段内容识别为文件路径进行查找,自然无法找到名称包含空格、数字的目标文件,触发无法打开文件的报错。
PowerShell端正确传参写法
调用PHP CLI传参时,-f参数后仅可传入纯PHP文件的绝对路径,待传递的自定义参数需要单独按顺序追加在后面,禁止和文件路径混拼。使用数组方式组装传参可以避免Windows下引号转义、空格截断问题,传递3个参数的修正后代码如下:
# 定义待传递的3个业务参数 $workflow_id = 170 $task_num = 3 $third_param = "your_third_value" # 替换为实际需要的第三个参数值 $next_script = 'testing.php' $PhpExe = "C:\Admin\bin\php\php7.4.26\php.exe" # 拼接PHP文件的完整绝对路径,避免反斜杠转义问题 $PhpFilePath = Join-Path "C:\Admin\www\xpress\" $next_script # 组装调用参数:-f 指定PHP文件,后面依次跟3个自定义参数 $PhpArgs = @('-f', "`"$PhpFilePath`"", $workflow_id, $task_num, $third_param) # 执行调用并输出结果 $PhpOutput = & $PhpExe $PhpArgs echo $PhpOutput
使用
Join-Path拼接Windows路径比直接字符串拼接更稳妥,可自动处理路径分隔符的格式问题。
PHP端接收参数说明
CLI命令行模式下运行PHP,无法通过Web模式的$_GET、$_POST接收参数,需要通过PHP内置的超全局数组$argv按索引顺序读取:
$argv[0]:固定值,为当前运行的PHP脚本文件名$argv[1]:对应PowerShell传递的第一个参数(示例中为$workflow_id)$argv[2]:对应PowerShell传递的第二个参数(示例中为$task_num)$argv[3]:对应PowerShell传递的第三个参数
修正后的PHP代码参考(补充相对路径加载兼容,避免找不到include文件):
<?php // 切换到当前脚本所在工作目录,解决相对路径引入文件找不到的问题 chdir(dirname(__FILE__)); include("commons/connection.php"); // 按顺序接收参数,建议根据参数实际类型做格式校验 $workflow_id = intval($argv[1]); $task_num = intval($argv[2]); $third_param = trim($argv[3]); // 第三个参数根据实际业务做类型转换 // 注意:直接变量拼接SQL存在注入风险,生产环境建议改用mysqli预处理语句执行 $update_pass = "UPDATE workflow_details SET Status ='mm' where `Workflow_Number` = $workflow_id and Work_type = 'PrepWork' and Task_Number = $task_num " ; $status_result = mysqli_query($con, $update_pass); ?>
内容的提问来源于stack exchange,提问作者Mani Karthi
相关产品推荐
相关产品推荐

