ProcessBuilder добавляет дополнительные кавычки в командную строку

мне нужно создать следующую команду с помощью ProcessBuilder:

"C:Program FilesUSBDeviewUSBDeview.exe" /enable "My USB Device"

я попробовал со следующим кодом:

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

ProcessBuilder processBuilder = new ProcessBuilder(test);                       
processBuilder.start().waitFor();   

однако это передает в систему следующее (проверено с помощью Sysinternals Process Monitor)

"C:Program FilesUSBDeviewUSBDeview.exe" "/enable "My USB Device""

обратите внимание на цитату перед /enable и две цитаты после Device. Мне нужно избавиться от этих дополнительных цитат, потому что они делают вызов неудачным. Кто-нибудь знает, как это сделать?

3 ответов


насколько я понимаю, поскольку ProcessBuilder понятия не имеет, как параметры должны быть переданы команде, вам нужно будет передать параметры отдельно ProcessBuilder;

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

Иоахим прав, но его ответ недостаточен, когда ваш процесс ожидает унифицированных аргументов, как показано ниже:

myProcess.exe /myParameter="my value"

как видно из Стефана, ProcessBuilder увидит пробелы в вашем аргументе и обернет его в кавычки, например:

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

разбиение значений параметров, как рекомендует Иоахим, приведет к пробелу между /myparameter= и "my value", который не будет работать для этого типа параметра:

myProcess.exe /myParameter= "my value"

согласно Sun, в их бесконечность мудрость!--15-->, это не ошибка и двойные кавычки можно избежать для достижения желаемого поведения.

Итак, чтобы наконец ответить на вопрос Стефана, это альтернатива, которая должна работать, если процесс, который вы вызываете, делает все правильно:

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.


во-первых, вам нужно разделить аргументы самостоятельно -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.