我需要使用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
不需要它们,因为它已经被赋予了参数预分割。