我需要使用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
之后的两个引号。我需要摆脱那些额外的引号,因为它们使调用失败。有谁知道怎么做?
答案 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)
我无法以上述任何一种方式使其工作。我最终将命令写入一个单独的脚本(每个空格都带有“\”)并将其写入脚本文件,然后调用脚本文件。