所以我花了半天试图让这个工作没有积极的结果。我使用 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。"\"C:\\namewith space\\database\\postgres_db\\bin\\pg_ctl.exe\" start"
我不断得到的错误(通过System.out.println("Exception Occurred: " + ex);
): java.io.IOException:无法运行程序" C:\ namewith space \ database \ postgres_db \ bin \ pg_ctl.exe" :文件名,目录名或卷标语法不正确。
如果您需要任何额外的部件/代码,请告诉我,我会尽力提供详细信息。
答案 0 :(得分:0)
尝试解决问题。
首先只需将IOException中显示的绝对路径读入File对象,然后调用exists()方法检查文件是否真的存在且JVM是否可以访问它。
如果这不起作用,请修复您的路径或访问权限。如果文件确实存在并且您可以访问它,那么创建ProcessBuilder 不带任何参数,只需使用exe的绝对路径。
您现在不应该获得IOException。 然后逐个添加参数。如果你找到一个打破了东西,然后修复参数(可能缺少双引号)并继续下一个直到你完成。