90

I'm figuring out a mechanism to call an exe from Java and passing in specific parameters. How can I do?

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

The previous code works. But I'm not able to pass parameters in. MyExe.exe accepts parameters. An other problem is when PathToExe has blank spaces. ProcessBuilder seems not working. For example:

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

Thank you.

Dave Jarvis
31.3k43 gold badges186 silver badges327 bronze badges
asked Apr 9, 2011 at 11:19
5
  • 1
    new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start(); Commented Apr 9, 2011 at 11:24
  • 2
    download.oracle.com/javase/6/docs/api/java/lang/… Commented Apr 9, 2011 at 11:25
  • 1
    new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start(); Is this snippet valuable for option arguments? For example -h that stands for help and so on.. Commented Apr 9, 2011 at 12:27
  • what about paths with blank spaces? Thank you again. Very helpful!! Commented Apr 9, 2011 at 12:28
  • 3
    @Flex: An argument is an argument. The meaning of the argument is entirely up to the program being run. One program could interpret -h to be an option, another could interpret it as a filename. ProcessBuilder neither knows nor cares. Re paths with spaces: That's one of the reasons that arguments are given as discrete strings rather than as (say) a space-delimited list as on the command-line and in some poor APIs. Throw spaces in there with abandon, the whole program path will be given to the OS to treat as appropriate. Commented Apr 9, 2011 at 12:41

5 Answers 5

124

Pass your arguments in constructor itself.

Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();
answered Apr 9, 2011 at 11:31
Sign up to request clarification or add additional context in comments.

Comments

9

You're on the right track. The two constructors accept arguments, or you can specify them post-construction with ProcessBuilder#command(java.util.List) and ProcessBuilder#command(String...).

answered Apr 9, 2011 at 11:25

1 Comment

For clarification: ProcessBuilder#command(java.util.List) and ProcessBuilder#command(String...) owerwrite any existing commands specified via the constructor (imho that's not very clear from the docs).
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"); 
 }
}
Pang
10.2k146 gold badges87 silver badges126 bronze badges
answered Sep 15, 2016 at 4:23

2 Comments

Where to put args?
@Shikha please go through the question
0

Below works for me if your exe depend on some dll or certain dependency then you need to set directory path. As mention below exePath mean folder where exe placed along with it's references files.

Exe application creating any temporaray file so it will create in folder mention in 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();
} 

**

answered Oct 7, 2016 at 7:46

Comments

0

I built a utility for the same, very basic one.

 public class CallOsExeUtil {
 public static String call(String[] args) throws IOException, InterruptedException {
 ProcessBuilder processBuilder = new ProcessBuilder(args);
 Process process = processBuilder.start();
 int waitFlag = process.waitFor();// Wait to finish application execution.
 StringBuilder sb = new StringBuilder("");
 if (waitFlag == 0) {
 if (process.exitValue()==0) {
 System.out.println("This is me " + process.info());
 BufferedInputStream in = (BufferedInputStream) process.getInputStream();
 byte[] contents = new byte[1024];
 int bytesRead = 0;
 while ((bytesRead = in.read(contents)) != -1) {
 sb.append(new String(contents, 0, bytesRead));
 }
 }
 }
 return sb.toString();
 }
 }
answered Apr 22, 2022 at 16:36

2 Comments

Hey, does "new processBuilder" interpret pipe "|" or it only executes one binary with arguments ? I mean can you add pipes in the arguments list ? I am asking is can the input be given from website and any malicious user executes other commands in it ?
If we don't invoke bash -c command in argument list it will not interpret pipe right ?

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.