每当单击按钮或超链接时,我都需要在命令提示符下运行.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);
}