我认为您不需要包含 cmd 位。我写了一个小例子,说明如何使用 ProcessBuilder 为 Windows 中的记事本可执行文件提供参数。它应该和你正在做的一样。
package test;
import java.io.File;
import java.util.LinkedList;
public class MainTest {
public static void main(String[] args){
System.out.print("Starting");
try
{
File f = new File("TestStuff.txt");
f.createNewFile();
ProcessBuilder pb = new ProcessBuilder();
LinkedList<String> cmds = new LinkedList<String>();
cmds.add("notepad");
cmds.add("TestStuff.txt");
pb.command(cmds);
Process p = pb.start();
p.waitFor();
}
catch (Exception e) {
}
}
}
这与打开 CMD 并输入记事本 TestStuff.txt 相同。
同样重要的是要注意某些应用程序需要您从它们的输入流中读取才能完成它们。如果记事本这样操作,p.waitFor() 只会在外部进程被杀死时返回。所以一定要阅读进程的输入流。
我还使用各种 jar 文件对此进行了测试,例如
....
cmds.add("java");
cmds.add("-jar");
cmds.add(pathToSomeExecutableJar);
....
授予我包含从流中读取的代码,如下所示:
InputStream is = p.getInputStream();
BufferedReader bsr = new BufferedReader(new InputStreamReader(is));
String s;
while ((s = bsr.readLine()) != null) System.out.println(s);