Подтвердить что ты не робот

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

4b9b3361

Ответ 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);