Как мне запустить командный файл из моего Java-приложения? - PullRequest
102 голосов
/ 05 марта 2009

В моем 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, который я хотел запустить, но так как он не работал, я решил, что вызову скрипт через командный файл, но этот метод пока не удался.

Ответы [ 11 ]

163 голосов
/ 05 марта 2009

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

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

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

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

21 голосов
/ 25 ноября 2011

Иногда время процесса выполнения потока больше, чем время процесса ожидания потока 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 остановится до тех пор, пока не будет завершен вызываемый вами процесс, прежде чем он продолжит работу со стеком выполнения потока.

18 голосов
/ 31 октября 2011
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() );
}
14 голосов
/ 10 октября 2012

Для запуска пакетных файлов с использованием Java, если вы говорите об этом ...

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);`

Это должно сделать это.

12 голосов
/ 05 марта 2009

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

10 голосов
/ 05 марта 2009

Исполняемый файл, используемый для запуска пакетных сценариев: 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"});

РЕДАКТИРОВАТЬ: Амара, вы говорите, что это не работает. Ошибка, которую вы перечислили, является ошибкой, которую вы получите при запуске Java из терминала Cygwin в Windows; это то, что ты делаешь? Проблема в том, что Windows и Cygwin имеют разные пути, поэтому версия Java для Windows не найдет исполняемый файл scons на вашем пути Cygwin. Я могу объяснить далее, если это окажется вашей проблемой.

3 голосов
/ 13 июня 2013
Process p = Runtime.getRuntime().exec( 
  new String[]{"cmd", "/C", "orgreg.bat"},
  null, 
  new File("D://TEST//home//libs//"));

протестировано с jdk1.5 и jdk1.6

Это работало нормально для меня, надеюсь, это поможет и другим. чтобы получить это, я боролся больше дней. (

2 голосов
/ 09 июня 2016

У меня была такая же проблема. Однако иногда CMD не запускал мои файлы. Вот почему я создаю temp.bat на своем рабочем столе, затем этот temp.bat запустит мой файл, а затем временный файл будет удален.

Я знаю, что это большой код, однако он работал на 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();
1 голос
/ 11 марта 2015

Следующее работает нормально:

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);
0 голосов
/ 14 марта 2018

Чтобы развернуть @ anwser Иши , вы можете просто сделать следующее, чтобы получить возвращенный результат (постфактум не в реальном времени) запущенного скрипта:

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
...