Программирование на Java: вызов исполняемого файла из Java и передача параметров

87

Я выясняю механизм вызова exe из Java и передачи определенных параметров. Как я могу сделать?

Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe").start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;

System.out.printf("Output of running %s is:", Arrays.toString(args));

while ((line = br.readLine()) != null) {
  System.out.println(line);
}

Предыдущий код работает. Но я не могу передавать параметры . MyExe.exe принимает параметры. Другая проблема - когда в PathToExe есть пробелы. ProcessBuilder не работает. Например:

C:\\User\\My applications\\MyExe.exe

Спасибо.

Лоренцо Б
источник
1
новый ProcessBuilder ("C: \\ PathToExe \\ MyExe.exe", "param1", "param2"). start ();
Принц Джон Уэсли,
1
new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();Цен ли этот фрагмент для аргументов опции? Например -h, что означает помощь, и так далее ..
Лоренцо Б
как насчет путей с пробелами? Еще раз спасибо. Очень полезно!!
Lorenzo B,
3
@Flex: аргумент - это аргумент. Значение аргумента полностью зависит от выполняемой программы. Одна программа может интерпретировать -hее как параметр, другая - как имя файла. ProcessBuilderне знает и не заботится. Пути повторения с пробелами: это одна из причин, по которой аргументы задаются как дискретные строки, а не как (скажем) список с разделителями-пробелами, как в командной строке и в некоторых плохих API. Если бросить туда пробелы, весь путь к программе будет отдан ОС для обработки.
TJ Crowder

Ответы:

119

Передайте свои аргументы в самом конструкторе.

Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();
Принц Джон Уэсли
источник
Что, если исполняемый файл находится внутри файла Jar?
t4d_
@ Ребята. пожалуйста, помогите решить stackoverflow.com/questions/43050217/…
gstackoverflow
8

Вы на правильном пути. Эти два Конструкторы принимают аргументы, или вы можете указать их после окончания строительства с ProcessBuilder#command(java.util.List)и ProcessBuilder#command(String...).

TJ Crowder
источник
Для пояснения: ProcessBuilder#command(java.util.List)и ProcessBuilder#command(String...)напишите любые существующие команды, указанные через конструктор (imho, это не очень ясно из документации).
Snozzlebert
0
import java.io.IOException;
import java.lang.ProcessBuilder;

public class handlingexe {
    public static void main(String[] args) throws IOException {
        ProcessBuilder p = new ProcessBuilder();
        System.out.println("Started EXE");
        p.command("C:\\Users\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe");   

        p.start();
        System.out.println("Started EXE"); 
    }
}
Шиха Чаухан
источник
1
Куда ставить аргументы?
Mert Serimer
1
@Shikha, пожалуйста, ответьте на вопрос
Anand j. Kadhi
0

Ниже работает для меня, если ваш exe зависит от некоторой dll или определенной зависимости, тогда вам нужно установить путь к каталогу. Как указано ниже, exePath означает папку, в которой размещается exe вместе со ссылками на файлы.

Приложение Exe, создающее любой временный файл, поэтому оно будет создано в папке, упомянутой в processBuilder.directory (...)

**

ProcessBuilder processBuilder = new ProcessBuilder(arguments);
processBuilder.redirectOutput(Redirect.PIPE);
processBuilder.directory(new File(exePath));
process = processBuilder.start();
int waitFlag = process.waitFor();// Wait to finish application execution.
if (waitFlag == 0) {
...
 int returnVal = process.exitValue();
} 

**

user3124811
источник