Взаимодействие с процессом Powershell, вызываемым из приложения Java

Я пытаюсь запустить приложение 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» - ничего не изменилось.

Любая помощь приветствуется. Спасибо Курт

6
задан Kurt 5 January 2012 в 09:21
поделиться