等待批处理结束

3

我的bat文件中有4行内容,但是cmd窗口没有关闭时我的线程继续执行。

以下是我的代码:

rt = Runtime.getRuntime();
proc = rt.exec("cmd /c start C:\\temp\\test.bat");
if(proc.waitFor() == 0) {
    return "did it";
} else {
    return "nooope";
} 

我总是在cmd关闭前得到“did it”。以下是我的批处理文件:

@ECHO off
taskkill /IM "Process.exe" /F
cd "C:\Program Files\ProcessFolder"
START /WAIT Process.exe
START otherProcess.exe
EXIT

需要帮助吗?


你应该解释或添加为什么不想在Java代码中使用线程,以及主代码之后还有什么。如果不知道程序的线程情况就去查找问题是很痛苦的,因为主线程可能会结束或被中断。因此,最好发布一个可以重现问题的简化程序。 - iOS
另外,还要查看从runtime.exec Wiki链接的文章。实施最健壮的Process使用建议。还要注意自Java1.5以来就拥有ProcessBuilder。它比使用exec更好-其中一个原因是它使消耗两个输出流(在链接的文章中提到)变得容易。 - Andrew Thompson
1个回答

4
问题在于您使用了start,这将启动一个新的 shell来运行批处理文件。原始 shell 然后关闭,进程终止,您的 Java 程序继续执行。
删除start应该可以解决等待批处理文件结束的问题。但是,在启动otherProcess时,在批处理文件内部又出现了相同的问题。
要么不使用start,要么在批处理文件内部始终使用start /wait
如果在 Java 代码中使用start /wait,根据我的实验结果,批处理文件执行结束后会留下一个命令提示符。

嘿,感谢您的快速回复。我遇到的问题是,我不能等待另一个进程,因为该进程是一个服务器进程,必须保持活动状态,直到下一次调用程序。如果从Java中删除“start”,批处理文件将无法运行 :-( - Markus
@Markus:"无法运行"非常模糊。你尝试时会发生什么?你不会在一个单独的窗口中看到批处理文件,但它应该能够工作。如果你不想等待otherProcess,那没问题,只要你愿意让批处理文件终止并且Java代码继续即可。 - Jon Skeet
“Wont run” 意味着通常会终止的进程仍然存活,并且不像 Java 中的 “start” 一样启动新进程。 - Markus
@Markus:恐怕我完全没听懂 - 但你肯定可以使用 cmd /c path\to\file.bat 运行批处理文件。我刚刚试过了。 - Jon Skeet
抱歉双倍贴文。在Java中,没有启动也可以工作。我输入了错误的批处理文件名 :-/现在,它可以工作了。感谢您的帮助,您非常优秀 :-) - Markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接