当Path中的空格时,Java ProcessBuilder错误

时间:2017-06-07 18:36:04

标签: java processbuilder spaces

所以我花了半天试图让这个工作没有积极的结果。我使用 Java ProcessBuilder 来执行带有几个参数的.exe文件,但文件路径包含空格,不知怎的,我无法正常工作。我已经检查了许多其他SO帖子,并实现了带有转义引号的环绕声代码等解决方案,并将其分解为命令和参数等。我的代码如下:

try {
    ProcessBuilder pBuilder = new ProcessBuilder(
        // Main Command.
        "C:\\namewith space\\database\\postgres_db\\bin\\pg_ctl.exe",
        // Command Parameters.
        "start",
        "-D C:\\namewith space\\database\\database",  
        /*The quotes in the next argument are necessary, the -o stands for 'options' and everything between the quotes are the actual database parameters which to start the Database with.*/
        "-o \"-p 15000\"",
        "-l C:\\namewith space\\database\\postgres_db\\bin\\postgres_log.txt");

    File log = new File("\"C:\\folder\\log.txt\"");
    pBuilder.redirectErrorStream(true);
    pBuilder.redirectOutput(Redirect.appendTo(log));
    Process p = pBuilder.start();
    } catch (IOException ex) {
        System.out.println("Exception Occurred: " + ex);
    }

到目前为止我已尝试过:

  • 周围并没有围绕上述代码中的每个/任何路径使用转义引号,以防万一(重要的是告诉我它......)。
  • 使用Runtime.getRuntime().exec("full command with/without any/all escaped quotes");方法,但在搜索时我发现每个人都说你应该使用ProcessBuilder。
  • 在ProcessBuiler的第一个命令String中以不同的方式将上述代码的一部分组合在一起,如"\"C:\\namewith space\\database\\postgres_db\\bin\\pg_ctl.exe\" start"
  • 文件100%位于给定路径,我手动检查了这一点,并将文件资源管理器中的路径粘贴了10次。
  • 将命令拆分为将命令的工作目录设置为C:\ namewith space \,然后添加没有该部分的args。

我不断得到的错误(通过System.out.println("Exception Occurred: " + ex);): java.io.IOException:无法运行程序" C:\ namewith space \ database \ postgres_db \ bin \ pg_ctl.exe" :文件名,目录名或卷标语法不正确。

如果您需要任何额外的部件/代码,请告诉我,我会尽力提供详细信息。

1 个答案:

答案 0 :(得分:0)

尝试解决问题。

首先只需将IOException中显示的绝对路径读入File对象,然后调用exists()方法检查文件是否真的存在且JVM是否可以访问它。

如果这不起作用,请修复您的路径或访问权限。如果文件确实存在并且您可以访问它,那么创建ProcessBuilder 不带任何参数,只需使用exe的绝对路径。

您现在不应该获得IOException。 然后逐个添加参数。如果你找到一个打破了东西,然后修复参数(可能缺少双引号)并继续下一个直到你完成。