ProcessBuilder为命令行添加了额外的引号

时间:2012-08-25 19:21:21

标签: java windows process processbuilder

我需要使用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 个答案:

答案 0 :(得分:13)

Joachim是正确的,但是当你的流程需要统一的参数时,他的答案是不够的:

myProcess.exe /myParameter="my value"

正如stefan所见,ProcessBuilder会在你的参数中看到空格并用引号括起来,如下所示:

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

按照Joachim推荐的方式分解参数值会导致/myparameter="my value"之间的空格,这对于此类参数不起作用:

myProcess.exe /myParameter= "my value"

根据Sun的说法,在infinite wisdom中,它不是一个错误,而是双引号can be escaped来实现所需的行为。

所以最后回答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。

答案 1 :(得分: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\"");

答案 2 :(得分: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不需要它们,因为它已经被赋予了pre-split的参数。 / p>

答案 3 :(得分:0)

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