我正在尝试在应用程序终止后立即启动批处理文件(自动更新文件将用新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&¬epad"}).start();
我试图将它结合起来:
new ProcessBuilder("cmd", "/C notepad \""+batch.getAbsolutePath()+"\"&&"+batch.getAbsolutePath()+"&¬epad").start();
此序列应该在记事本中打开我的批处理文件(因此我可以看到它存在并且没有格式错误),运行批处理文件然后再次记事本。只有第一个记事本启动,然后cmd
实例从任务管理器中消失。
有人能证实这种奇怪的行为吗?更重要的是:你能解释一下并提出解决方案吗?
在致电ProcessBuilder
后休息1秒 是理想的解决方案!
答案 0 :(得分:0)
这真是一件令人讨厌的事情。显然,Windows会跟踪批处理文件的输出流,如果在启动下一个命令之前关闭/未使用流,则关闭cmd.exe
。我使用的解决方法是将输出流重定向到一个文件(无论如何最好记录批量输出):
ProcessBuilder pb = new ProcessBuilder("cmd", "/K "+batch.getAbsolutePath()+">batchlog.txt");