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

2022-09-04 06:34:03

我需要使用 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();   

但是,这会将以下内容传递到系统(使用系统内部进程监视器进行验证)

"C:\Program Files\USBDeview\USBDeview.exe" "/enable "My USB Device""

请注意 前面的引号和 之后的两个引号。我需要删除那些额外的引号,因为它们会使调用失败。有人知道如何做到这一点吗?/enableDevice


答案 1

约阿希姆是正确的,但是当你的过程期望以下统一的论点时,他的答案是不够的:

myProcess.exe /myParameter="my value"

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

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

按照 Joachim 的建议分解参数值将导致 和 之间的空格,这不适用于此类参数:/myparameter="my value"

myProcess.exe /myParameter= "my value"

根据Sun的说法,在他们无限的智慧中,它不是一个错误,双引号可以逃脱以实现所需的行为。

因此,为了最终回答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\""


答案 2

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

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

推荐