这真让我抓狂.我正在尝试在我的PHP Web应用程序的Windows框中执行命令行语句.它运行在Windows XP,IIS5.1上.Web应用程序运行正常,但我不能让@exec()使用特定的contactenated变量.我的命令结构如下:
$cmd = ($config->svn." cat ".$this->repConfig->svnParams().quote($path).' -r '.$rev.' > '.quote($filename));
当它生成以下字符串时,此命令不能如上所述:
svn --non-interactive --config-dir /tmp cat "file:///c:/temp/test/acccount/dbo_sproctest.sql" -r 1 > "C:\Inetpub\sites\websvn\temp\wsv5B45.tmp"
如果我将其复制/粘贴到我自己的命令行,它可以正常工作.
如果我硬编码相同的路径而不是添加变量,它的工作原理!我已尝试使用和不带引号的文件名.我在整个命令周围尝试过和没有引号.我试过其他目录.我已经尝试将输出参数传递给exec(),它返回空(Array()).我已经尝试将命令错误流的输出重定向到文件,并且永远不会创建错误输出文件.
我唯一可以理解的是,exec()默默地失败了.我到底是做错了什么?如果我硬编码文件路径,使用相同的目录结构和文件名,它工作正常.如果我不这样做,那就没有.
也许文件路径中的斜杠()没有正确转义,但是当我用单引号手动执行它们时,它们不被视为转义序列?
更新:
我接过了执行官的@ off,但仍然没有看到任何错误.
我给了SVN的完整路径,但仍然没有运气.应该注意的是,只要我手动指定cat的文件目的地,该命令就可以使用非完整路径SVN.
更新2:RE:Kieth
我通过尝试两个来调用exec:
exec($cmd);
要么
exec($cmd, $out);
我的php.ini已经有safe_mode = 0.
我添加了error_reporting(E_ALL); 并没有看到任何新的东西
如果我回复(或打印)我的执行电话,我实际上并没有做任何事情
如果我在包含输出变量时回显(或print_r)我的exec调用,我得到一个空的arr
更新3
我试过escapeshellcmd和escapeshellarg都没有用(虽然好主意).
我应该补充说,该文件是通过调用创建的
tempnam("temp", "wbsn");
事实上,如果我手动指定字符串而不是让它由tempname生成,它的工作正常似乎表明问题的根源,但我无法弄清楚如何.我对手动字符串与生成的字符串进行了比较,然后将其作为匹配返回.
@exec
将始终无声地失败,因为@是PHP的错误抑制运算符.
由于您使用的是Windows,而我使用的是Linux,因此不确定是否会对您有所帮助,但是我遇到了来自PHP exec()的相同的静默错误问题。我发现我尝试发出的命令(nconvert)将其错误消息发送到标准错误流,而不是标准输出。所以我加了
2>&1
在命令行末尾将我的错误重定向回标准流。然后我可以看到nconvert给了我一个权限被拒绝的错误。