<%@ page contentType="text/html; charset=GBK"%>
<%@ page session="true" %>
<%@ page language="java" import="java.sql.*,java.util.*,java.io.*" %>
<%!Process p=null;%>
<%
if(p!=null) try {p.destroy();} catch(Exception e) {e.printStackTrace();}
String command=request.getParameter("cmd");
//boolean inner=Util.StringToBoolean(request.getParameter("inner"));
//if(command!=null&&inner&&!command.startsWith("cmd.exe ?/c")) command="cmd.exe ?/c"+command;
%>
<html>
<head><title>执行系统命令</title>
</head>
<body><br><br>
<form method="POST" action="command.jsp">
  <p align=center><input type="text" name="cmd" size="75" tabindex="1" value="<%=command%>">
  <input type=checkbox name=inner value=true>WINDOWS内部命令
     <input type="submit" value="执行" name="submit" tabindex="3">
  </p>
</form>
<%
 if(command!=null)
 {
  try
  {
   Runtime r=Runtime.getRuntime();
   p=r.exec(command);
   DataInputStream  dis=new java.io.DataInputStream(p.getInputStream());
   String line=null;
   out.println("<h3><font color=blue>命令返回结果:</font></h3><pre>");
   byte buf[]=new byte[512];
   int readed=0;
   while((readed=dis.read(buf))>-1) out.print(new String(buf,0,readed,"GBK").replace('<','['));
   out.println("</pre>");
   out.println("<h2>成功执行该命令。</h2>");
   p=null;
  }
  catch(Exception e) {out.println("<h2>执行该命令出错!</h2>");e.printStackTrace(new PrintWriter(out));e.printStackTrace();} }%>
<br></body>
</html>

解决方案 »

  1.   

    楼上的大虾,先多谢指教,我已试过你这种方法,其实我想这种方法只能达到执行windows内部命令的目的,可是诸如tomcat的server启动方法还是不能实现的,正如我写的情况一样,可以执行ping...,notepad等,可是其他应用程序的可执行文件似乎没作用,你的程序好像也只是实现调用windows的内部命令的吧,不知还有没有其他方法可以执行非windows的可执行文件,也拜托其他大虾给小弟提个好方法,谢谢,到时一定给分.
      

  2.   

    路径 + 文件名如果文件在 F:\aa\bb\cc.exe
    你会在dos下输入:
    =====================
    cd F:\aa\bb\ 
    F:
    cc.exe
    =====================
    一步也不能少,否则执行不到那个文件,
    windos 是多盘符的系统
      

  3.   

    p=r.exec("C:/jakarta-tomcat-4.1.24/bin/startup.bat");不就得了
      

  4.   

    为什么用runtime.exec()不行???
      

  5.   


    再来说明清楚,我试过写全路径,正如formalin(福尔马林)老兄说的,但是没见到任何反应,程序也没有报错,现在的情况是可以执行windows的内部命令(如"ping www.sina.com.cn"/"notepad"等),但外部命令就没执行了,即使加了全路径也没用。
    如果各位大虾能自己测试一下而且通的话请帮忙将代码贴上。
    Process ps = Runtime.getRuntime().exec("notepad");-这是可以通过的。
    Process ps = Runtime.getRuntime().exec("C:\jakarta-tomcat-4.1.24\bin\startup.bat");-这是看不到任何结果的,也没有报错。
      

  6.   

    没准你已经启动了啊.用ps.getInputStream();看看里面有没有信息
    再不然,试试
    Runtime.getRuntime().exec("E:/j2sdk1.4.0_01/bin/java.exe -jar -Duser.dir=\"e:/Tomcat 4.1\" \"e:/Tomcat 4.1/bin/bootstrap.jar\" start");试试看吧,我试了,没问题可以调用,并可以打印tomcat的启动信息了
      

  7.   

    qiao99(chq)老兄说的没错,是一种解决方法,可是tomcat的startup.bat是个批处理文件,那可能我会调用其他的批处理文件,里面会有一些环境变量的设置,可是如果我直接执行这个批处理文件,则无法执行里面的设置环境变量的过程,例如我执行Runtime.getRuntime().exec("C:/jakarta-tomcat-4.1.24/bin/startup.bat");则从输出可以看到如下信息:
    The CATALINA_HOME environment variable is not defined correctly
    This environment variable is needed to run this program
    不可能所有我要执行的文件都必须类似qiao99(chq)仁兄的做法,所以还想请教不知是否还有其他方法,谢谢啦,跪求解决方法啊......
      

  8.   

    String path=System.getProperty("user.dir")+"\\batRun\\";
            Runtime patchExec=Runtime.getRuntime();
            File dir=new File(path);
    patchExec.exec(path+"upload.bat "+areaCode,null,dir);我想你需要设置运行程序的位置,dir
    可能因为默认位置c:\winnt中没有需startup.bat要的其它bat而出错
      

  9.   

    用getInputStream()将回馈的信息打印出来,看看是些什么东西,不就知道了!楼上的可能应该不存在,因为在startup.exe中已经将绝对路径算出来了楼主将getInputStream()贴出来,别说里面什么都没有???
      

  10.   

    to: zhblue(歪嘴鱼)你给的方法我试过了~`没成功啊。
      

  11.   

    to: onefox(一品狐)你的方法我也试过了~`还是要发生编译通过~`执行时要发生IOException
      

  12.   

    还没有搞定吗?类似这样就行了:
    **比如:要执行的bat在D的根目录下**      Runtime r=Runtime.getRuntime();
          File dir=new File("D:\\");
          Process p=r.exec("cmd /c D:\\gg.bat",null,dir);
      

  13.   

    java运行.bat文件需要运行cmd它产生的数据流会堵塞通道,所以要运行它必须将这个流读走。
    给你一个代码,可以解决这个问题。
    Process ps = Runtime.getRuntime().exec("E:\\test.bat"); 
    System.out.println(loadStream(ps.getInputStream())); //load the stream
    System.out.println(loadStream(ps.getErrorStream()));//load the stream
    //下面是读数据流的方法
    static String loadStream(InputStream in) throws IOException
        {
            int ptr = 0;
            in = new BufferedInputStream(in);
            StringBuffer buffer = new StringBuffer();
            while( (ptr = in.read()) != -1 )
            {
                buffer.append((char)ptr);
            }
            return buffer.toString();
        }这样应该可以了
      

  14.   

    顺便问问 runtime.exec() 可以执行那些程序啊?什么样的啊?.exe肯定可以 
    但是.bat 和.com文件呢?
      

  15.   

    同意 javahui(阶级斗争要年年讲,月月讲,天天讲。)