免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7872 | 回复: 19
打印 上一主题 下一主题

请教关于JAVA在WIN下执行.BAT文件的问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-13 18:13 |只看该作者 |倒序浏览
以下代码是调用一个bat文件执行, 想让先执行这个bat, 执行完后主程序再往下进行.
但是实际情况是主程序还运行下去,直到最后都执行完才等待子进程完成退出.

代码:  操作系统是XP
        try {
            Runtime rt = Runtime.getRuntime();
            Process ps = null;
            ps = rt.exec("cmd.exe /C start e:\\test.bat");
            ps.waitFor();
            log.debug(" exit with :  " + ps.exitValue());   // log输出   exitValue()返回0
            log.debug(" rebuildDb ...... ");
            int i = ps.exitValue();
            if (i == 0) {
                log.debug("Sucess!!!");
                return true;
            } else {
                log.error("OracleTableChecker : rebuildDb Error!!!");
                return false;
            }
        } catch (InterruptedException e) {
            log.error("OracleTableChecker : rebuildDb Error!!!");
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            log.error("OracleTableChecker : rebuildDb() error");
            e.printStackTrace();
            return false;
        }


e:\test.bat:
     cd E:\oracle\imp-exp
     e:
     export.bat GEGW5 @CBMADB-ON-28
     echo "\n\n\nimporting!"
     import.bat GEGW6 @CBMADB-ON-28
     exit 0


执行.bat 文件试过的几种方法:
    cmd.exe /C start e:\test.bat    主进程和脚本都能执行, 但是主进程不会等待子脚本执行结束.
   cmd.exe /C e:\test.bat            主程序和脚本都死在那里不动了, 没有反应.CPU占用也很为0.
    e:\test.bat                               同上
   command.com /C e:\test.bat   主程序能正常进行, 但脚本未执行.
   command.com /C start e:\test.bat
                    java.io.IOException: CreateProcess: command /C start e:\test.bat error=2  
     

请各位帮忙解决. 一直在线

[ 本帖最后由 chouy 于 2006-3-13 19:22 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-03-13 21:30 |只看该作者
与你调用的脚本有关,jdk并没有保证一定可以完全控制process,而且特殊情况下会导致死锁

论坛徽章:
0
3 [报告]
发表于 2006-03-13 21:41 |只看该作者
我的脚本是一个批处理, 批入理里面调用的是其它的批处理
批处理的具体功能是导入导出数据库.

如果像楼上说的那样不能控制, 有没有其它可以折中控制的方法呢? 比如多线程, 让一个子线程去执行脚本, 父线程等待, 或是另外构造一个类,来执行, 再或者把批处理都改成单独的系统命令.  

总之有没有什么办法呢? 反正功能是必须要实现的.

论坛徽章:
0
4 [报告]
发表于 2006-03-13 21:51 |只看该作者
没有这样折中的办法,因为现在看来是你的脚本不受你的process控制,那么子线程还是无法传回正确的结束信息。去sun看看吧,找找办法

论坛徽章:
0
5 [报告]
发表于 2006-03-13 22:15 |只看该作者
谢谢楼上的答复!

如果谁有办法的话请再贴上来.
如果我找到办法解决也会贴上来.

论坛徽章:
0
6 [报告]
发表于 2006-03-14 03:11 |只看该作者
找到原因了,bat文件执行的时候,如果有屏幕输出,就必须要读取这个输出,如果不读取,就会导致这个bat不会被执行下去。所以,只要用个InputStream把输出读出来就ok了。
另外,谁也不能保证Process运行以后系统的PATH到底是什么,所以建议写上调用的bat的绝对路径

  1. import java.io.IOException;
  2. import java.io.InputStream;

  3. public class TestProcess {
  4.         public static void main(String[] args) {
  5.                 String command = "c:\\aaa.bat";
  6.                 try {
  7.                         Process child = Runtime.getRuntime().exec(command);
  8.                         InputStream in = child.getInputStream();
  9.                         int c;
  10.                         while ((c = in.read()) != -1) {
  11.                                 System.out.print(c);//如果你不需要看输出,这行可以注销掉
  12.                         }
  13.                         in.close();
  14.                         try {
  15.                                 child.waitFor();
  16.                         } catch (InterruptedException e) {
  17.                                 // TODO Auto-generated catch block
  18.                                 e.printStackTrace();
  19.                         }
  20.                         System.out.println("done");
  21.                 } catch (IOException e) {
  22.                         // TODO Auto-generated catch block
  23.                         e.printStackTrace();
  24.                 }
  25.         }
  26. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-03-14 10:21 |只看该作者
谢谢 perryhg  版主!! 问题解决了!!!

还有一个小问题: 我这里运行的CMD命令窗口必须要手动关闭, 如何才能自动关闭?(这还是JAVA版的问题吗?)

论坛徽章:
0
8 [报告]
发表于 2006-03-14 10:27 |只看该作者
写一个"exit":em11:

论坛徽章:
0
9 [报告]
发表于 2006-03-15 10:22 |只看该作者

solution

不能自动退出的问题解决了!

在脚本中要调用其它的BAT文件, 要用<b> CALL </b>

     cd E:\oracle\imp-exp
     e:
     CALL  export.bat GEGW5 @CBMADB-ON-28
     echo "\n\n\nimporting!"
     CALL  import.bat GEGW6 @CBMADB-ON-28
     exit 0


然后在执行命令中用
cmd.exe /C start e:\\test.bat

论坛徽章:
0
10 [报告]
发表于 2006-03-16 11:25 |只看该作者
长见识了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP