使用PHP在命令提示符下运行.bat文件

时间:2013-08-06 10:52:01

标签: php windows batch-file

每当我点击按钮或超链接时,我都需要在命令提示符下运行.bat文件。我写的代码是:

<?php
    if(isset($_POST['submit']))
    {
        $param_val = 1;
        $test='main.bat $par'; 
        // exec('c:\WINDOWS\system32\cmd.exe /c START C:/wamp/www/demo/m.bat');    
        // exec('cmd /c C:/wamp/www/demo/m.bat');
        // exec('C:/WINDOWS/system32/cmd.exe');
        // exec('cmd.exe /c C:/wamp/www/demo/main.bat');
        exec('$test');
    } 
    else
    {
        ?>

        <form action="" method="post">
        <input type="submit" name="submit" value="Run">
        </form>

        <?php
    }
?>

我的main.bat是:

@echo off
cls
:start
echo.
echo 1.append date and time into log file
echo 2.just ping google.com

set/p choice="select your option?"

if '%choice%'=='1' goto :choice1
if '%choice%'=='2' goto :choice2
echo "%choice%" is not a valid option. Please try again.
echo.
goto start
:choice1
call append.bat
goto end
:choice2
call try.bat
goto end
:end
pause

当我点击运行按钮时,它必须打开命令提示符并运行main.bat文件,但每当我点击运行时它什么也没说。

4 个答案:

答案 0 :(得分:2)

$test='main.bat $par';
exec('$test');

... 不会工作。

PHP只在双引号中使用$变量。

这也是不良做法$test = "main.bat $par";

Windows也需要反斜杠而不是需要转义的斜杠,而是用双引号中的另一个反斜杠。

使用以下其中一项:

$test = 'cmd /c C:\wamp\www\demo\main.bat ' . $par;

$test = "cmd /c C:\\wamp\\www\\demo\\main.bat {$par}";

运行:

echo shell_exec($test);

更失败:

从脚本末尾删除pause。 PHP不会自动获得它。

仔细查看批处理文件,我打赌你甚至不需要它。批处理文件中的所有内容都可以放入PHP文件中。

正如 Elias Van Ootegem 已经提到的那样,你需要在STDIN中输入你的选项(1,2)到批处理文件中。

答案 1 :(得分:1)

由于您通过浏览器运行PHP脚本,因此在Web服务器上,.bat文件将在Web服务器而非客户端上执行。

无论您是在同一台计算机上运行服务器,您的蝙蝠都可能被执行但您无法与之交互。

解决方案可能是制作一个接受参数而不是交互的bat,并将交互带回PHP脚本前面,以便用正确的args调用bat执行。

答案 2 :(得分:0)

我在我的电脑上试过这个exec。 你的蝙蝠会被执行,但你看不到黑色界面。你可以像 @echo一样试试蝙蝠 回声tmptile&gt;像这样的tmp.txt ,它可以创建一个名为tmp.txt的文件来告诉你。蝙蝠被执行了。

答案 3 :(得分:0)

假设您只想模拟交互式会话,您只需使用proc_open()及相关功能:

<?php

$command = escapeshellcmd('main.bat');

$input = '1';

$descriptors = array(
    0 => array("pipe", "r"), // stdin
    1 => array("pipe", "w"),  // stdout
);

$ps = proc_open($command, $descriptors, $pipes);

if(is_resource($ps)){
    fwrite($pipes[0], $input);
    fclose($pipes[0]);

    while(!feof($pipes[1])){
        echo fread($pipes[1], 4096);
    }
    fclose($pipes[1]);

    $output = proc_close($ps);
    if($output!=0){
        trigger_error("Command returned $output", E_USER_ERROR);
    }

}else{
    trigger_error('Could not execute command', E_USER_ERROR);
}