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.