这真让我抓狂。我正在尝试在我的 PHP Web 应用程序的 Windows 框中执行命令行语句。它运行在Windows XP,IIS5.1上。 Web 应用程序运行良好,但我无法让 @exec() 使用特定的联系变量。我的命令结构如下所示:
$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() 正在默默地失败。我到底做错了什么?如果我硬编码文件路径,使用相同的目录结构和文件名,它工作正常。如果我不这样做,它不会。
也许文件路径中的斜杠 () 没有被正确转义,但是当我用单引号手动执行时,它们不被视为转义序列??
更新:
我取消了@ exec,但仍然没有看到任何错误。
我给了 SVN 的完整路径,但仍然没有运气。应该注意的是,该命令在使用非完整路径 SVN 之前可以正常工作,只要我手动指定 cat 的文件目标即可。
更新 2:回复:Kieth
我通过同时尝试调用 exec :
exec($cmd);
或者
exec($cmd, $out);
我的 php.ini 已经有 safe_mode = 0。
我添加了 error_reporting(E_ALL);并没有看到任何新东西
如果我回显(或 print_r)我的 exec 调用,我实际上什么也没看到
如果我在包含输出变量时回显(或 print_r)我的 exec 调用,我会得到一个空的 arr
更新3
我尝试了 escapeshellcmd 和 escapeshellarg 都无济于事(不过是个好主意)。
我应该补充一点,该文件是通过调用创建的
tempnam("temp", "wbsn");
如果我手动指定字符串而不是让它由 tempname 生成它工作得很好的事实似乎表明问题的根源,但我无法弄清楚如何。我将手动字符串与生成的字符串进行了比较,结果匹配返回。
最佳答案
@exec
总是会默默地失败,因为 @ 是 PHP 的错误抑制操作符。
关于PHP @exec 无声无息地失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/714740/