Вопрос-ответ

How do I run a batch file from my Java Application?

Как мне запустить пакетный файл из моего Java-приложения?

В моем Java-приложении я хочу запустить пакетный файл, который вызывает "scons -Q implicit-deps-changed build\file_load_type export\file_load_type"

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

Это то, что у меня есть в Java:

Runtime.
getRuntime().
exec("build.bat", null, new File("."));

Ранее у меня был файл Python Sconscript, который я хотел запустить, но поскольку это не сработало, я решил вызвать скрипт через пакетный файл, но этот метод пока не увенчался успехом.

Переведено автоматически
Ответ 1

Пакетные файлы не являются исполняемыми файлами. Для их запуска требуется приложение (например, cmd).

В UNIX файл сценария имеет флажок (#!) в начале файла, чтобы указать программу, которая его выполняет. Двойной щелчок в Windows выполняется проводником Windows. CreateProcess ничего об этом не знает.

Runtime.
getRuntime().
exec("cmd /c start \"\" build.bat");

Примечание: С помощью команды start \"\" откроется отдельное командное окно с пустым заголовком, в котором будут отображаться любые выходные данные пакетного файла. Он также должен работать только с "cmd / c build.bat", и в этом случае выходные данные могут быть прочитаны из подпроцесса на Java, если это необходимо.

Ответ 2

Иногда время процесса выполнения потока превышает время процесса ожидания потока JVM, обычно это происходит, когда процесс, который вы вызываете, требует некоторого времени для обработки, используйте команду waitFor() следующим образом:

try{    
Process p = Runtime.getRuntime().exec("file location here, don't forget using / instead of \\ to make it interoperable");
p.waitFor();

}catch( IOException ex ){
//Validate the case the file can't be accesed (not enought permissions)

}catch( InterruptedException ex ){
//Validate the case the process is being stopped by some external situation

}

Таким образом, JVM остановится до тех пор, пока вызываемый вами процесс не будет завершен, прежде чем он продолжит работу со стеком выполнения потока.

Ответ 3
Runtime runtime = Runtime.getRuntime();
try {
Process p1 = runtime.exec("cmd /c start D:\\temp\\a.bat");
InputStream is = p1.getInputStream();
int i = 0;
while( (i = is.read() ) != -1) {
System.out.print((char)i);
}
} catch(IOException ioException) {
System.out.println(ioException.getMessage() );
}
Ответ 4

ProcessBuilder - это способ Java 5/6 запускать внешние процессы.

java