【问题标题】:Problem using PHP exec command to execute a batch file使用 PHP exec 命令执行批处理文件的问题
【发布时间】:2026-02-17 13:20:05
【问题描述】:

我正在尝试让 PHP 调用一个批处理文件,该批处理文件将获取一个 RTF 文件并使用 OpenOffice 宏将其转换为 PDF。我已经在命令行上测试了批处理文件,它工作正常,但我没有任何运气从 PHP 调用和使用相同的批处理文件。

我的机器操作系统是 XP Professional SP 3。我正在运行 IIS 6 和 PHP 版本 5.2.9。 我已在 c:\windows\system32\cmd.exe 上向 Internet 用户授予执行权限。 我指定了正在执行的批处理文件的完整路径和要转换的 RTF 文件的完整路径。

PHP 看起来像这样,其中 $arg 是要转换的 RTF:

$arg = "C:\\web_root\\whatever\\tempOutput.rtf";
$command = "c:\\windows\\system32\\cmd.exe /c c:\\web_root\\whatever\\convert.bat $arg";

然后在 try-catch 中调用 exec 命令:

exec("$command 2>&1 && exit", $ret, $err);

我在 catch 后回显结果:

echo "ret: ";
print_r ($ret);
print "<br>";
echo "err is ";
echo $err;
print "<br>";
echo "DONE!";

这就是我所看到的:

ret: Array ( ) 
err is 0
DONE!

RTF 文件没有被转换,我没有看到错误。关于下一步我可以尝试什么的任何想法?谢谢!!!

【问题讨论】:

标签: php exec openoffice.org


【解决方案1】:

您是否使用 IIS 作为您的网络服务器?如果是这样,PHP exec 函数将默认不起作用,您不应绕过阻止其运行的安全措施。

检查您的事件查看器,您应该会发现一些与您的问题有关的错误。通过 google 运行查询:IIS PHP exec。这应该会为您提供有关该问题的大量信息。

基本上,PHP exec 函数会尝试创建一个新的 cmd.exe 实例。 IIS 禁止这样做,因为它可能会在系统中打开一个安全漏洞。

我想出的最佳解决方案是让您的 php 脚本将要执行的命令写入平面文件或创建数据库条目。然后,您需要编写一个由 Windows 调度程序启动的单独脚本,每隔 10 分钟左右运行一次,以便检查您的平面文件或数据库是否有要运行的命令。然后,新脚本将运行命令,然后放置结果或执行确认,以便您的 Web 应用稍后能够访问。

这肯定是个杂牌。

【讨论】:

    【解决方案2】:

    看起来输出数组是空的。你的批处理脚本应该有输出吗?

    另外,escapeshellcmd 和 escapeshellarg 应该被使用

    【讨论】:

      【解决方案3】:

      我敢打赌这是关于权限的。

      在典型设置中,PHP 作为 apache 运行 - 因此您需要确保 apache 有权执行批处理文件。

      另外,请检查 this relevant SO questionthis google search

      【讨论】:

        【解决方案4】:

        PHP 是否在安全模式下运行?如果是这样,shell 命令将使用escapeshellcmd 进行转义。也许这就是问题所在?

        您是否可以控制运行 PHP 脚本的服务器?

        【讨论】: