【问题标题】:Java 1.7, APMHAL, sending a multiple argument command to CLIJava 1.7,APMHAL,向 CLI 发送多参数命令
【发布时间】:2014-08-07 09:22:01
【问题描述】:

我正在尝试向另一个程序 APMHAL 发送命令,该程序基本上与外部硬件通信。我需要发送一个类似“apmhalcli command1 parameter1”的命令 比它成功。但是如果我尝试像“apmhalcli command1 --parameter1 --parametr2”这样的 它说: 无法运行程序“......”错误号=2,没有这样的文件或目录

但是,如果我自己在 cli 中键入完全相同的命令,它就会起作用。 (所以,如果我的 java 程序发送它,而不是错误,如果我写它就会成功)。

到目前为止,我尝试了这些:

    String p1 = "command1 ";
    String p2 = "--parameter1 --parametr2";

    try {
        new ProcessBuilder(p1 + p2).start();
    } catch(IOException e1) {
        e1.printStackTrace();
    }

    try {
        Process pb = Runtime.getRuntime().exec(p1 + p2);
    } catch(IOException e1) {
        e1.printStackTrace();
    }

任何想法,如何将命令插入 cli 并模拟“输入”?我已经尝试了几天才能让它工作...谢谢您的时间。

编辑:这是我在您的帮助下实现并尝试过的。

    ProcessBuilder pb = new ProcessBuilder("apmhalcli", "openGate", "--module " + col, " --locker " + row);
    pb.redirectErrorStream(true);
    pb.redirectOutput(new File("out1.txt"));
    try
    {
        pb.start();
    }
    catch(IOException e1)
    {
        e1.printStackTrace();
    }

    pb = new ProcessBuilder("apmhalcli openGate", "--module " + col, " --locker " + row);
    pb.redirectErrorStream(true);
    pb.redirectOutput(new File("out2.txt"));
    try
    {
        pb.start();
    }
    catch(IOException e1)
    {
        e1.printStackTrace();
    }

    pb = new ProcessBuilder("apmhalcli", "openGate", "--module " + col + " --locker " + row);
    pb.redirectErrorStream(true);
    pb.redirectOutput(new File("out3.txt"));
    try
    {
        pb.start();
    }
    catch(IOException e1)
    {
        e1.printStackTrace();
    }

    pb = new ProcessBuilder("apmhalcli openGate", "--module " + col + " --locker " + row);
    pb.redirectErrorStream(true);
    pb.redirectOutput(new File("out4.txt"));
    try
    {
        pb.start();
    }
    catch(IOException e1)
    {
        e1.printStackTrace();
    }

    pb = new ProcessBuilder("apmhalcli openGate --module " + col + " --locker " + row);
    pb.redirectErrorStream(true);
    pb.redirectOutput(new File("out5.txt"));
    try
    {
        pb.start();
    }
    catch(IOException e1)
    {
        e1.printStackTrace();
    }

number out1 和 out3 记录只使用了“apmhalcli openGate”,后面的部分被忽略了。如前所见,其他变体刚刚失败,错误类型=2

【问题讨论】:

  • 是否有意根据它是哪个 ProcessBuilder 以不同的方式对命令进行标记?
  • 是的。我想获得一些见解,也许找到一种方法。但只有第 1 条和第 3 条被识别为有效命令。并且这些论点被忽略了......所以它只是给出了一种“帮助”响应。
  • 试试new ProcessBuilder("apmhalcli", "openGate", "--module", "" + col, "--locker", "" + row);
  • @Zhuinden 它有效!您可以将其作为答案发送,以便我可以将此主题标记为已回答吗?

标签: java command-line-interface


【解决方案1】:

ProcessBuilder 期望您将命令拆分为单独的单词,它不会为您分解它。此外,您不能只是“触发并忘记”Process,您必须继续与之交互,特别是您需要读取或重定向进程中的输出和错误流,并且您需要 waitFor要完成的过程。

ProcessBuilder pb = new ProcessBuilder("command1", "--param1", "--param2");

// option 1 - redirect output to a file
pb.redirectErrorStream(true);
pb.redirectOutput(new File("out.txt"));
Process p = pb.start();

// option 2 - send output to the Java process's own System.out
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
Process p = pb.start();

// option 3 - read the output yourself in Java
pb.redirectErrorStream(true);
Process p = pb.start();
InputStream in = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = reader.readLine()) != null) {
  // do something with the line
}

// and once you've dealt with the output in one of these three ways...
int exitCode = p.waitFor();

还有一点需要注意的是Java只能直接执行.exe文件——如果你要运行的命令是.bat那么你需要使用cmd.exe——还有很多其他的例子在其他问题。

【讨论】:

  • 谢谢。我不再收到错误消息:) 但是也没有其他任何事情发生...此外,当我没有将其拆分时,只需要提供 1 个参数而不是 2 个(这是一个不同的命令,但是相同的软件),它工作。
  • @SzabóBalázs 我添加了更多细节 - 在您致电 start() 后,您还有其他事情要做
  • 文本输出非常有用。现在我知道,该进程构建器已经单独执行了第一个命令,没有其他命令。比继续执行每隔一个位。 (一切除以 , )。现在流程构建器是这样的: ProcessBuilder pb = new ProcessBuilder("apmhalcli", "openGate", "--module " + col, " --locker " + row);
  • @SzabóBalázs 每个参数都需要是一个单独的字符串,即new ProcessBuilder("apmhalcli", "openGate", "--module", col, "--locker", row)
  • 是的,就在 2 分钟前,其他人评论了它。它奏效了。我认为不同类型的数据需要分开。但是谢谢你,现在我意识到这应该如何工作并且确实如此。非常感谢 Ian Roberts 和 Zhuinden 的帮助!!! =)
猜你喜欢
  • 2012-03-15
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2017-02-01
  • 2014-04-12
相关资源
最近更新 更多