【问题标题】:Execute .bat file from java and wait till its finished从java执行.bat文件并等待它完成
【发布时间】:2014-08-23 17:04:00
【问题描述】:

我已经就如何实现这一目标提出了几个问题。 如here 所述,我使用了process.waitFor()/wait。问题是这样做不仅会等待命令执行,而且会等待关闭 cmd 提示符(可以通过在 bat 文件中添加 exit 来完成)。但我无法将 bat 文件修改为产品文件。

Runtime run = Runtime.getRuntime();

    try {
        String path = "C:/Folder/c.bat";
        String executeCmd= "cmd /c start /wait "+path;
        final Process process =run.exec(executeCmd);        
        process.waitFor();
         System.out.println("did I wait?");
    } catch (Exception e) {         
        e.printStackTrace();
    }

如何让它等到命令被执行。

【问题讨论】:

  • 取出start /wait? (看起来你已经在等待 cmd.exe 关闭了。)
  • @Bill_Stewart 如果我删除 start ,它不会被执行,如果我删除 wait 。它甚至不等待并打印 did I wait?
  • 那要看C:/Folder/c.bat在做什么了。如果它异步启动一个可执行文件,那么您将无法等待该可执行文件终止而不找出它的进程 ID,然后等待它关闭。
  • @Bill_Stewart 你的观点是有效的,假设如果我使用我提到的上述逻辑。无论如何我可以检查提示是否返回,如果是的话我可以继续。在我的情况下是 bat 文件正在停止和启动应用程序服务器
  • 按照你的建议去做将是一个非常尴尬和脆弱的解决方案。更好的解决方案是找到可执行文件的进程 ID 并等待它关闭。

标签: java windows batch-file


【解决方案1】:

您可以创建一个包含以下内容的辅助批处理文件:

start /wait %1\c.bat
exit

将此帮助批处理存储在您想要的任何位置。

然后以c.bat 的路径作为参数启动这个帮助程序批处理文件。

   Runtime run = Runtime.getRuntime();

    try {
      String pathToCBatch = "C:\\Folder\\"; 
      String pathToHelperBatch = "c:/helperBatch.bat";
      String executeCmd = "cmd /c start /wait " + pathToHelperBatch + " " + pathToCBatch;
      final Process process = run.exec(executeCmd);
      System.out.println(System.currentTimeMillis());
      process.waitFor();
      System.out.println(System.currentTimeMillis());
    } catch (Exception e) {
      e.printStackTrace();
    }

【讨论】:

  • 它没有按预期工作,等待命令提示符关闭。
  • 那你到底想达到什么目的?程序是否应该等待?
  • .bat 文件用于启动服务器,我希望代码等到它启动。你写的逻辑会等到cmd promt手动关闭,我试过了
【解决方案2】:

我也有同样的问题:“调用批处理文件并等待它完成”(Windows PC)。这个解决方案对我有用:

StringBuilder command = new StringBuilder("cmd /c start /wait C:\\script.bat");
    // my script take 2 file as arguments
    command.append(" ").append(inputFile);
    command.append(" ").append(outputFile);
    try {
        final Process p = Runtime.getRuntime().exec(command.toString());
        p.waitFor();
    } catch (InterruptedException e) {
        System.out.println(e);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多