我需要使用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进程监视器进行验证)
"C:\Program Files\USBDeview\USBDeview.exe" "/enable "My USB Device""
注意前面的引述 /enable
后面的两个引号 Device
. 我需要去掉那些多余的引号,因为它们使调用失败。有人知道怎么做吗?
4条答案
按热度按时间p1iqtdky1#
我无法让它以上述任何一种方式工作。最后,我将命令写入一个单独的脚本(每个空格都有“\”),并将其写入脚本文件,然后调用脚本文件。
4szc88ey2#
首先,你需要自己分辩-
ProcessBuilder
不需要这样做-第二,不需要在参数值周围加转义引号。命令行上的引号是必要的,以便告诉cmd解析器如何将单词分解为参数,但是
ProcessBuilder
不需要它们,因为它已经被预先分配了参数。wb1gzix03#
joachim是正确的,但是当您的流程需要以下统一的参数时,他的答案是不够的:
正如stefan所看到的,processbuilder将看到参数中的空格并将其括在引号中,如下所示:
按照joachim的建议分解参数值将导致
/myparameter=
以及"my value"
,对于这种类型的参数不起作用:据孙先生说,在他们无穷的智慧中,这不是一个bug,双引号可以实现理想的逃脱行为。
因此,要最终回答stefan的问题,如果您调用的进程正确地执行操作,那么这是一个可行的替代方法:
这应该是你的命令
"C:\Program Files\USBDeview\USBDeview.exe" "/enable \"My USB Device\""
,这可能会起作用;基督教青年会。mqxuamgl4#
据我所知,由于processbuilder不知道如何将参数传递给命令,因此需要将参数分别传递给processbuilder;