【问题标题】:Executing cmd commands in Windows from PHP Issue从 PHP 问题在 Windows 中执行 cmd 命令
【发布时间】:2011-03-07 05:04:20
【问题描述】:

是否可以在 Windows 操作系统中使用 PHP exec() 函数执行 cmd 命令?

我试过这个:

<?php

try {

    echo exec(
    'O:\test\pdftk.exe O:\test\outputs\OPP\out.pdf O:\test\outputs\OPP\out2.pdf cat output O:\test\123.pdf'
    );

} catch (Exception $e) {
    echo $e->getMessage();
}

基本上,我正在尝试将两个 pdf 文件与 pdftk 程序合并。如果我只是手动将相同的命令写入 cmd,它会起作用并创建 O:\test\123.pdf 文件。但是当我执行上面的PHP文件时,什么也没有发生(空白页,文件没有创建)。

【问题讨论】:

    标签: php windows command-line


    【解决方案1】:

    这里有一个项目,可以让 PHP 获取并与真实的 cmd 终端动态交互。在这里获取:https://github.com/merlinthemagic/MTS

    下载后您只需使用以下代码:

    //if you prefer Powershell, replace 'cmd' with 'powershell'
    $shellObj    = \MTS\Factories::getDevices()->getLocalHost()->getShell('cmd');
    
    $strCmd1   = 'O:\\test\\pdftk.exe O:\\test\\outputs\\OPP\\out.pdf O:\\test\\outputs\\OPP\\out2.pdf cat output O:\\test\\123.pdf';
    $return1   = $shellObj->exeCmd($strCmd1);
    

    return 将为您提供来自 cmd 的命令 return OR error,就像您坐在控制台前一样。此外,您可以针对 $shellObj 发出您喜欢的任何命令,该环境在 PHP 脚本的整个生命周期中都得到维护。所以不用将命令捆绑在脚本文件中,只需使用 exeCmd() 方法一一发出,这样您还可以处理返回和任何异常。

    【讨论】:

      【解决方案2】:

      尝试使用管理员权限执行命令提示符

      【讨论】:

        【解决方案3】:

        尝试转义目录分隔符:

        exec("O:\\test\\pdftk.exe O:\\test\\outputs\\OPP\\out.pdf O:\\test\\outputs\\OPP\\out2.pdf cat output O:\\test\\123.pdf");
        

        或者更好的是,使用单引号代替:

        exec('O:\test\pdftk.exe O:\test\outputs\OPP\out.pdf O:\test\outputs\OPP\out2.pdf cat output O:\test\123.pdf');
        

        【讨论】:

        • 没有。那是行不通的。我还尝试了 shell_exec(),但效果不佳。
        • @Richard:即便如此,您仍需要正确转义目录分隔符或使用单引号。您是否确定在您的配置中启用了execshell_exec
        • @Richard Knop 尝试一些更简单的方法,例如使用 shell_exec 将一些文本写入文件然后可能有其他问题而不是 php 配置(即如果启用了 exec)
        • exec() 已启用。我试过 exec('ipconfig -all');和 shell_exec('ipconfig - all');两者都有效。
        • @Richard:这表明您的命令有问题。尝试将数组传递给 exec 的第二个参数,然后 print_r 该数组。
        【解决方案4】:

        您的 PHP 用户可以访问 cmd.exe 吗?您可能会发现Microsoft's Sysinternals 的工具非常有用;尤其是进程监视器。

        【讨论】:

        • 我认为是的。其他命令确实有效。例如,如果我尝试 exec('ipconfig -all'),它可以工作。我下载了进程监视器,似乎每个带有 pdftk 的进程都能正确执行。只有一个进程说“缓冲区溢出”或类似的东西。
        • 您能否确认如果您打开 cmd.exe 并运行 'O:\test\pdftk.exe O:\test\outputs\OPP\out.pdf O:\test\outputs\OPP\ out2.pdf cat output O:\test\123.pdf' 是否按预期工作?
        • 是的。当我直接在 shell 中输入它时,它按预期工作。
        猜你喜欢
        • 2015-01-10
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 1970-01-01
        • 2010-09-16
        • 2012-06-27
        • 1970-01-01
        相关资源
        最近更新 更多