Подтвердить что ты не робот

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, так как он динамически изменяется).

4b9b3361

Ответ 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.

Ответ 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.");
   }
}