Java ProcessBuilder没有';如果应用程序终止太快,则不会启动批处理文件-其他任务已正确启动
我试图在应用程序终止后立即启动一个批处理文件(自动更新文件,它将用新jar替换旧jar)。我决定采用这种模式:Java ProcessBuilder没有';如果应用程序终止太快,则不会启动批处理文件-其他任务已正确启动,java,windows,batch-file,Java,Windows,Batch File,我试图在应用程序终止后立即启动一个批处理文件(自动更新文件,它将用新jar替换旧jar)。我决定采用这种模式: new ProcessBuilder("cmd", "/C "+batch_file.getAbsolutePath()+"").start(); 最初我只是想这样: new ProcessBuilder(batch_file.getAbsolutePath()).start(); 我希望使用cmd而不是直接调用文件名可以提高可靠性。但如果我的程序在此之后立即终止,这两个选项都会失
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秒不是一个理想的解决方案 这真是件讨厌的事。显然,Windows会跟踪批处理文件的输出流,如果流在启动下一个命令之前关闭/未使用,则会关闭cmd.exe
。我使用的解决方法是将输出流重定向到文件(最好还是记录批处理输出):
ProcessBuilder pb = new ProcessBuilder("cmd", "/K "+batch.getAbsolutePath()+">batchlog.txt");