2011-06-22 41 views
6

在我的Java程序,我创建一个执行一个命令来运行一个批处理文件,这样的过程:从Java执行命令,等待命令完成

try { 
     File tempFile = new File("C:/Users/Public/temp.cmd"); 
     tempFile.createNewFile(); 
     tempFile.deleteOnExit(); 


     setContents(tempFile, recipe.getText()); //Writes some user input to file 
     String cmd = "cmd /c start " + tempFile.getPath(); 


     Process p = Runtime.getRuntime().exec(cmd); 


     int exitVal = p.waitFor(); 

     refreshActionPerformed(evt); 

    } catch (InterruptedException ex) { 
     Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } 

现在,我想什么发生的是命令

refreshActionPerformed(evt); 

只有在我调用的批处理文件完成执行后才能运行。但是现在,它在命令提示符打开后立即运行。

我该如何解决这个问题?

+0

请务必阅读并执行*所有* [当Runtime.exec()不会]的建议(http://www.javaworld.com/javaworld/jw-12-2000/jw- 1229-traps.html)。否则,你几乎肯定会遇到“不会”。另外考虑使用'ProcessBuilder'作为1.5+并将参数作为数组传递。 –

+0

我读过Runtime.exec()不会,但坦率地说,我对Java编程完全陌生,我不知道如何实现该文章的建议。 –

回答

12

我试着在别处找到答案。要保持初始过程打开,直到批处理文件完成,所有你需要的是“/ wait”

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat"); 
int exitVal = p.waitFor(); 
+2

对我来说'/ wait'和'p.waitFor()'起作用。 –

2

调用“cmd/c start”会导致cmd触发另一个实例并立即退出。尝试取出“开始”命令。

+0

当我这样做时,我的程序冻结了。我的猜测是p.waitfor()现在没有返回。我该怎么办? –

+0

可能会在您的.bat文件的末尾放置一个“退出”? –

+0

这似乎工作。但我的问题是,.bat文件的内容是用户定义的。所以如果他们没有把EXIT放到最后,他们就会被搞砸了。有什么建议? –

0

给出的答案是正确的。我补充说,由代码打开的窗口需要手动关闭。

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat"); 
int exitVal = p.waitFor();