从 Java 执行命令并等待命令完成

Posted

技术标签:

【中文标题】从 Java 执行命令并等待命令完成【英文标题】:Executing a Command from Java and Waiting for the Command to Finish 【发布时间】:2011-09-20 15:35:49 【问题描述】:

在我的 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);

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

我该如何解决这个问题?

【问题讨论】:

请务必阅读并实施所有When Runtime.exec() won't的建议。否则你几乎肯定会体验到“不会”。还可以考虑将ProcessBuilder 用于 1.5+ 并将参数作为数组传递。 我读过 When Runtime.exec() won't,但坦率地说,我对 Java 编程完全陌生,我不知道如何实现那篇文章的建议。 【参考方案1】:

我设法在别处找到了答案。要在批处理文件完成之前保持初始进程打开,您只需要“/wait”

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

【讨论】:

【参考方案2】:

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

【讨论】:

当我这样做时,我的程序冻结了。我的猜测是 p.waitfor() 现在没有返回。我该怎么办? 也许在你的 .bat 文件的末尾添加一个“exit”? 这似乎行得通。但我的问题是 .bat 文件的内容是用户定义的。因此,如果他们没有在最后加上 EXIT,他们就有点搞砸了。有什么建议吗? 是的,创建一个包装批处理文件,比如 MyFileExecutor.bat 并在其中输入用户创建的文件的名称,然后退出。如果需要,您可以动态创建和执行此文件。 那么 MyFileExecutor.bat 应该调用用户的 bat 吗?如果用户的 bat(或用户的 bat 调用的其他 bat)没有 EXIT 语句,这似乎仍然不起作用。【参考方案3】:

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

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

【讨论】:

以上是关于从 Java 执行命令并等待命令完成的主要内容,如果未能解决你的问题,请参考以下文章

如何等待一个shell命令执行完成

Plink完成执行远程命令后等待按键

Java程序执行Linux命令

java 使用的Java执行一些本地命令,并等待返回结果

命令行窗口内,如何执行一个程序并等待结果

JAVA中如何执行DOS命令