p、 waitFor()不等待进程完成(Java)

p、 waitFor()不等待进程完成(Java),java,process,Java,Process,这是此线程的派生: 我知道这个问题在这里已经被问过很多次了,但是没有一个答案能解决我的问题。我遇到的问题是:我有一个调用批处理文件的java程序。我需要在Java程序继续之前完成批处理文件。为此,我使用waitFor()方法,该方法应该等到进程完成。然而,事实并非如此。我发现了这个线程,它表明waitFor()实际上正在等待的进程只是cmd.exe,它在实际进程执行之前返回。 该线程建议使用/wait命令,但当我这样做时,没有什么区别。我的代码非常深入,有几个类彼此依赖,但下面是一个尝试的SSC

这是此线程的派生:

我知道这个问题在这里已经被问过很多次了,但是没有一个答案能解决我的问题。我遇到的问题是:我有一个调用批处理文件的java程序。我需要在Java程序继续之前完成批处理文件。为此,我使用waitFor()方法,该方法应该等到进程完成。然而,事实并非如此。我发现了这个线程,它表明waitFor()实际上正在等待的进程只是cmd.exe,它在实际进程执行之前返回。 该线程建议使用/wait命令,但当我这样做时,没有什么区别。我的代码非常深入,有几个类彼此依赖,但下面是一个尝试的SSCCE:

public class BatchFileRun(){
    public static void main(String[] args){
        ArrayList<String> list = new ArrayList<String>();
        list.add("cmd.exe");
        list.add("/C");
        list.add("Start");
        list.add("/wait");
        list.add(("C:\\.....\\scripts\\myBatchFile.bat"));
        list.add("batchVariable");
        String[] commands = new String[list.size()];
        commands = list.toArray(commands);
        Process p = Runtime.getRuntime().exec(commands);
        p.waitFor();
        closeWindow();
    }
    void closeWindow(){
        WindowEvent close = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(close);
        System.exit(0);
    }
}
公共类BatchFileRun(){
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
添加(“cmd.exe”);
列表。添加(“/C”);
列表。添加(“开始”);
添加(“/wait”);
添加(((((“C:\\..…\\scripts\\myBatchFile.bat”));
添加(“batchVariable”);
String[]commands=新字符串[list.size()];
commands=list.toArray(commands);
进程p=Runtime.getRuntime().exec(命令);
p、 waitFor();
关闭窗口();
}
void closeWindow(){
WindowEvent close=新的WindowEvent(这是WindowEvent.WINDOW\u CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(关闭);
系统出口(0);
}
}

批处理文件只是对作为参数传递给它的变量(batchVariable)进行操作。所有先前的命令都应该用于简单地运行批处理文件。问题是在批处理文件中的进程完成之前调用了closeWindow()方法。因此,出现在Windows任务管理器中的Java进程保持运行,即使在调用closeWindow()时它应该关闭(如果我正确使用它的话)。当从批处理文件运行的进程完成时,我确实需要关闭所述进程。我尝试了运行批处理文件的不同方法(例如,使用ProcessBuilder),但无论我尝试什么,我都遇到了相同的问题。

您可以修改批处理文件,使其仅在启动的进程完成时完成。

您建议我如何做?我目前将其设置为(例如)对变量进行操作,回显变量的新值,然后exitI不理解使用
start/wait
而不仅仅是执行批处理文件的动机。这是为了避免stdin/stdout的麻烦吗?我在阅读了之前发布的链接后添加了/wait。最初我只是有一个“开始”。“/wait”可能会强制cmd.exe在批处理文件中的进程完成时仅告诉waitFor()它已完成。然而,情况并非如此,我遇到了与以前相同的问题。但为什么
start
呢?我认为实际运行批处理文件需要“start”,不是吗?
cmd/c
部分是必要的,而不仅仅是从命令行中命名批处理文件<代码>开始不是。但是请注意,存在使用执行的任何输出的问题。