Java ProcessBuilder向命令行添加额外的引号

Java ProcessBuilder向命令行添加额外的引号,java,windows,process,processbuilder,Java,Windows,Process,Processbuilder,我需要使用ProcessBuilder生成以下命令: “C:\Program Files\USBDeview\USBDeview.exe”/启用“我的USB设备” 我尝试了以下代码: ArrayList<String> test = new ArrayList<String>(); test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\""); test.add("/enable \"My USB Device\

我需要使用ProcessBuilder生成以下命令:

“C:\Program Files\USBDeview\USBDeview.exe”/启用“我的USB设备”
我尝试了以下代码:

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();   

注意
/enable
前面的引号和
设备
后面的两个引号。我需要去掉那些额外的引号,因为它们会导致调用失败。有人知道怎么做吗?

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

ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable");
test.add("\"My USB Device\"");
ArrayList test=new ArrayList();
test.add(“\”C:\\Program Files\\USBDeview\\USBDeview.exe\”);
测试。添加(“/enable”);
测试。添加(“我的USB设备”);

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

ArrayList<String> test = new ArrayList<String>();
test.add("C:\\Program Files\\USBDeview\\USBDeview.exe");
test.add("/enable");
test.add("My USB Device");
ArrayList test=new ArrayList();
test.add(“C:\\Program Files\\USBDeview\\USBDeview.exe”);
测试。添加(“/enable”);
测试。添加(“我的USB设备”);

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

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

myProcess.exe /myParameter="my value"
正如stefan所看到的,ProcessBuilder将在参数中看到空格,并用引号将其括起来,如下所示:

myProcess.exe "/myParameter="my value""
按照Joachim的建议分解参数值将导致
/myparameter=
之间出现空格“myvalue”
,这对此类参数不起作用:

myProcess.exe /myParameter= "my value"
根据Sun的说法,在他们看来,这不是一个bug和双引号来实现期望的行为

因此,为了最终回答stefan的问题,如果您正在调用的进程能够正确地执行操作,那么这是一个可行的替代方案:

ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable \\\"My USB Device\\\"");
ArrayList test=new ArrayList();
test.add(“\”C:\\Program Files\\USBDeview\\USBDeview.exe\”);
添加(“/enable\\\”我的USB设备\\\”);

这将为您提供命令
“C:\Program Files\USBDeview\USBDeview.exe”“/enable\“My USB Device\”
,这可能会起到作用;YMMV.

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

谢谢Joachim,你说得对。我得到额外引号的原因是启用和“我的…”之间的空格。像你想象的那样拆分它。当我从XML文件中读取完整命令时,解析现在变得有点复杂,但这是另一回事;-)观察得真好!是否有任何文档描述ProcessBuilder用双引号引用每个参数?您是否发现过一个官方引用声明ProcessBuilder将“看到参数中的空格并用引号括起来”?我可以从测试中确认这一点,但是,没有JavaDoc声明过这一点(或者至少没有我能找到的)。回答得好!