Как запустить пакетный файл с моего приложения Java?
В моем приложении Java я хочу запустить пакетный файл, который вызывает "scons -Q implicit-deps-changed build\file_load_type export\file_load_type
"
Кажется, что я даже не могу выполнить мой пакетный файл. У меня нет идей.
Это то, что у меня есть на Java:
Runtime.
getRuntime().
exec("build.bat", null, new File("."));
Раньше у меня был файл Sconscript Python, который я хотел запустить, но так как это не сработало, я решил, что вызову script через пакетный файл, но этот метод еще не был успешным.
Ответы
Ответ 1
Пакетные файлы не являются исполняемыми. Им нужно приложение для их запуска (т.е. Cmd).
В UNIX файл script имеет shebang (#!) в начале файла, чтобы указать программу, которая его выполняет. Проигрыватель 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
Для запуска пакетных файлов с использованием java, если вы говорите...
String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);`
Это должно сделать это.
Ответ 5
ProcessBuilder - это способ Java 5/6 для запуска внешних процессов.
Ответ 6
Исполняемый файл, используемый для запуска пакетных скриптов, cmd.exe
, который использует флаг /c
для указания имени исполняемого командного файла:
Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "build.bat"});
Теоретически вы также можете запускать Scons таким образом, хотя я не тестировал это:
Runtime.getRuntime().exec(new String[]{"scons", "-Q", "implicit-deps-changed", "build\file_load_type", "export\file_load_type"});
EDIT: Амара, вы говорите, что это не работает. Вы указали ошибку, которую вы получили при запуске Java с терминала Cygwin в окне Windows; это то, что вы делаете? Проблема в том, что Windows и Cygwin имеют разные пути, поэтому версия Java для Windows не сможет найти исполняемые файлы scons на вашем пути Cygwin. Я могу объяснить, если это окажется вашей проблемой.
Ответ 7
Process p = Runtime.getRuntime().exec(
new String[]{"cmd", "/C", "orgreg.bat"},
null,
new File("D://TEST//home//libs//"));
тестируется с помощью jdk1.5 и jdk1.6
Это работало отлично для меня, надеюсь, что это тоже помогает другим.
Чтобы получить это, я боролся больше дней.: (
Ответ 8
У меня была такая же проблема. Однако иногда CMD не запускал мои файлы.
Вот почему я создаю temp.bat на своем рабочем столе, затем этот temp.bat будет запускать мой файл, а затем файл temp будет удален.
Я знаю, что это более крупный код, однако работал на меня в 100%, когда даже Runtime.getRuntime(). exec() не удалось.
// creating a string for the Userprofile (either C:\Admin or whatever)
String userprofile = System.getenv("USERPROFILE");
BufferedWriter writer = null;
try {
//create a temporary file
File logFile = new File(userprofile+"\\Desktop\\temp.bat");
writer = new BufferedWriter(new FileWriter(logFile));
// Here comes the lines for the batch file!
// First line is @echo off
// Next line is the directory of our file
// Then we open our file in that directory and exit the cmd
// To seperate each line, please use \r\n
writer.write("cd %ProgramFiles(x86)%\\SOME_FOLDER \r\nstart xyz.bat \r\nexit");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// Close the writer regardless of what happens...
writer.close();
} catch (Exception e) {
}
}
// running our temp.bat file
Runtime rt = Runtime.getRuntime();
try {
Process pr = rt.exec("cmd /c start \"\" \""+userprofile+"\\Desktop\\temp.bat" );
pr.getOutputStream().close();
} catch (IOException ex) {
Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
}
// deleting our temp file
File databl = new File(userprofile+"\\Desktop\\temp.bat");
databl.delete();
Ответ 9
Следующее работает нормально:
String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);