从Java程序运行批处理文件并获取执行状态

时间:2011-05-06 06:31:38

标签: java

我需要从我的Java程序运行批处理文件,并知道它是否已完成。

try{
    Process process = Runtime.getRuntime().exec( command );

    if( null!=process  && process.waitFor() == 0 &&process.exitValue()== 0 )
     {
        LOGGER.debug("Command executed successfuly.["+command+"]");
        return 0;
    }
    else{
        LOGGER.debug( "Error while getting the modified log" );
        return 1;
    }
}
catch( IOException e ){
// TODO Auto-generated catch block
e.printStackTrace();
}
catch( InterruptedException e ){
// TODO Auto-generated catch block
e.printStackTrace();
}

我的命令类似于cmd /c C:/Test/test.battest.bat文件需要大约10-15分钟才能完成。执行此操作后,process.exitValue()会立即返回0。但我需要知道这是否完全执行。在我的test.bat文件中,我正在调用另一个执行某些操作的exe文件。该exe文件将一些错误信息写入控制台。我需要获取该信息。

是否可以从Java代码中了解这一点?或者有人可以让我知道检查这个的最佳方法吗? 我想到了一些方法,比如将状态(成功完成后)写入文本文件(来自批处理程序),然后从Java代码中检查。但我不认为这是正确的做法。

4 个答案:

答案 0 :(得分:2)

这就是我正在做的事情:

Process process = Runtime.getRuntime().exec(execString);
if (log.isDebugEnabled()) {
   log.debug("Result: " + IOUtils.toString(process.getInputStream()));
   log.debug("Error: " + IOUtils.toString(process.getErrorStream()));
}
if (process.waitFor() == 0) { .. }

答案 1 :(得分:1)

我不知道你的文件test.bat是做什么的,但如果我可以改变那个bat文件,我不会尝试解析输出流。更改test.bat,使其实际使用退出代码,并定义退出代码,以便它们指出您有什么类型的错误。

然后,waitFor返回的值将指示执行是否成功终止,或者如果失败则如何失败。

顺便说一下。您应该始终从进程读取stdout和stderr,因为如果这些流的缓冲区已满,执行可能会停止。

答案 2 :(得分:0)

使用Process.getOutputStream()。请参阅here

答案 3 :(得分:0)

相关问题