Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProcessBuilder没有';如果应用程序终止太快,则不会启动批处理文件-其他任务已正确启动_Java_Windows_Batch File - Fatal编程技术网

Java ProcessBuilder没有';如果应用程序终止太快,则不会启动批处理文件-其他任务已正确启动

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而不是直接调用文件名可以提高可靠性。但如果我的程序在此之后立即终止,这两个选项都会失

我试图在应用程序终止后立即启动一个批处理文件(自动更新文件,它将用新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秒不是一个理想的解决方案

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

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