如何从 PHP 运行 .bat 文件?

Posted

技术标签:

【中文标题】如何从 PHP 运行 .bat 文件?【英文标题】:How do you run a .bat file from PHP? 【发布时间】:2010-10-24 13:41:47 【问题描述】:

谁能告诉我如何从 php 脚本执行 .bat 文件?

我试过了:

exec("C:\[path to file]");
system("C:\[path to file]");

没有任何工作。我检查了 PHP 手册并用谷歌搜索,但找不到一个好的答案。有人知道我要去哪里错了吗?

我正在运行 Windows 2003 Server 并已成功手动运行 .bat 文件,它可以满足我的需要;我只需要能够以编程方式启动它。

【问题讨论】:

你的[文件路径]是什么样的? 出于某种原因,只是执行 exec("[filename here].bat") 工作得很好,它只是执行文件。不需要“cmd /c [此处的文件名]”。 【参考方案1】:

您可能需要通过cmd 运行它,例如:

system("cmd /c C:[path to file]");

【讨论】:

SYSTEM() 也有一些很棒的文档:us3.php.net/system 如何将运行 .bat 文件的结果返回给 PHP,以便我可以检索我需要的值 - 这只是对字符串进行切片? @Stephen:要读取进程的输出,您需要使用 popen 运行它。见uk3.php.net/popen 对某些人来说可能很有趣:在安装了 XAMP 的 locallay 的 Windows 系统上,这种尝试可能会以超时而告终,并且永远不会执行批处理。如果您已将 XAMP 作为服务启动,则窗口将使用以下内容作为用户:nt-autorit„t\system,并且您使用用户帐户登录。将服务的所有者更改为您的本地用户帐户,它将起作用。请参阅:forums.devshed.com/php-development-5/… 了解更多信息 @Ole_S:您发布的链接已损坏,您能解释一下如何操作吗?谢谢【参考方案2】:
<?php
exec('c:\WINDOWS\system32\cmd.exe /c START C:\Program Files\VideoLAN\VLC\vlc.bat');
?>

【讨论】:

当我需要“开始”在cmd中运行批处理时?【参考方案3】:

当您使用exec() 函数时,就好像您打开了一个cmd 终端并直接向它输入命令。 使用像这样的单引号 $str = exec('start /B Path\to\batch.bat'); /B 表示 bat 将在后台执行,因此 php 的其余部分将在运行该行后继续,而不是 $str = exec('start /B /C command', $result); 其中command被执行,然后result被存储以备后用。

PS: 它适用于 Windows 和 Linux。 更多细节在这里http://www.php.net/manual/en/function.exec.php:)

【讨论】:

太好了,我正在使用 这个工作有效,但页面一直在加载。你的代码行对我来说就像一个魅力。 我推荐这个【参考方案4】:
<?php
 pclose(popen("start /B test.bat", "r")); die();
?> 

【讨论】:

想评论你的代码?如果很久以前有另一个被接受的答案有几个赞成,你为什么要提出这个?【参考方案5】:

在运行 IIS 8 的 Windows 机器 8 机器上,我只需输入 bats 名称并忘记它的路径即可运行批处理文件。或者把蝙蝠放在 c:\windows\system32 不要问我它是如何工作的,但它确实如此。哈哈

$test=shell_exec("C:\windows\system32\cmd.exe /c $streamnumX.bat");

【讨论】:

谢谢。不一定需要 C:\windows\system32\cmd.exe /c【参考方案6】:

这个 sn-p 来自工作代码。

您不仅可以从 Windows GUI 或任务计划程序触发 bat 文件,还可以在需要时直接从 PHP 脚本触发。但在大多数情况下,它将执行 30-60 秒。取决于您的 PHP 配置。如果 BAT 文件中的作业很长,并且您不想冻结 PHP 脚本,则需要使用 php.exe 将 BAT 作业作为另一个进程分叉,并且不依赖于 Apache。

这在 Windows 中以 后台 模式运行,被视为来自任务管理器的单独进程 cmd.exephp.exe,不会停止您的 Apache PHP 脚本。您的脚本生成的消息可以通过日志文件存储和检索。

file_scanner.php 的情况下,我在循环中对大量文件进行了一些繁重的计算,这些文件可能会使用 php 函数sleep() 持续几个小时,以免 CPU 过载。

文件$r的成功指针结果,如果你想知道成功或错误的开始,你可以通过ajax查询。在我的情况下,file_scanner.php 使用消息somefile.jpg - OK 写入日志文件,您可以每隔几秒钟使用 AJAX 加载到您的 UI 以显示进度。

PHP

/**
 * Runs bat file in background mode
 *
 */
 function run_scanner() 

    $c='start /b D:\Web\example.com\tasks\file_scanner.bat'; 
    $r=pclose(popen($c, 'r')); 
    return json_encode(array('result'=>$r));

 

最佳可行技术

@echo Off
D:\PHP\php.exe D:\Web\example.com\tasks\file_scanner.php > D:\Web\example.com\tasks\file_scanner.log
exit

【讨论】:

【参考方案7】:

对于需要在后台运行程序“无需 PHP 等待它完成”的任何人,请执行以下操作:

 pclose(popen("start /B ".$cmd, "r")); 

其中$cmd 是您需要运行的程序的字符串命令(例如$cmd 可以等于notepad.exenode Path\to\server.js)。

来源:https://www.php.net/manual/en/function.exec.php(请参阅 Arno van den Brink 在标题为“用户贡献的注释”部分的注释)。

【讨论】:

以上是关于如何从 PHP 运行 .bat 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何记录从 BAT 文件运行的 snowsql 命令的错误/成功

如何从 c# 文件中获取带有退出代码的字符串消息以提供运行它的 .bat 文件

每隔10秒运行一次BAT文件?

Java - 如何一次或从一个文件夹中依次运行几个 shell/bat 文件

在后台从php执行.bat文件

如何启动一个进程以从 Windows 服务运行 bat 文件