如何在PHP Shell_exec中正确处理空格?

时间:2008-12-18 17:00:21

标签: php shell-exec

我通过cmd-line运行win2003服务器,PHP 526。

我有一个cmdline字符串:

$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 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

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

我猜测command.exe正在使用命令字符串total并且修改(否则是多余的)外部引号。如果没有这些外部引用,DOS会做一些奇怪的事情。这个解决方案类似于用户187383的帖子,但是不使用“cmd / c”,它只会模糊实际发生的事情以及温和的性能削减,因为首先是shell调用隐含了cmd / c!

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

也有这个问题 - 提出了通过cmd.exe路由启动的想法。这里的诀窍是不要迷失在双qoutes中。通常,您希望放置您想要运行的任何内容:

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

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

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