Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从PHP运行.bat文件?_Php_System_Exec_Batch File - Fatal编程技术网

如何从PHP运行.bat文件?

如何从PHP运行.bat文件?,php,system,exec,batch-file,Php,System,Exec,Batch File,有人能告诉我如何从PHP脚本执行.bat文件吗 我试过: exec("C:\[path to file]"); system("C:\[path to file]"); 什么都没用。我查阅了PHP手册并在谷歌上搜索了一下,但没有找到一个好的答案。有人知道我哪里出错了吗 我正在运行Windows2003Server,并且已经成功地手动运行了.bat文件,它完成了我所需要的工作;我只需要能够以编程方式启动它。您可能需要通过cmd运行它,例如: system("cmd /c C:[path to f

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

我试过:

exec("C:\[path to file]");
system("C:\[path to file]");
什么都没用。我查阅了PHP手册并在谷歌上搜索了一下,但没有找到一个好的答案。有人知道我哪里出错了吗


我正在运行Windows2003Server,并且已经成功地手动运行了.bat文件,它完成了我所需要的工作;我只需要能够以编程方式启动它。

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

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


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


$test=shell_exec(“C:\windows\system32\cmd.exe/C$streamnumX.bat”)

当您使用
exec()
函数时,就好像打开了
cmd
终端,并直接向其键入命令。

使用如下单引号(
$str=exec('start/B Path\to\batch.bat')

$str=exec('start/B/C command',$result')相反,
/B
意味着bat将在后台执行,因此php的其余部分将在运行该行后继续运行其中执行
命令
,然后存储
结果
,供以后使用

PS:它适用于Windows和Linux。

更多详细信息如下:)

此代码段来自工作代码。

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

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

在我的例子中,在
file\u scanner.php
中,我使用php函数
sleep()
在循环中对大量文件进行了一些繁重的计算,这些文件可能会持续数小时,以避免CPU过载

成功poiner来自文件
$r
,如果您想知道成功与否,可以通过ajax查询该文件。在我的例子中,
file\u 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

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

其中,
$cmd
是您需要运行的程序的字符串命令(例如,
$cmd
可以等于
notepad.exe
节点路径\到\server.js


来源:(参见Arno van den Brink在标题为“用户贡献的笔记”一节中的笔记。)

您的[文件路径]是什么样子的?出于某种原因,只需执行exec(“[filename here].bat”)就可以完美地工作,它只需执行文件。不需要“cmd/c[filename here]”。SYSTEM()也有一些很好的文档:如何将运行.bat文件的结果返回到PHP,以便检索所需的值?这只是分割字符串吗?@Stephen:要读取进程的输出,需要使用popen运行它。请参阅可能有人感兴趣的内容:在安装了locallay XAMP的windows系统上,此尝试可能会以超时结束,并且批处理永远不会执行。如果您已启动XAMP as服务,windows将使用类似以下内容作为用户:nt autorit“t\system,并且您已使用用户帐户登录。将该服务的所有者更改为您的本地用户帐户,它将正常工作。请参阅:了解更多信息information@Ole_S:你贴的链接坏了,你能解释一下怎么做吗?谢谢你愿意评论你的代码吗?如果很久以前有另一个被接受的答案,并且有好几次投票,你为什么要提出这个问题?当我需要“开始”在cmd中运行一个批处理时?太好了,我正在使用这个答案,但是页面一直在加载。你的代码对我来说很有用。我推荐这个谢谢。不一定需要C:\windows\system32\cmd.exe/C
/**
 * 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
 pclose(popen("start /B ".$cmd, "r"));