Выполнить с параметрами - PullRequest
14 голосов
/ 27 января 2010

У меня проблемы с выполнением командного файла в 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"
        );   

Как это сделать?

Ответы [ 2 ]

17 голосов
/ 27 января 2010

Windows

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");
5 голосов
/ 27 января 2010

Нет, вы должны не заключать в кавычки аргументы * 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". Это предпочтительнее, потому что если скрипт когда-нибудь будет заменен на другой, написанный на другом языке, вам не придется обновлять вызывающее приложение.

Аналогично, в Windows вам не нужны аргументы "cmd" и "/ c". Средство запуска процесса / ОС должно автоматически запускать пакетный файл (на основе расширения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...