Выполнить с параметрами

Мне трудно выполнить пакетный файл в 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". При запуске процесса/ОС должен автоматически запускаться пакетный файл (на основе расширения).