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

时间:2011-06-22 01:44:57

标签: java parameters process runtime

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

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

所以它无法解析我猜。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

使用ProcessBuilder并将其传递给String []

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

答案 2 :(得分:0)

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

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