带有双引号参数的PHP exec()

带有双引号参数的PHP exec(),php,command-line-arguments,Php,Command Line Arguments,我在Windows上使用PHP的exec()函数运行命令时遇到问题。根据PHP网站上的评论: 在Windows中,exec()发出对“cmd/c your_command”的内部调用 我的命令如下所示: "path\to\program.exe" -flag1 attribute1 -flag2 attribute2 -flag3 "attribute3 attribute4" 在本地命令提示符中定期执行此命令时,如果不使用/c标志,则命令运行正常。但是,随着/c标志的引入,命令提示符告诉我“

我在Windows上使用PHP的exec()函数运行命令时遇到问题。根据PHP网站上的评论:

在Windows中,exec()发出对“cmd/c your_command”的内部调用

我的命令如下所示:

"path\to\program.exe" -flag1 attribute1 -flag2 attribute2 -flag3 "attribute3 attribute4"
在本地命令提示符中定期执行此命令时,如果不使用/c标志,则命令运行正常。但是,随着/c标志的引入,命令提示符告诉我“系统找不到指定的路径”

我认为命令提示符正在将双引号参数解释为另一个文件的路径,但这是我在这个问题上得到的最远的解释

有人对如何度过这一关有什么想法吗?谢谢

只是一个猜测(我不熟悉windows上的PHP):可能会将引号转义为
变成

无论解决方案是什么,请确保当有某种形式的用户输入作为您使用的参数和/或传递到此命令时。

只是猜测(我不熟悉windows上的PHP):可能将引号转义为
变成

无论解决方案是什么,请确保当有某种形式的用户输入作为您使用的参数和/或传递到此命令时。

我希望它会有所帮助


我希望这会有帮助



我自己已经找到了答案

在仔细阅读cmd.exe的/?为了解释这一点,我注意到了一个重要的部分:

  • 如果满足以下所有条件,则保留命令行上的引号字符:

    • No/S开关(带引号)
    • 正好两个引号字符
    • 两个引号字符之间没有特殊字符,其中特殊是以下之一:&<>()@^|
    • 两个引号字符之间有一个或多个空白字符
    • 两个引号字符之间的字符串是可执行文件的名称
  • 否则,旧的行为是查看第一个字符是否是引号字符,如果是,则去掉前导字符并删除命令行上的最后一个引号字符,保留最后一个引号字符之后的所有文本。要否定此行为,请在命令行的开头和结尾使用一组双引号“”

  • 似乎任何时候都有多对引号,引号将从第二对引号中删除,然后继续

    一个相关的问题:但并不完全相关,因为PHP不允许您通过在其调用上添加/S标志来修改其exec()命令(这肯定会容易得多)


    我通过使用chdir()直接将目录更改为.exe所在的文件夹,然后chdir()返回到我原来的工作目录,成功地解决了这个问题。考虑到我很幸运,我只有一组使用双引号的参数,这是一个非常粗糙的解决方案。如果有人用双引号引用多个论点,我不知道如何解决…

    我自己已经找到了答案

    在仔细阅读cmd.exe的/?为了解释这一点,我注意到了一个重要的部分:

  • 如果满足以下所有条件,则保留命令行上的引号字符:

    • No/S开关(带引号)
    • 正好两个引号字符
    • 两个引号字符之间没有特殊字符,其中特殊是以下之一:&<>()@^|
    • 两个引号字符之间有一个或多个空白字符
    • 两个引号字符之间的字符串是可执行文件的名称
  • 否则,旧的行为是查看第一个字符是否是引号字符,如果是,则去掉前导字符并删除命令行上的最后一个引号字符,保留最后一个引号字符之后的所有文本。要否定此行为,请在命令行的开头和结尾使用一组双引号“”

  • 似乎任何时候都有多对引号,引号将从第二对引号中删除,然后继续

    一个相关的问题:但并不完全相关,因为PHP不允许您通过在其调用上添加/S标志来修改其exec()命令(这肯定会容易得多)


    我通过使用chdir()直接将目录更改为.exe所在的文件夹,然后chdir()返回到我原来的工作目录,成功地解决了这个问题。考虑到我很幸运,我只有一组使用双引号的参数,这是一个非常粗糙的解决方案。如果有人用双引号引用了多个参数,我不知道如何解决这个问题……

    我也遇到了这个问题,其原因确实是,正如您在自己的回答中所描述的,“cmd/c”的内部用法

    我做了一些调查,发现这在PHP5.3中得到了解决,这就是为什么一些评论者无法复制它的原因

    它已在以下提交中修复:

    对于仍然需要支持PHP5.2的人来说,在自己的代码中复制修复程序是相当容易的。而不是:

    $cmd = "...any shell command, maybe with multiple quotes...";
    exec($cmd);
    
    使用

    $cmd=“…任何shell命令,可能带有多个引号…”;
    如果(strtoupper(substr(php_uname('s'),0,3))==“赢”
    
    &&version_compare(PHP_version,“5.3”和“我也遇到了这个问题,其原因确实是您自己的答案中描述的“cmd/c”的内部使用

    我做了一些调查,发现这在PHP5.3中得到了解决,这就是为什么一些评论者无法复制它的原因

    它已在以下提交中修复:

    对于仍然需要支持PHP 5.2的任何人来说,在自己的代码中复制修复程序是相当容易的。而不是:

    $cmd = "...any shell command, maybe with multiple quotes...";
    exec($cmd);
    
    使用

    $cmd = "...any shell command, maybe with multiple quotes..."; if (strtoupper(substr(php_uname('s'), 0, 3)) == "WIN" && version_compare(PHP_VERSION, "5.3", "<")) { $cmd = '"' . $cmd . '"'; } exec($cmd);