Выполнение команды из Java и ожидание завершения команды

В моей Java-программе я создаю процесс, который выполняет команду для запуска пакетного файла следующим образом:

try {
        File tempFile = new File("C:/Users/Public/temp.cmd");
        tempFile.createNewFile();
        tempFile.deleteOnExit();


        setContents(tempFile, recipe.getText()); //Writes some user input to file
        String cmd = "cmd /c start " + tempFile.getPath();


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


        int exitVal = p.waitFor();

        refreshActionPerformed(evt);

    } catch (InterruptedException ex) {
        Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) {
        Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex);
    } 

Теперь я хотел бы, чтобы команда

refreshActionPerformed(evt);

запускается только после того, как пакетный файл, который я вызвал, завершил выполнение. Но сейчас он запускается сразу после открытия командной строки.

Как я могу это исправить?


person Matt R. Johnson    schedule 22.06.2011    source источник
comment
Обязательно прочитайте и выполните все советы Когда Runtime.exec() не работает. В противном случае вы почти наверняка испытаете «нет». Также рассмотрите возможность использования ProcessBuilder для 1.5+ и передачи аргументов в виде массива.   -  person Andrew Thompson    schedule 22.06.2011
comment
Я читал, когда Runtime.exec() не будет, но, честно говоря, я совершенно новичок в программировании на Java и понятия не имею, как реализовать совет из этой статьи.   -  person Matt R. Johnson    schedule 22.06.2011


Ответы (3)


Мне удалось найти ответ в другом месте. Чтобы сохранить начальный процесс открытым, пока пакетный файл не завершится, все, что вам нужно, это «/ ждать»

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat");
int exitVal = p.waitFor();
person Matt R. Johnson    schedule 27.06.2011

вызов «cmd /c start» приводит к тому, что cmd запускает другой экземпляр и немедленно завершает работу. Попробуйте убрать команду "старт".

person Rocky Pulley    schedule 22.06.2011
comment
Когда я это делаю, моя программа зависает. Я предполагаю, что p.waitfor() сейчас не возвращается. Что я должен делать? - person Matt R. Johnson; 22.06.2011
comment
может поставить выход в конце вашего .bat файла? - person Rocky Pulley; 22.06.2011
comment
Кажется, это работает. Но моя проблема в том, что содержимое файла .bat определяется пользователем. Так что, если они не поставят EXIT в конце, они облажались. Любой совет? - person Matt R. Johnson; 22.06.2011
comment
Да, создайте пакетный файл-оболочку, скажем, MyFileExecutor.bat, и в него вы поместите имя файла, который создает пользователь, а затем выход. Вы можете создать и выполнить этот файл на лету, если хотите. - person Rocky Pulley; 22.06.2011
comment
Итак, MyFileExecutor.bat должен ВЫЗВАТЬ летучую мышь пользователя? Это по-прежнему не работает, если пользовательская летучая мышь (или другие летучие мыши, вызываемые пользовательской летучей мышью) не имеет оператора EXIT. - person Matt R. Johnson; 22.06.2011
comment
Также возможны проблемы, если вызываемый файл bat содержит команду PAUSE. - person Matt R. Johnson; 23.06.2011
comment
если они поставили паузу в bat файле, вы ничего не можете с этим поделать. Точно так же, как вы ничего не можете с этим поделать, если они поставят команду удалить все файлы с жесткого диска. Вы должны провести черту где-то в том, что вы можете и не можете поддерживать. Когда вы вызываете другой bat-файл, убедитесь, что вы просто вводите имя bat-файла в строке и не пытаетесь вызвать cmd /c file.bat внутри вашего bat-файла, просто сделайте file.bat. - person Rocky Pulley; 23.06.2011

Дан правильный ответ. Я добавил, что окно, открытое кодом, нужно закрыть вручную.

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat");
int exitVal = p.waitFor();
person Pedro Arnoldo Machado Duran    schedule 08.02.2017