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

м 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)

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

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

 Amara05 мар. 2009 г., 19:34
Спасибо. Это все еще не работает - этот фрагмент кода даже не выполняется в моем приложении. Я попробую другой вариант, который вы представили. Еще раз спасибо.
 Amara05 мар. 2009 г., 19:37
Когда я пробую второй вариант, он выдает мне эту ошибку: Исключение в потоке "main" java.io.IOException: Невозможно запустить программу "scons": Ошибка CreateProcess = 2, Система не может найти указанный файл
 Amara05 мар. 2009 г., 19:54
Нет, у меня нет терминала Cygwin. Я использую Windows Command Terminal. Это странно - я не знаю, почему это не сработает. Это полностью сбивает с толку меня.
Process p = Runtime.getRuntime().exec( 
  new String[]{"cmd", "/C", "orgreg.bat"},
  null, 
  new File("D://TEST//home//libs//"));

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

 Suren13 июн. 2013 г., 14:39
добавить это ==> читатель BufferedReader = новый читатель BufferedReader (новый InputStreamReader (p.getInputStream ())); String line = reader.readLine (); while (line! = null) {System.out.println (line); line = reader.readLine (); }
Решение Вопроса

пуска (т.е. cmd).

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

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

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

 viveksinghggits28 июн. 2016 г., 10:24
Допустим, у меня есть массив команд, а затем итерация этого массива для выполнения всех команд (от i = 0 до commands.length) {Runtime.getRuntime (). exec ("cmd / c start build.bat"); } затем для каждой итерации (для каждой команды) открывается командное окно, что очевидно. Как можно избежать этого, я имею в виду выполнение всех команд в одном окне.
 Alex7819123 нояб. 2018 г., 00:42
Win+R (Runtime) может выполнять командные файлы напрямую.
 nanospeck14 июл. 2014 г., 10:38
Для меня это говорит, что Windows не может найти "build.bat". Так, где я должен поместить этот файл? Или как мне дать путь. Какие-либо предложения?
 Trejkaz26 сент. 2017 г., 08:52
У нас есть некоторый код, который напрямую вызывает «gradlew.bat», не помещая перед ним «cmd / c», и этот код работает как-то. Так что я думаю, что в какой-то момент Java или Windows исправили часть проблемы. Если мы попытаемся выполнить «gradlew», то это не получится, поэтому ясно, что «.bat» все еще нужен в конце.
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() );
}
 OhadR30 авг. 2018 г., 10:37
я предполагаю, что он хочет напечатать вывод сценария ....
 Baruch Atta12 июл. 2017 г., 19:58
Было бы полезно прокомментировать этот код и сказать нам, почему и что читает InputStream, и почему я забочусь. Кроме того, код для пакетного файла работает хорошо, но я не могу заставить его вызвать исключение ошибки.
 John Fisher06 сент. 2017 г., 23:55
Это свело бы меня с ума, если бы в моем коде было такое запутанное имя переменной, как «есть».

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

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);
 Amal lal T L20 сент. 2018 г., 14:48
что означает / с?

Расширить на@ 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();
}

которые существуют в пути C: / folder / folder.

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

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

 basszero11 янв. 2010 г., 12:52
Интересный выбор для восстановления старого поста ... ProcessBuilder предлагает больше контроля, в частности, возможность легко перенаправить stderr в stdout. Я также нахожу настройку более интуитивно понятным, но это личный преф
 Dan Polites10 янв. 2010 г., 23:57
Почему ProcessBuilder - это путь в Java 5/6?

если это то, что вы говорите ...

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

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

 Smamatti10 окт. 2012 г., 20:21
На вопрос уже ответили с рабочим решением. Вы должны предлагать только те решения, которые, как вы знаете, работают, и описывать, почему вы думаете, что ваше решение может быть лучше.

почему я создаю 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();

Ваш ответ на вопрос