我需要从我的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.bat
此test.bat
文件需要大约10-15分钟才能完成。执行此操作后,process.exitValue()
会立即返回0
。但我需要知道这是否完全执行。在我的test.bat
文件中,我正在调用另一个执行某些操作的exe文件。该exe文件将一些错误信息写入控制台。我需要获取该信息。
是否可以从Java代码中了解这一点?或者有人可以让我知道检查这个的最佳方法吗? 我想到了一些方法,比如将状态(成功完成后)写入文本文件(来自批处理程序),然后从Java代码中检查。但我不认为这是正确的做法。
答案 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)