У меня есть 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
Спасибо за любую помощь.