带有长参数的java runtime.getRuntime.exec(cmd)

我正在为命令行应用程序做一个前端。 它有一个很长的命令行是这样的:

public String liveShellCommand(){ String cmd="command mode --parameter arg --parameter2 arg2 --parameter3 arg3"; Runtime run = Runtime.getRuntime() ; Process pr ; try { log.progress("sending command: " +cmd); pr = run.exec( cmd ); pr.waitFor() ; 

在我将“模式”开关添加到其中之前,一切似乎都有效。 “mode”开关从命令行执行。 我尝试了一些组合将参数拆分成一个不执行的数组。 我认为它与“模式”有关 – 没有 – 在它面前,它不能有 – 在它面前。

我究竟做错了什么?

编辑:我忘了提到我能看到的就是:调试器在无法编译的源代码上停止了。 我正在使用netbeans,它似乎没有打印出堆栈跟踪。 它在run.exec(cmd)上停止。 java有什么问题吗?

我能够使用ProcessBuilder来运行它,而不仅仅是失败…

它解析“命令”就好了,但当我添加“命令模式”时

  java.io.IOException: Cannot run program "command mode": java.io.IOException: error=2, No such file or directory 

所以它无法解析我猜。

+1作为数组发送参数。

通过字符串发送所有内容可能在某些系统上有效但在其他系统上失败。

 Process start = Runtime.getRuntime().exec(new String[] { "java", "-version" }); BufferedReader r = new BufferedReader( new InputStreamReader(start.getErrorStream())); String line = null; while ((line = r.readLine()) != null) { System.out.println(line); } 

我知道你已经说过你尝试通过一系列字符串发送参数但没有成功,但是你收到了不同类型的错误吗? 如果其他程序有日志,您可能想看看出了什么问题。 您可以编写一个简单的脚本,输出调用它的参数来测试实际发生的事情。

使用ProcessBuilder并传递一个String []

  String[] cmmm = {arg3,arg4,arg5, arg6,arg7 }; ProcessBuilder pb = new ProcessBuilder(cmmm); pb.directory(new File(tDir)); Process p = pb.start(); 

一个数组就是答案。 由于命令的复杂性,我还使用了ArrayList。 无论如何……定义了arraylist,添加了命令,转换为数组,显示数组,发送命令..一切运作良好。 每个参数必须位于数组中自己的String中。

  List list = new ArrayList<>(); list.add("command"); list.add("param"); String[] command = (String[]) list.toArray(new String[0]); log.progress (list); run.exec (command);