4

我通过命令行在 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”。

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

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

4

4 回答 4

6

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

于 2008-12-18T17:42:22.227 回答
1

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

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

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

于 2011-02-22T23:40:16.230 回答
0

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

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

于 2009-10-07T02:38:18.167 回答
0

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

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

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

$path = '"C:\Program Files\ToDoList Simple\ToDoList.exe" "C:\SomePath\todo.tdl" -nt test -cm test2';
于 2009-10-09T19:01:08.283 回答