【问题标题】:Waiting for batch-end等待批处理结束
【发布时间】:2012-10-28 09:41:07
【问题描述】:

我的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代码中使用线程,以及你的主代码之后还有什么。在不知道程序线程情况的情况下发现问题是很痛苦的,因为主线程可能会结束或被中断。因此,最好发布一个可以重现问题的简化程序。
  • 另请参阅runtime.exec Wiki 链接的文章。实施建议以最稳健地使用Process。另请注意,Java 从 1.5 开始就有 ProcessBuilder。它比使用exec 更好 - 一个原因是它可以很容易地使用两个输出流(在链接的文章中提到)。

标签: java batch-file runtime.exec


【解决方案1】:

问题是您正在使用start - 这将启动一个 new shell 来运行批处理文件。原始 shell 然后关闭,因此进程终止,您的 Java 程序继续。

删除start,它应该可以工作,等待批处理文件结束。但是,当您启动 otherProcess 时,您会在批处理文件中再次遇到同样的问题。

要么不要使用start,要么始终在批处理文件中使用start /wait

但是,如果您在 Java 代码中使用 start /wait,据我通过实验得知,您最终会在批处理文件执行结束时看到一个命令提示符。

【讨论】:

  • 您好,感谢您的快速答复。我有什么问题。我不能/等待其他进程,因为进程是一个服务器进程,它必须保持活动状态,直到对程序的下一次调用到来。通过从 java 中删除 start,批处理文件将不会运行 :-(
  • @Markus:“不会运行”非常模糊。当你尝试时会发生什么?您不会在单独的窗口中看到批处理文件,但它应该可以工作。如果您不想等待 otherProcess,那很好,只要您对批处理文件终止并且 Java 代码继续执行感到高兴。
  • "Wont run" 意味着,通常被杀死的进程仍然活着,并且没有新进程像以前在 java 中使用 "start" 启动。
  • @Markus:恐怕我根本没有遵循这一点——但您当然可以使用cmd /c path\to\file.bat 运行批处理文件。我刚刚做到了。
  • 抱歉,双贴。没有在java中启动将工作。我输入了一个错误的批处理文件名:-/ 现在,可以了。谢谢你的帮助,你很好:-)
猜你喜欢
  • 2012-01-05
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多