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

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

"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进行validation)

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

注意/enable前的报价和Device之后的两个报价。 我需要摆脱这些额外的引号,因为他们使调用失败。 有谁知道如何做到这一点?

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

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

约阿希姆是正确的,但是当你的过程期望统一论点如下时,他的回答是不够的:

 myProcess.exe /myParameter="my value" 

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

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

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

 myProcess.exe /myParameter= "my value" 

根据Sun的说法,他们有着无限的智慧 ,这不是一个错误,双引号可以逃脱 ,达到预期的行为。

所以为了最终回答斯特凡的问题,如果你正在调用的过程能够正确地做到这一点,那么这是一个可行的方法:

 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\"" ,这可能会伎俩; 因人而异。

首先,你需要自己分解参数 – 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不需要它们,因为它已经被赋予了参数预分割。