gpt4 book ai didi

java - 如何使用包含双引号的参数从 Java 启动进程

转载 作者:行者123 更新时间:2023-12-01 01:40:55 62 4
gpt4 key购买 nike

我需要从我的 Java 程序启动第二个 Java 进程,并且 fork 进程的参数之一需要包含文字双引号字符 (")。我如何在一种可移植的方式,也就是说它至少可以在 Linux 和 Windows 上运行?


我尝试使用 ProcessBuilder(引入它是为了克服 Runtime 类的问题,对吗?)将字符串数组用作命令行,但仍然存在包含引号的参数有问题:

List<String> commandLine = new ArrayList<String>();
commandLine.add(new File(System.getProperty("java.home") + "/bin/java").getAbsolutePath());
commandLine.addAll(Arrays.asList("-jar", "plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar", "-application", "org.eclipse.equinox.p2.director", "-repository", "http://download.eclipse.org/releases/juno"));
commandLine.add("-list");
commandLine.add("Q:select(x | x.id == \"org.eclipse.sdk.ide\")");

new ProcessBuilder().command(commandLine).directory(eclipseInstallationDir).start().waitFor();

上面的代码(在 Windows 上)不起作用,因为 ProcessBuilder(或其他东西)占用了最后一个参数中的双引号:

进程接收参数 Q:select(x | x. id == org.eclipse.sdk.ide) 然后失败。


我发现我可以通过在需要 " 的参数中添加 \" 使其在 Windows 上运行,即

commandLine.add("Q:select(x | x.id == \"org.eclipse.sdk.ide\")".replace("\"", "\\\""));

但这会中断 Linux 上的调用(正如 morgano 所确认的)。所以我不得不再次检测操作系统。在 Java 中,真的没有简单、可移植的方法来启动一个参数恰好是字符串数组内容的进程吗?

最佳答案

通常,命令参数字符串围绕空格拆分以形成参数数组。但是,如果您希望单个参数包含空格,则可以将参数括在引号中。稍后,每个 引号将从字符串中删除。删除这些引号的不是 Java,而是操作系统本身。

ProcessBuilder 将您提供的每个参数用引号括起来,这样如果任何参数包含空格,它就不会被操作系统进一步拆分为多个参数(您可以通过提供 1234\"\"5678;这将最终成为两个参数:12345678)。然后 ProcessBuilder 将所有参数连接到一个命令中,并将其传递给操作系统。稍后,操作系统将命令字符串按空格和引号拆分(如上所述),然后在开始新进程之前从每个字符串参数中删除所有引号对。要转义引号(即,将其视为操作系统解析器不会以不同方式处理的常规字符),请在其前面使用反斜杠字符。这是 Linux 和 Windows 的命令行转义字符。这看起来像:\\\"

关于java - 如何使用包含双引号的参数从 Java 启动进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18099499/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com