【问题标题】:How do I to properly handle spaces in PHP Shell_exec?如何正确处理 PHP Shell_exec 中的空格?
【发布时间】:2010-09-27 13:38:27
【问题描述】:

我通过命令行在 win2003 服务器 PHP 526 上运行。

我有一个命令行字符串:

$cmd = '  "d:\Prog Files\foo.exe" -p "d:\data path\datadir"  ';  

尝试在 php 代码中执行此操作

$out = `$cmd`;       # note use of backticks AKA shell_exec

导致 foo.exe 失败,因为它将 -p arg 解释为“d:\data”。

但是,复制到 Windows shell cmdline 的相同 $cdm 字符串执行成功。

如何正确处理 PHP shell_exec 中的空格?

【问题讨论】:

  • 您的问题的格式已关闭。在代码示例前面使用 4 个空格!

标签: php shell-exec


【解决方案1】:

使用 escapeshellarg() 转义你的参数,它应该为你的平台使用适当的引号和转义空格组合来转义它(我猜你在 Windows 上)。

【讨论】:

  • 这就是你要找的答案:)
  • 你不喜欢 PHP 中那些函数命名的一致性吗? :-/
【解决方案2】:

与需要转义引号内的引号的 Unix 不同,Windows 似乎不能以这种方式工作。它如何跟踪报价超出了我的范围,但这实际上似乎有效,尽管所有逻辑都相反:

$cmd = '" "C:\Path\To\Command" "Arg1" "Arg2" "';
$fp = popen($cmd, 'r');
$输出='';
而 ($l = fgets($fp, 1024))
$输出。=$ l;

我猜 command.exe 正在获取命令字符串总数并取消(否则是多余的)外部引号。如果没有这些外部引号,DOS 会做一些奇怪的事情。此解决方案类似于 user187383 的帖子,但取消了“cmd /c”,它只会混淆实际发生的情况以及轻微的性能下降,因为 cmd /c 首先是由 shell 调用隐含的!

【讨论】:

    【解决方案3】:

    这是一个有趣的问题。显然,PHP 允许您在程序或参数周围加上双引号,但不能同时使用这两者。可能值得将此作为错误报告。

    一种解决方法是使用 DOS 8.3 名称而不是引号。例如,“C:\Program Files\”通常会变成“C:\Progra~1”。

    【讨论】:

      【解决方案4】:

      也有这个问题 - 想出了一个通过 cmd.exe 路由启动的想法。这里的诀窍是不要迷失在双引号中。通常你想把任何你想运行的东西放进去:

      exec('cmd /c " '.$path.' "';
      

      其中 $path 是您的可执行文件的双引号路径。示例:

      $path = '"C:\Program Files\ToDoList Simple\ToDoList.exe" "C:\SomePath\todo.tdl" -nt test -cm test2';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        相关资源
        最近更新 更多