如果应用程序终止太快,ProcessBuilder不会发送批处理文件 - 其他任务正确启动

时间:2016-01-10 07:07:29

标签: java windows batch-file

我正在尝试在应用程序终止后立即启动批处理文件(自动更新文件将用新jar替换旧jar)。我决定采用这种模式:

new ProcessBuilder("cmd", "/C "+batch_file.getAbsolutePath()+"").start();

最初我正在尝试这个:

new ProcessBuilder(batch_file.getAbsolutePath()).start();

我希望使用cmd而不是直接调用文件名会增加可靠性。但如果我的程序在此之后立即终止,则两个选项都会失败。你必须使用睡眠:

  public static void main(String[] args) throws Exception {
    File batch = new File("test_update.bat");
    // It doesn't work without this
    Thread.sleep(1000);
    new ProcessBuilder(batch.getAbsolutePath()).start();
  }

没有睡觉,我根本看不到任何事情。然而,最奇怪的是其他命令不会受到这个问题的影响:

// Will run two instanced of notepad synchronously one after another
new ProcessBuilder(new String[] {"cmd", "/C notepad&&notepad"}).start();

我试图将它结合起来:

new ProcessBuilder("cmd", "/C notepad \""+batch.getAbsolutePath()+"\"&&"+batch.getAbsolutePath()+"&&notepad").start();

此序列应该在记事本中打开我的批处理文件(因此我可以看到它存在并且没有格式错误),运行批处理文件然后再次记事本。只有第一个记事本启动,然后cmd实例从任务管理器中消失。

有人能证实这种奇怪的行为吗?更重要的是:你能解释一下并提出解决方案吗?

在致电ProcessBuilder后休息1秒 是理想的解决方案!

1 个答案:

答案 0 :(得分:0)

这真是一件令人讨厌的事情。显然,Windows会跟踪批处理文件的输出流,如果在启动下一个命令之前关闭/未使用流,则关闭cmd.exe。我使用的解决方法是将输出流重定向到一个文件(无论如何最好记录批量输出):

ProcessBuilder pb = new ProcessBuilder("cmd", "/K "+batch.getAbsolutePath()+">batchlog.txt");