Java IOException при вызове exec с любыми аргументами командной строки

У меня есть Java-приложение, которое в конечном итоге довольно глубоко войдет во внешнюю интеграцию процессов, включая IPC с этими процессами. Однако сейчас я пытаюсь просто запустить скрипт powershell из java.

что у меня есть:

private void runPowershellScript() {
    String command =
            "" + "powershell" + " ";
//            Paths.get("").toAbsolutePath() + "\\" + scriptFileName + " " +
//            Paths.get("").toAbsolutePath() + "\\" + INPUT_FILE_NAME + " " +
//            Paths.get("").toAbsolutePath() + "\\" + OUTPUT_FILE_NAME + "";

    try {
        ProcessBuilder builder = new ProcessBuilder(command);
        builder.redirectErrorStream(true);
        Process process = builder.start();

        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;

        while ((line = reader.readLine ()) != null) {
            System.out.println ("Stdout: " + line);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}

С тем, что вы там видите, я получаю имя Windows Powershell и авторские права, выходящие из этого считывателя, но если я добавлю любую из закомментированных строк (все они разрешаются в правильные пути, например, C:\Users\Geoff\Code\OPTIP\FakeProgram.ps1), я получаю: java.io.IOException: Cannot run program "powershell C:\Users\Geoff\Code\OPTIP\FakeProgram.ps1 ": CreateProcess error=2, The system cannot find the file specified

Я перепробовал дюжину различных комбинаций сильных и слабых кавычек и попытался передать их в качестве аргументов cmd.exe /c powershell ..., но ничто из того, что я пробовал, не запускало сценарий. Если в командной строке есть один пробел, я получаю исключение ввода-вывода.

Мне интересно, может быть, это как-то связано с кодировкой символов? Когда я просто вызываю powershell, я получаю «возврат от reader.readLine()»: W\u0000i\u0000n\u0000 ... Что, как я полагаю, является способом моей IDE (IntelliJ) сообщить мне о своей «Windows Powershell» с нулевым символом юникода между каждой буквой .

В документации по ProcessBuilder для Java содержится немного расплывчатого именно то, что вы можете передать в качестве аргументов:

команда, список строк, обозначающих вызываемый файл внешней программы, и его аргументы, если таковые имеются. Какие списки строк представляют допустимую команду операционной системы, зависит от системы. Например, обычно каждый концептуальный аргумент является элементом в этом списке, но есть операционные системы, в которых ожидается, что программы сами разметят строки командной строки — в такой системе реализация Java может потребовать, чтобы команды содержали ровно два элемента.

Я не знаю, что это значит. Команда, которую я пытаюсь дать, работает из окна CMD и Powershell, а также из диалогового окна запуска Windows.

gist, содержащий класс вышеуказанного метода: https://gist.github.com/Groostav/9c5913e6f4696a25430d gist, содержащий мой скрипт powershell: https://gist.github.com/Groostav/347a283ac7ec6a738191

Спасибо за любую помощь.


person Groostav    schedule 09.08.2013    source источник


Ответы (1)


Вы должны поместить аргументы в отдельные строки, а не объединять их с вызовом powershell в виде одной строки. Что-то типа

new ProcessBuilder("Powershell", scriptFileName,  INPUT_FILE_NAME);
person FrankPl    schedule 09.08.2013
comment
Стыдно сказать, что понял. Огромное спасибо. Проблема, с которой я столкнулся сейчас, заключается в том, что Process Java плохо работает с PowerShell, возможно, потому, что PowerShell не использует стандартный вход, ошибку и выход? - person Groostav; 13.08.2013