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

StackOverflow https://stackoverflow.com/questions/615948

  •  03-07-2019
  •  | 
  •  

Вопрос

В моем Java-приложении я хочу запустить пакетный файл, который вызывает " scons -Q implicit-deps-change build \ file_load_type export \ file_load_type "

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

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

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

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

Это было полезно?

Решение

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

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

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

Примечание. С помощью команды start \ " \ " откроется отдельное командное окно с пустым заголовком и все выходные данные из пакетного файла будут отображены там. Он также должен работать только с `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"});

РЕДАКТИРОВАТЬ: Амара, вы говорите, что это не работает. Ошибка, которую вы перечислили, является ошибкой, которую вы получите при запуске Java из терминала Cygwin в Windows; это то, что ты делаешь? Проблема в том, что Windows и Cygwin имеют разные пути, поэтому версия Java для Windows не найдет исполняемый файл 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 не запускал мои файлы. Вот почему я создаю 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();

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

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

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

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

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

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top