2012-04-17 46 views
2

我正在执行一系列批处理文件,我只需要我的java程序等待第一批文件退出,然后执行下一个。发生什么事是每一件事都得到执行而没有退出之前执行的文件。如何让java程序等到用java进程执行的批处理文件终止

这是我的代码,我在一个循环中运行它

String cmd = "cmd /c start /min file1.bat"; 

Process pr = Runtime.getRuntime().exec(cmd); 

pr.waitFor(); 
+0

也许删除“开始”会做的伎俩,请参阅http:// stackoverflow.com/questions/2448402/run-bat-file-in-java-and-wait-2 – 2012-04-17 13:24:29

+0

@VilmantasBaranauskas谢谢..它与此String cmd =“cmd/c file1.bat”; – Samy 2012-04-17 14:44:01

+0

非常感谢你们。 – Samy 2012-04-17 14:44:49

回答

2

虽然我使用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.javaProcessBuilder.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"}); 
+0

嗨丹克鲁兹仍然有“开始/分钟”的问题,我的脚步是跑完最后一批文件。 – Samy 2012-04-20 11:21:44

+0

@Sam对不起,我不是一个Windows人。您可能想尝试不同的“开始”选项。我确实记得过去有BAT文件存在问题,并且在BAT文件中使用'exit'以通过'start'命令正确使用它们。但那是几年前的事情,从那以后我就没有用过Windows。 – 2012-04-20 11:50:08

1

start接受的说法/WAIT

检查start /?更多有用的参数(你可能想/B,而不是/MIN

0

对此没有简单准确的方法。 Java没有控制外部程序(并且你启动了这样的外部程序)。 您可以循环尝试将任务从taskmanager中取出,如果失败,则捕获异常并知道何时终止。

或者你计算出你的batfiles将需要第二只建立在Thread.sleep();

0

注释标记作为一个答案是不正确的,因为它与相关的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(); 
      } 
     } 
    } 
} 
相关问题