如何让java程序等到用java进程执行的批处理文件终止
我正在执行一系列批处理文件,我只需要我的java程序等待第一批文件退出,然后执行下一个。发生什么事是每一件事都得到执行而没有退出之前执行的文件。如何让java程序等到用java进程执行的批处理文件终止
这是我的代码,我在一个循环中运行它
String cmd = "cmd /c start /min file1.bat";
Process pr = Runtime.getRuntime().exec(cmd);
pr.waitFor();
虽然我使用Linux的时候,这应该适用于Windows和。下面的示例代码执行一个外壳进程多次,等待每个过程完成后再继续:
import java.util.Date;
public class Test {
public static void main(final String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("Executing command " + i + ": " + (new Date()));
try {
final Process p = new ProcessBuilder("sh", "-c", "sleep 2;").redirectErrorStream(true).start();
p.waitFor();
} catch (final Throwable t) {
t.printStackTrace();
}
}
}
}
此输出:
Executing command 0: Tue Apr 17 09:19:55 EDT 2012
Executing command 1: Tue Apr 17 09:19:57 EDT 2012
Executing command 2: Tue Apr 17 09:20:00 EDT 2012
Executing command 3: Tue Apr 17 09:20:02 EDT 2012
Executing command 4: Tue Apr 17 09:20:04 EDT 2012
打印结果使用的Runtime.exec(String)
(退出值)值sh -c 'sleep 2;'
,我得到2
(执行失败);但Runtime.exec(String[])
使用new String[] {"sh", "-c", "sleep 2;"}
的结果返回0
(成功执行)。查看Runtime.java
和ProcessBuilder.java
源,Runtime.exec(String)
使用StringTokenizer
分割出字符串,其中使用" \t\n\r\f"
的默认分隔符。因此执行Runtime.exec("sh -c 'sleep 2;'")
会将命令字符串分解为数组["sh", "-c", "'sleep", "2;'"]
,其中包含无效参数。
为确保命令正确执行,最好使用Runtime.exec(String[])
而不是Runtime.exec(String)
。
当拆分为["cmd", "/c", "start", "/min", "file1.bat"]
时,您的cmd /c start /min file1.bat
命令字符串可能不起作用。下面应该工作:
Runtime.getRuntime().exec(new String[] {"cmd", "/c", "start /min file1.bat"});
嗨丹克鲁兹仍然有“开始/分钟”的问题,我的脚步是跑完最后一批文件。 – Samy 2012-04-20 11:21:44
@Sam对不起,我不是一个Windows人。您可能想尝试不同的“开始”选项。我确实记得过去有BAT文件存在问题,并且在BAT文件中使用'exit'以通过'start'命令正确使用它们。但那是几年前的事情,从那以后我就没有用过Windows。 – 2012-04-20 11:50:08
start
接受的说法/WAIT
检查start /?
更多有用的参数(你可能想/B
,而不是/MIN
)
对此没有简单准确的方法。 Java没有控制外部程序(并且你启动了这样的外部程序)。 您可以循环尝试将任务从taskmanager中取出,如果失败,则捕获异常并知道何时终止。
或者你计算出你的batfiles将需要第二只建立在Thread.sleep();
注释标记作为一个答案是不正确的,因为它与相关的Linux而不是Windows
import java.util.Date;
public class Test {
public static void main(final String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("Executing command " + i + ": " + (new Date()));
try {
final Process p = new ProcessBuilder("sh", "-c", "sleep 2;").redirectErrorStream(true).start();
p.waitFor();
} catch (final Throwable t) {
t.printStackTrace();
}
}
}
}
也许删除“开始”会做的伎俩,请参阅http:// *.com/questions/2448402/run-bat-file-in-java-and-wait-2 – 2012-04-17 13:24:29
@VilmantasBaranauskas谢谢..它与此String cmd =“cmd/c file1.bat”; – Samy 2012-04-17 14:44:01
非常感谢你们。 – Samy 2012-04-17 14:44:49