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.
java
exe
processbuilder
Lorenzo B
źródło
źródło
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 ..-h
jako opcję, inny mógłby to zinterpretować jako nazwę pliku.ProcessBuilder
ani 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.Odpowiedzi:
Przekaż swoje argumenty w samym konstruktorze.
Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();
źródło
Jesteś na dobrej drodze. Te dwa konstruktory akceptują argumenty lub możesz określić je po konstrukcji za pomocą
ProcessBuilder#command(java.util.List)
iProcessBuilder#command(String...)
.źródło
ProcessBuilder#command(java.util.List)
iProcessBuilder#command(String...)
nadpisz wszystkie istniejące polecenia określone przez konstruktor (nie jest to zbyt jasne w dokumentacji).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"); } }
źródło
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(); }
**
źródło