Programowanie w Javie: wywołanie exe z Javy i przekazanie parametrów

87

Wymyślam mechanizm wywoływania exe z Javy i przekazywania określonych parametrów. Jak mam to zrobić?

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

Poprzedni kod działa. Ale nie mogę przekazać parametrów . MyExe.exe akceptuje parametry. Innym problemem jest sytuacja, gdy PathToExe ma spacje. ProcessBuilder wydaje się nie działać. Na przykład:

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

Dziękuję Ci.

Lorenzo B
źródło
1
new ProcessBuilder ("C: \\ PathToExe \\ MyExe.exe", "param1", "param2"). start ();
Książę John Wesley,
1
new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();Czy ten fragment jest wartościowy dla argumentów opcji? Na przykład -h to oznacza pomoc i tak dalej ..
Lorenzo B
a co ze ścieżkami z pustymi spacjami? Jeszcze raz dziękuję. Bardzo pomocny!!
Lorenzo B
3
@Flex: Argument to argument. Znaczenie argumentu zależy wyłącznie od uruchomionego programu. Jeden program mógłby zinterpretować -hjako opcję, inny mógłby to zinterpretować jako nazwę pliku. ProcessBuilderani nie wie, ani się tym nie przejmuje. Odpowiadaj ścieżki ze spacjami: To jeden z powodów, dla których argumenty są podawane jako dyskretne ciągi, a nie jako (powiedzmy) lista rozdzielana spacjami, jak w wierszu poleceń i niektórych słabych interfejsach API. Wrzuć tam spacje bez porzucenia, cała ścieżka programu zostanie przekazana do systemu operacyjnego w celu potraktowania jako stosownego.
TJ Crowder,

Odpowiedzi:

119

Przekaż swoje argumenty w samym konstruktorze.

Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();
Książę John Wesley
źródło
Co jeśli plik wykonywalny znajduje się w pliku JAR?
t4d_
@Guys. proszę o pomoc w rozwiązaniu stackoverflow.com/questions/43050217/ ...
gstackoverflow
8

Jesteś na dobrej drodze. Te dwa konstruktory akceptują argumenty lub możesz określić je po konstrukcji za pomocą ProcessBuilder#command(java.util.List)i ProcessBuilder#command(String...).

TJ Crowder
źródło
Dla wyjaśnienia: ProcessBuilder#command(java.util.List)i ProcessBuilder#command(String...)nadpisz wszystkie istniejące polecenia określone przez konstruktor (nie jest to zbyt jasne w dokumentacji).
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"); 
    }
}
Shikha Chauhan
źródło
1
Gdzie umieścić argumenty?
Mert Serimer,
1
@Shikha, przejdź proszę do pytania
Anand
0

Poniżej działa dla mnie, jeśli twój exe zależy od jakiejś biblioteki DLL lub określonej zależności, musisz ustawić ścieżkę do katalogu. Jak wspomniano poniżej exePath oznacza folder, w którym został umieszczony exe wraz z plikami referencyjnymi.

Aplikacja exe tworząca dowolny plik tymczasowy, więc utworzy w folderze wzmiankę w katalogu 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
źródło