Выполнить с параметрами
Мне трудно выполнить пакетный файл в Java, который ожидает параметров. Эти параметры могут содержать пробелы, поэтому мне нужно их обернуть в кавычки. Мне также нужно будет сделать то же самое для Linux, потому что некоторые из параметров могут содержать специальные символы, такие как !
.
Нефункциональный код Windows:
ProcessBuilder pb = new ProcessBuilder(
"cmd",
"/c",
"\"mybat.bat\"",
"\"param 1\"",
"\"param 2\"",
"\"param 3\""
);
Нефункциональный код Linux:
ProcessBuilder pb = new ProcessBuilder(
"bash",
"-c",
"'myshellscript.sh'",
"'param 1'",
"'param 2'",
"'param 3'"
);
Я понимаю, что я должен добавлять параметры, такие как пример Windows ниже, но это не будет работать с пробелами:
ProcessBuilder pb = new ProcessBuilder(
"cmd",
"/c",
"mybat.bat param 1 param 2 param 3"
);
Как это сделать?
Ответы
Ответ 1
Окна:
ProcessBuilder pb = new ProcessBuilder(
"cmd", "/c", "mybat.bat",
"param 1", "param 2", "param 3");
Unix:
ProcessBuilder pb = new ProcessBuilder(
"sh", "mybat.sh",
"param 1", "param 2", "param 3");
Ответ 2
Нет, вы не должны указывать аргументы в * nix. Цитирование необходимо на * nix в интерактивной оболочке, чтобы предотвратить интерпретацию оболочки, но при запуске процесса непосредственно оболочка не задействована. Поэтому не нужно указывать.
Если вы включили кавычки, запущенный процесс увидит их как часть входящих аргументов и сделает такие вещи, как (например), попытаться открыть имена файлов, содержащие кавычки.
Вы также не хотите аргумент "-c" bash. Это говорит ему разбор следующего аргумента как командной строки, но вы предоставляете список аргументов. Удалите параметр "-c" и избыточные кавычки, и он должен работать.
Правильный вызов Linux будет следующим:
ProcessBuilder pb = new ProcessBuilder(
"bash",
"myshellscript.sh",
"param 1",
"param 2",
"param 3"
);
Также нет, если файл "myshellscript.sh" является исполняемым и имеет соответствующую строку shebang (например, "#!/bin/ bash" ), вам также не нужен аргумент "bash". Это предпочтительнее, потому что если script когда-либо заменяется одним написанным на другом языке, вам не придется обновлять ваше вызывающее приложение.
Аналогично, в Windows вам не нужны аргументы "cmd" и "/c". При запуске процесса/ОС должен автоматически запускаться пакетный файл (на основе расширения).