it-swarm.com.ru

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

100
Amara

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

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

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

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

162
Paulo Guedes

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

20
Juan Carlos Alpízar
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() );
}
18
Isha

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

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

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

13
Abbia

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

12
basszero

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

10
Eli Courtwright
Process p = Runtime.getRuntime().exec( 
  new String[]{"cmd", "/C", "orgreg.bat"},
  null, 
  new File("D://TEST//home//libs//"));

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

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

3
Suren

Я была такая же проблема. Однако иногда 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();
2
Ben Jost

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

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

Этот код будет выполнять две команды .bat, которые существуют в пути C:/folder/folder.

Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat");
0
رامي عبد الله

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

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