这真让我抓狂。我正在尝试在我的 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 的完整路径,仍然没有运气。应该注意的是,只要我手动指定 cat 的文件目标,该命令在使用非完整路径 SVN 之前运行良好。
更新 2:回复:基思
我通过尝试两种方法来调用 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 生成,它工作得很好这一事实似乎表明问题的根源,但我不知道如何。我将手动字符串与生成的字符串进行了比较,它作为匹配返回。