调用可执行文件并传递参数。

90

我正在找到一种从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
new ProcessBuilder("C:\PathToExe\MyExe.exe","param1","param2").start(); 新的ProcessBuilder("C:\PathToExe\MyExe.exe","param1","param2").start(); - Prince John Wesley
2
http://download.oracle.com/javase/6/docs/api/java/lang/ProcessBuilder.html - Paweł Dyda
1
new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();这段代码用于启动一个进程,其中包括可执行文件的路径和参数。它可以用于处理选项参数吗?例如,-h 表示帮助等等。 - Lorenzo B
路径中有空格怎么办?再次感谢您,非常有帮助! - Lorenzo B
3
@Flex: 一个参数就是一个参数。参数的含义完全由运行的程序决定。一个程序可能会将“-h”解释为选项,另一个程序可能将其解释为文件名。ProcessBuilder既不知道也不关心。关于带有空格的路径:这就是为什么参数被表示为离散字符串而不是像命令行和某些糟糕的API中的以空格分隔的列表之一的原因之一。放心地加入空格,整个程序路径将被传递给操作系统以适当处理。 - T.J. Crowder
5个回答

124

在构造函数中传递参数。

Process process = new ProcessBuilder("C:\\PathToExe\\MyExe.exe","param1","param2").start();

9

澄清一下:ProcessBuilder#command(java.util.List)ProcessBuilder#command(String ...)将覆盖通过构造函数指定的任何现有命令(在我看来,文档中并不是很清楚)。 - domids

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

**


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 Kadhi

0

我建立了一个实用程序,非常基础的一个。

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

嘿,"new processBuilder" 是否解释管道 "|" 或者只是执行一个带有参数的二进制文件?我的意思是,能否在参数列表中添加管道?我的问题是,是否可以从网站上提供输入,并且任何恶意用户都可以在其中执行其他命令? - user1887464
如果我们在参数列表中不调用bash -c命令,它就无法正确解释管道符号? - user1887464

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接