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



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



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



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



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


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

920   11  

11 ответов:

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

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

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

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

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

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() );
}

для запуска пакетных файлов с помощью java, если это вы говорите...

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

это должно помочь.

ProcessBuilder это Java 5/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 имеют разные пути, поэтому версия Windows Java не найдет исполняемый файл scons на вашем пути Cygwin. Я могу объяснить дальше, если это окажется вашей проблемой.

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

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

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

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

Я знаю, что это больший код, однако работал для меня в 100%, когда даже во время выполнения.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();

далее работает нормально:

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

этот код будет выполнять две команды.летучая мышь, которая существует в пути C:/folders/folder.

Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat");

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

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

Comments

    Ничего не найдено.