如何从PHP运行一个.bat文件?

47

有人能告诉我如何从PHP脚本中执行.bat文件吗?

我尝试过:

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

什么都没用。我查了PHP手册并在Google上搜索,但找不到一个好的答案。有人知道我错在哪里吗?

我正在运行Windows 2003服务器,并成功手动运行了.bat文件,它完成了我需要的工作;我只需要能够以编程方式启动它。


你的[文件路径]是什么样子? - user16208
由于某种原因,仅执行exec("[filename here].bat")就可以完美地执行文件,无需使用"cmd /c [filename here]"。 - bool3max
7个回答

58

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

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

还有一些关于SYSTEM()的很棒的文档: http://us3.php.net/system - Phill Pafford
1
我该如何将运行 .bat 文件的结果返回给 PHP,以便我可以检索所需的值 - 这只是切割字符串吗? - undefined
1
@Stephen:要读取进程的输出,您需要使用popen运行它。请参见http://uk3.php.net/popen。 - RichieHindle
也许对某些人来说很有趣:在安装了本地 XAMP 的 Windows 系统上,这种尝试可能会超时并且批处理程序永远不会被执行。如果您已将 XAMP 启动为服务,则 Windows 将使用类似于 nt-autorit“t\system 的用户。更改服务的所有者为您的本地用户帐户,它就可以工作了。请参见:http://forums.devshed.com/php-development-5/php-execute-exe-file-server-802783.html 以获取更多信息。 - Ole_S
@Ole_S:您发布的链接已经失效了,能否请您解释一下如何操作呢?谢谢。 - Renaud
抱歉,这么长时间过去了我也不知道。或许你可以尝试在网络搜索中输入“Windows 10 更改所有者服务”或类似的关键词。 - Ole_S

13
<?php
exec('c:\WINDOWS\system32\cmd.exe /c START C:\Program Files\VideoLAN\VLC\vlc.bat');
?>

我什么时候需要在cmd中使用“start”来运行批处理? - Peter T.

9
当你使用exec()函数时,就好像你打开了一个cmd终端并直接输入命令一样。

像这样使用单引号:$str = exec('start /B Path\to\batch.bat');
其中/B表示批处理将在后台执行,因此在运行该行之后,其余的php代码将继续执行,与$str = exec('start /B /C command', $result);不同,其中command被执行,然后result被存储以供以后使用。

PS: 它适用于Windows和Linux。
更多详细信息请参见http://www.php.net/manual/en/function.exec.php :)


太好了,我一直在使用 <?php excec('c:\Windows\system32\cmd.exe /c Start path/batch.bat') ?> 这个可以运行,但页面一直在加载。 你的代码对我来说非常完美。 <?php exec('start /B Path\to\batch.bat') ?> 我推荐使用这个。 - DoctorDroid Haiti

7
<?php
 pclose(popen("start /B test.bat", "r")); die();
?> 

1
你愿意注释你的代码吗?如果早就有另一个被接受的答案并且获得了多个赞,那么你为什么要提出这个建议呢? - Yaroslav

2
在我的运行着IIS 8的Windows 8机器上,我可以通过仅输入批处理文件名并忽略路径来运行批处理文件。或者将批处理文件放在c:\windows\system32中。虽然我不知道为什么,但它确实有效。哈哈 $test=shell_exec("C:\windows\system32\cmd.exe /c $streamnumX.bat");

谢谢。不一定需要C:\windows\system32\cmd.exe /c。 - Philip

0

对于任何需要在后台运行程序“而无需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在“用户贡献笔记”部分中的注释)。


0

这段代码片段来自工作中的代码。

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

这在Windows中以后台模式运行,作为Task Manager中的单独进程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));

 }

BAT

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接