Runtime.exec(). WaitFor() не дожидается завершения процесса
У меня есть этот код:
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
, так как он динамически изменяется).
Ответы
Ответ 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 ждет, пока окно не будет закрыто в любом случае.
Ответ 2
Попробуйте добавить параметр /wait
перед командой start
.
Ответ 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()
Ответ 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.");
}
}