【问题标题】:Executing a Command from Java and Waiting for the Command to Finish从 Java 执行命令并等待命令完成
【发布时间】: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 编程完全陌生,我不知道如何实现那篇文章的建议。

标签: java batch-file command exec execute


【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 2018-04-27
      • 2011-10-20
      • 1970-01-01
      • 2020-05-27
      • 2015-06-13
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      相关资源
      最近更新 更多