processbuilder向命令行添加额外的引号

px9o7tmv  于 2021-07-09  发布在  Java
关注(0)|答案(4)|浏览(437)

我需要使用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 . 我需要去掉那些多余的引号,因为它们使调用失败。有人知道怎么做吗?

p1iqtdky

p1iqtdky1#

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

4szc88ey

4szc88ey2#

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

wb1gzix0

wb1gzix03#

joachim是正确的,但是当您的流程需要以下统一的参数时,他的答案是不够的:

myProcess.exe /myParameter="my value"

正如stefan所看到的,processbuilder将看到参数中的空格并将其括在引号中,如下所示:

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

按照joachim的建议分解参数值将导致 /myparameter= 以及 "my value" ,对于这种类型的参数不起作用:

myProcess.exe /myParameter= "my value"

据孙先生说,在他们无穷的智慧中,这不是一个bug,双引号可以实现理想的逃脱行为。
因此,要最终回答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\"" ,这可能会起作用;基督教青年会。

mqxuamgl

mqxuamgl4#

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

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

相关问题