13

我需要使用 ProcessBuilder 构建以下命令:

"C:\Program Files\USBDeview\USBDeview.exe" /enable "My USB Device"

我尝试使用以下代码:

ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable \"My USB Device\"");  

ProcessBuilder processBuilder = new ProcessBuilder(test);                       
processBuilder.start().waitFor();   

但是,这会将以下内容传递给系统(使用 Sysinternals Process Monitor 验证)

"C:\Program Files\USBDeview\USBDeview.exe" "/enable "My USB Device""

注意前面/enable的引号和后面的两个引号Device。我需要去掉那些额外的引号,因为它们会使调用失败。有谁知道如何做到这一点?

4

4 回答 4

17

Joachim 是正确的,但是当您的流程需要如下统一参数时,他的回答是不够的:

myProcess.exe /myParameter="my value"

正如 stefan 所见,ProcessBuilder 将在您的参数中看到空格并将其括在引号中,如下所示:

myProcess.exe "/myParameter="my value""

按照 Joachim 的建议拆分参数值将导致/myparameter=和之间有一个空格"my value",这对于这种类型的参数不起作用:

myProcess.exe /myParameter= "my value"

根据 Sun 的说法,在他们无限的智慧中,这不是一个错误,可以转义双引号以实现所需的行为。

因此,要最终回答 stefan 的问题,如果您调用的进程正确执行,这是一个应该有效的替代方法:

ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable \\\"My USB Device\\\"");

这应该给你命令"C:\Program Files\USBDeview\USBDeview.exe" "/enable \"My USB Device\"",这可能会奏效;YMMV。

于 2013-11-15T20:02:15.640 回答
10

据我了解,由于 ProcessBuilder 不知道如何将参数传递给命令,因此您需要将参数分别传递给 ProcessBuilder;

ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable");
test.add("\"My USB Device\"");
于 2012-08-25T19:26:08.863 回答
5

首先,您需要自己拆分参数 -ProcessBuilder不会为您这样做 - 其次,您不需要在参数值周围加上转义引号。

ArrayList<String> test = new ArrayList<String>();
test.add("C:\\Program Files\\USBDeview\\USBDeview.exe");
test.add("/enable");
test.add("My USB Device");

命令行上的引号是必要的,以便告诉 cmd 解析器如何将单词分解为参数,但ProcessBuilder不需要它们,因为它已经预先分配了参数。

于 2013-08-07T07:54:15.720 回答
0

我无法让它以上述任何方式工作。我最终将命令写入一个单独的脚本(每个空格都有“\”)并将其写入脚本文件,然后调用脚本文件。

于 2021-01-09T00:31:43.673 回答