Я пытаюсь запустить приложение Java, которое создает новый процесс PowerShell при запуске, а затем взаимодействует с ним несколько раз. Вызов powershell.exe и его выполнение single command и return output отлично работают для меня.Проблема возникает, если я не хочу, чтобы процесс powershell немедленно завершал / завершал работу, а оставался в рабочем состоянии. en, чтобы я мог писать в его outputStream и получать результаты обратно из inputStream.
String input = "dir";
String[] commandList = {"powershell.exe", "-Command", "dir"};
ProcessBuilder pb = new ProcessBuilder(commandList);
Process p = pb.start();
if(input != null) {
PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true);
writer.println(input);
writer.flush();
writer.close();
}
//p.getOutputStream().close();
Gobbler outGobbler = new Gobbler(p.getInputStream());
Gobbler errGobbler = new Gobbler(p.getErrorStream());
Thread outThread = new Thread(outGobbler);
Thread errThread = new Thread(errGobbler);
outThread.start();
errThread.start();
System.out.println("Waiting for the Gobbler threads to join...");
outThread.join();
errThread.join();
System.out.println("Waiting for the process to exit...");
int exitVal = p.waitFor();
System.out.println("\n****************************");
System.out.println("Command: " + "cmd.exe /c dir");
System.out.println("Exit Value = " + exitVal);
List<String> output = outGobbler.getOuput();
input = "";
for(String o: output) {
input += o;
}
System.out.println("Final Output:");
System.out.println(input);
Этот код возвращает результат выполнения команды "dir" из PowerShell - отлично. Но, как вы можете видеть, я пытаюсь запустить вторую команду "dir", используя
PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true);
writer.println(input);
writer.flush();
. Это не имеет никакого эффекта - второй вывод dir не отображается, когда я запускаю свой код. Я также экспериментировал с опцией powershell.exe, чтобы открыть powershell, но не закрыть его сразу:
String[] commandList = {"powershell.exe", "-NoExit", "-Command", "dir"};
Но затем мой код зависает, а это означает, что Gobbler, которые потребляют inputStream процесса, ничего не читают - как ни странно: они этого не делают. Я даже прочитал первую строку - там должен быть хоть какой-то вывод ....
Я также пытался закрыть outputStream процесса после того, как написал ему вторую команду «dir» - ничего не изменилось.
Любая помощь приветствуется. Спасибо Курт