java调度bat命令问题 本地使用java代码发送一个http请求访问一台服务器上tomcat下的一个jsp文件. jsp中调用了一个bat文件.bat中又掉了一个cogtr.exe文件用来刷新cube. 手动运行bat文件cube能刷新成功.但是通过java调jsp再调bat再调exe的方式cube刷新不成功.大家帮忙分析下原因! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 说明你用java代码调用bat文件的代码写的不对呗。你先那啥,用java代码测试下调用bat文件起作用了没 问题是没有异常.bat绝对是掉到了. 然后就是说bat里面调exe文件直接就给跳过去了.然后继续后面的命令知道bat结束. 之前在我本地是正常的,现在部署到生产上就失效了.我在想会需要什么权限吗?或者和环境变量什么有关吗? 那位朋友有过类似的经历麻烦帮我想想啊! 以下是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_qxset mdldir=D:\中银保险\开发\承保\船舶险set mdlname=plcy_ship_quality_anaset resultname=plcy_ship_quality_ana_result.txtset mdcdir=c:\mdcdel %dir%\%resultname%::杀掉所有服务器占用cube的进程taskkill /F /IM BIBusTKServerMain.exeset CubeSaveDirectory=%mdldir%\mdc_qxdel %mdldir%\mdc_qx\%mdlname%.mdc::开始刷新cubecd 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%.txtfor %%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到生产服务器2taskkill /s 21.8.143.135 /u zhangkun /IM BIBusTKServerMain.exeecho open 21.8.143.135>qecho zhangkun>>qecho zhangkun>>qecho mput %mdcdir%\%mdlname%.mdc>>qecho bye>>qftp -i -s:qdel q /q::上传cube到生产服务器3taskkill /s 21.8.143.136 /u zhangkun /IM BIBusTKServerMain.exeecho open 21.8.143.136>qecho zhangkun>>qecho zhangkun>>qecho mput %mdcdir%\%mdlname%.mdc>>qecho bye>>qftp -i -s:qdel q /q::上传cube到生产服务器4taskkill /s 21.8.143.137 /u zhangkun /IM BIBusTKServerMain.exeecho open 21.8.143.137>qecho zhangkun>>qecho zhangkun>>qecho mput %mdcdir%\%mdlname%.mdc>>qecho bye>>qftp -i -s:qdel 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能调起! // 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去掉试下 问题是我想不明白为什么手动双击bat文件就能调用到里面的exe文件? 以前我遇到过将//Thread.sleep(50);//1分钟// System.out.println(line.toString()); 不要注释 Jquery 调用JAVA的Webservice报错 java读取xml 怎么样跳出这个for循环 java.util.Date().toLocaleString()为什么不推荐使用??? 怎么才能得到这周的日期列表 java如何调用百度地图拾取坐标系统 请问有没有朋友遇到这样的事情呢?是关于笔记本显示的问题 网页中的全角空格全部变成了问号!求救!!!~!!!!!!!(在线等待) 请求帮助? 入门jsp报Unable to compile class for JSP错,救助 雪地里跪求,在线等待.求Gson 深度解析Json 如何用spring做个PV、IP、UV统计功能
你先那啥,用java代码测试下调用bat文件起作用了没
<%@ 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能调起!
问题是我想不明白为什么手动双击bat文件就能调用到里面的exe文件?
// System.out.println(line.toString());
不要注释