【发布时间】:2013-12-14 16:47:34
【问题描述】:
这是该线程的一个分支:Killing a JFrame/Java when process finishes
我知道这个问题在 SO 上已被多次问过,但似乎没有一个答案能解决我的问题。我遇到的问题是:我有一个调用批处理文件的 java 程序。我需要在 Java 程序继续之前完成批处理文件。为此,我使用 waitFor() 方法,该方法应该等到进程完成。然而,事实并非如此。我找到了这个线程,这表明 waitFor() 实际上正在等待的进程只是 cmd.exe,它在实际进程之前返回。 Runtime.exec().waitFor() doesn't wait until process is done 该线程建议使用 /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);
}
}
批处理文件只是对作为参数传递给它的变量(batchVariable)进行操作。应该使用所有先前的命令来简单地运行批处理文件。问题是在批处理文件中的进程完成之前调用了 closeWindow() 方法。因此,出现在 Windows 任务管理器中的 Java 进程仍然在运行,即使在调用 closeWindow() 时它应该关闭(如果我正确使用它的话)。当从批处理文件运行的进程完成时,我真的需要关闭所述进程。我尝试了不同的方式来运行批处理文件(例如,使用 ProcessBuilder),但无论我尝试什么,我都会遇到同样的问题。
【问题讨论】:
-
我不明白使用
start /wait而不是仅仅执行批处理文件的动机。是为了避免stdin/stdout的麻烦吗? -
在阅读了我之前发布的链接后,我添加了 /wait。最初我只有“开始”。 “/wait”应该会强制 cmd.exe 仅在批处理文件中的进程完成时告诉 waitFor() 它已完成。但是,情况并非如此,我遇到了和以前一样的问题。
-
但是为什么要
start呢? -
我相信实际运行批处理文件需要“启动”,不是吗?
-
cmd /c部分是必需的,而不是像在命令行中那样仅仅命名批处理文件;start不是。但请注意,存在消耗执行的任何输出的问题。