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


Run a .bat file in command prompt using PHP

每当单击按钮或超链接时,我都需要在命令提示符下运行.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文件,但每当我单击运行时,它什么都不说。

$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)输入到批处理文件中。

由于您通过浏览器在web服务器上运行PHP脚本,.bat文件的执行发生在web服务器而不是客户端上。

无论你在同一台计算机上运行服务器,你的bat都可能被执行,但你不能与它交互

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

我在电脑上试过这个exec。你的蝙蝠会被执行,但你看不到黑色的界面。你可以试试类似"回声关闭"的球拍像这样回显tmptile>tmp.txt,它可以创建一个名为tmp.txt的文件,告诉您。蝙蝠被处决了。

假设您只想模拟交互式会话,您只需要使用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);
}