本地使用java代码发送一个http请求访问一台服务器上tomcat下的一个jsp文件. jsp中调用了一个bat文件.bat中又掉了一个cogtr.exe文件用来刷新cube. 手动运行bat文件cube能刷新成功.但是通过java调jsp再调bat再调exe的方式cube刷新不成功.大家帮忙分析下原因! 

解决方案 »

  1.   

    说明你用java代码调用bat文件的代码写的不对呗。
    你先那啥,用java代码测试下调用bat文件起作用了没
      

  2.   

    问题是没有异常.bat绝对是掉到了. 然后就是说bat里面调exe文件直接就给跳过去了.然后继续后面的命令知道bat结束. 之前在我本地是正常的,现在部署到生产上就失效了.我在想会需要什么权限吗?或者和环境变量什么有关吗? 那位朋友有过类似的经历麻烦帮我想想啊! 
      

  3.   

    以下是jsp:
    <%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%><%@ page import="java.io.File" %><%@ page import="java.io.BufferedReader" %><%@ page import="java.io.IOException" %><%@ page import="java.io.InputStream" %><%@ page import="java.io.InputStreamReader" %><%
    //获取命令所在目录参数
    String cmdPath=request.getParameter("p");
    if(cmdPath!=null&&!"".equals(cmdPath)){
    //调用runtime,直接执行命令
    cmdPath=java.net.URLDecoder.decode(cmdPath,"utf-8");
    // Process process = Runtime.getRuntime().exec("cmd /c start "+cmdPath,new String[]{"C:\\oracle\\product\\10.2.0\\client_1\\bin;%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem\\;C:\\cognosclient\\bin;"},new File("C:\\cognosclient\\bin"));//执行存储的命令
    Process process = Runtime.getRuntime().exec("cmd /C start "+cmdPath);//执行存储的命令 InputStream inputStream = process.getInputStream();
    InputStreamReader inputStreamReader = new InputStreamReader(
    inputStream);

    //System.out.print(inputStreamReader.getEncoding());
    BufferedReader inputBufferedReader = new BufferedReader(
    inputStreamReader);

    String line = null;
    StringBuilder stringBuilder = new StringBuilder();
    line = inputBufferedReader.readLine();
    while (line != null&&!"".equals(line)) {
    stringBuilder.append(line);
    line = inputBufferedReader.readLine();
    //Thread.sleep(50);//1分钟
    // System.out.println(line.toString());
    }
    process.waitFor();
    inputBufferedReader.close();
    inputBufferedReader = null;
    inputStreamReader.close();
    inputStreamReader = null;
    inputStream.close();
    inputStream = null;
    process.destroy();

    //将结果写回调用方
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    out.print(stringBuilder.toString());
    //out.flush();
    //out.close();
    } %>
    以下是bat:
      set dir=D:\中银保险\开发\脚本\cube_qx刷新
    set logdir=D:\中银保险\开发\日志\log_qx
    set mdldir=D:\中银保险\开发\承保\船舶险
    set mdlname=plcy_ship_quality_ana
    set resultname=plcy_ship_quality_ana_result.txt
    set mdcdir=c:\mdcdel %dir%\%resultname%::杀掉所有服务器占用cube的进程
    taskkill /F /IM BIBusTKServerMain.exeset CubeSaveDirectory=%mdldir%\mdc_qx
    del %mdldir%\mdc_qx\%mdlname%.mdc
    ::开始刷新cube
    cd D:\cognosclient\bin\cogtr.exe -c -s -n -m%mdldir%\加权限后mdl\%mdlname%.mdl  -dLogFileDirectory=%logdir%\ -dLogFileName=%mdlname%.log -ldbAuth=bocins/bocins
    ::判断cube是否刷新成功
    findstr "(TR" %logdir%\%mdlname%.log > %logdir%\%mdlname%.txt
    for %%a in ("%logdir%\%mdlname%.txt") do if %%~za equ 0 (del %mdcdir%\%mdlname%.mdc && copy %mdldir%\mdc_qx\%mdlname%.mdc %mdcdir%\%mdlname%.mdc && set result=1%mdlname%更新成功!) else (set result=0%mdlname%更新失败!)
    del %logdir%\%mdlname%.txt::上传cube到生产服务器2
    taskkill /s 21.8.143.135 /u zhangkun /IM BIBusTKServerMain.exe
    echo open 21.8.143.135>q
    echo zhangkun>>q
    echo zhangkun>>q
    echo mput %mdcdir%\%mdlname%.mdc>>q
    echo bye>>q
    ftp -i -s:q
    del q /q::上传cube到生产服务器3
    taskkill /s 21.8.143.136 /u zhangkun /IM BIBusTKServerMain.exe
    echo open 21.8.143.136>q
    echo zhangkun>>q
    echo zhangkun>>q
    echo mput %mdcdir%\%mdlname%.mdc>>q
    echo bye>>q
    ftp -i -s:q
    del q /q::上传cube到生产服务器4
    taskkill /s 21.8.143.137 /u zhangkun /IM BIBusTKServerMain.exe
    echo open 21.8.143.137>q
    echo zhangkun>>q
    echo zhangkun>>q
    echo mput %mdcdir%\%mdlname%.mdc>>q
    echo bye>>q
    ftp -i -s:q
    del q /qset/p=%result%<nul>>%dir%\%resultname%exit
    以下是访问地址:
    http://21.8.129.118:8008/runcogcmd/runtask.jsp?p=D%253A%255C%25E4%25B8%25AD%25E9%2593%25B6%25E4%25BF%259D%25E9%2599%25A9%255C%25E5%25BC%2580%25E5%258F%2591%255C%25E8%2584%259A%25E6%259C%25AC%255Ccube_qx%25E5%2588%25B7%25E6%2596%25B0%255Cplcy_ship_quality_ana.bat就是通过浏览器访问远程tomcat下的一个jsp文件. jsp中调用了bat,bat中又调了exe 
    我确信bat能调起!
      

  4.   

    //  Process process = Runtime.getRuntime().exec("cmd /c start "+cmdPath,new String[]{"C:\\oracle\\product\\10.2.0\\client_1\\bin;%SystemRoot%\\system32;%SystemRoot%;%SystemRoot%\\System32\\Wbem\\;C:\\cognosclient\\bin;"},new File("C:\\cognosclient\\bin"));//执行存储的命令把cmd /c start start去掉试下
      

  5.   


    问题是我想不明白为什么手动双击bat文件就能调用到里面的exe文件? 
      

  6.   

    以前我遇到过将//Thread.sleep(50);//1分钟
    // System.out.println(line.toString());
     不要注释