我通过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
中的空格?
答案 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';