0

.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

4 回答 4

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

于 2013-08-06T10:54:07.983 回答
1

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

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

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

于 2013-08-06T11:00:45.190 回答
0

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

于 2013-08-06T11:21:24.043 回答
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);
}
于 2013-08-08T07:43:28.060 回答