的Runtime.exec()。WAITFOR()不会等到过程结束(Runtime.exec(

2019-07-20 22:30发布

我有这样的代码:

File file = new File(path + "\\RunFromCode.bat");
file.createNewFile();

PrintWriter writer = new PrintWriter(file, "UTF-8");
for (int i = 0; i <= MAX; i++) {
    writer.println("@cd " + i);
    writer.println(NATIVE SYSTEM COMMANDS);
    // more things
}

writer.close();

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");
p.waitFor();

file.delete();

什么情况是,它实际上执行前的文件中删除。

这是因为.bat文件只包含本地系统调用? 我怎样才能让执行删除.bat文件? (我不知道的输出什么.bat文件将是,因为它是动态变化的)。

Answer 1:

通过使用start ,你问cmd.exe开始在后台批处理文件:

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");

所以,你从Java(启动进程cmd.exe完成后台进程)之前返回。

删除start命令来运行该批处理文件中的前景-那么, waitFor()将等待批处理文件完成:

Process p = Runtime.getRuntime().exec("cmd /c " + path + "\\RunFromCode.bat");

据OP,它是有可用的控制台窗口很重要-这可以通过添加完成/wait参数,通过@Noofiz的建议。 下面SSCCE为我工作:

public class Command {

public static void main(String[] args) throws java.io.IOException, InterruptedException {
       String path = "C:\\Users\\andreas";

       Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "\\RunFromCode.bat");

       System.out.println("Waiting for batch file ...");
       p.waitFor();
       System.out.println("Batch file done.");
   }
}

如果RunFromCode.bat执行EXIT指令,自动关闭命令窗口。 否则,命令窗口保持打开状态,直到您明确地退出它EXIT - Java进程正在等待,直到窗口在任何情况下关闭。



Answer 2:

尝试添加/wait参数在前面start命令。



Answer 3:

waitForProcessOutput()

没有的伎俩我们。

看到:

http://docs.groovy-lang.org/docs/groovy-1.7.2/html/groovy-jdk/java/lang/Process.html#waitForProcessOutput()

代码示例(在SOAPUI使用)

def process = "java -jar ext\\selenese-runner.jar".execute()

process.waitForProcessOutput()

def exitValue = process.exitValue()


Answer 4:

在评注标记作为答案描述的代码中没有一个是一个解决方案。

第一个答案

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");

第二个答案

Process p = Runtime.getRuntime().exec("cmd /c " + path + "\\RunFromCode.bat");

第三个答案

public class Command {

public static void main(String[] args) throws java.io.IOException, InterruptedException {
       String path = "C:\\Users\\andreas";

       Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "\\RunFromCode.bat");

       System.out.println("Waiting for batch file ...");
       p.waitFor();
       System.out.println("Batch file done.");
   }
}


文章来源: Runtime.exec().waitFor() doesn't wait until process is done