36

我有这个代码:

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文件的输出是什么,因为它是动态变化的)。

4

4 回答 4

51

通过使用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 进程都在等待窗口关闭。

于 2013-03-04T10:15:31.310 回答
7

尝试/waitstart命令前面添加参数。

于 2013-03-04T10:19:23.343 回答
4
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()
于 2016-01-22T14:11:04.733 回答
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.");
   }
}
于 2017-02-08T04:34:22.577 回答