【问题标题】:pass multiple parameters to ProcessBuilder with a space使用空格将多个参数传递给 ProcessBuilder
【发布时间】:2013-06-12 09:38:01
【问题描述】:

我想将多个参数传递给 processBuilder,参数之间用空格隔开。

这是命令,

String[] command_ary = {dir+"library/crc"," -s ", fileName," ",addressRanges};

我需要在“fcrc”之后和“-p”之后以及“filename”和“addressRange”之间提供一个空格。

谢谢

【问题讨论】:

    标签: java processbuilder


    【解决方案1】:

    您不需要包含空格。 ProcessBuilder 将为您处理。只需一个一个地传递你的论点,没有空格:

    ProcessBuilder pb = new ProcessBuilder(
                             dir + "library/crc",
                             "-s",
                             fileName,
                             addressRanges);
    

    【讨论】:

    • 是的,但是我使用的 crc exe 需要在 crc 和 -s 之间以及文件名和传递的地址范围之间有空格,否则它会引发文件未找到异常
    • @mee 您确定“找不到文件”错误不是由其他原因引起的吗?如果您使用相对路径作为fileName,那么您可能需要为进程设置正确的工作目录(在调用pb.start() 之前使用pb.directory(...)
    【解决方案2】:

    我们需要命令行参数之间的空格,因为命令行需要知道哪个是第一个参数,哪个是第二个等等。但是,当我们使用ProcessBuilder 时,我们可以将一个数组传递给它,因此我们不需要添加这些空格来区分参数。 ProcessBuilder 会在检查后直接将命令数组传递给exec。例如,

    private static final String JAVA_CMD = "java";
    private static final String CP = "-cp";
    
    private static final String CLASS_PATH = "../bin";
    private static final String PROG = "yr12.m07.b.Test";
    private static final String[] CMD_ARRAY = { JAVA_CMD, CP, CLASS_PATH, PROG };
    ProcessBuilder processBuilder = new ProcessBuilder(CMD_ARRAY);
    

    上面的代码可以完美运行。

    此外,您可以使用

    Runtime.getRuntime().exec("java -cp C:/testt Test");
    

    但是使用 ProcessBuilder 更方便,一个原因是如果我们的参数包含空格,我们需要像 java -cp C:/testt \"argument with space\" 一样在 Runtime.getRuntime().exec() 中传递引号,但是使用 ProcessBuilder 我们可以摆脱它。

    ProcessBuilder processBuilder = new ProcessBuilder("command", "The first argument", "TheSecondWithoutSpace");
    

    【讨论】:

      【解决方案3】:

      像这样使用它:

      new java.lang.ProcessBuilder('netstat -an'.toString().split('\\s'))).start()

      【讨论】:

      • 在 Java 中 ' 用于单个字符,而不是字符串
      • 为什么我收到了反对票,这到底是怎么回事?您似乎没有使用过带有 1 个参数的 JSP webshel​​l,来吧,使用 CMD_ARRAY,现在告诉我,您是否要根据要执行的命令传递许多参数?不要逗我笑......我收到的这些反对票应该是相反的 OMG!
      • 这篇文章是几个月前的老兄。此外,您的代码无法编译,这可能是您的底池被否决的原因。