【发布时间】:2012-02-03 03:16:50
【问题描述】:
我正在尝试运行一个 Java 应用程序,该应用程序在启动时会创建一个新的 powershell 进程,然后会与它进行多次交互。调用 powershell.exe 并让它执行一个命令并返回输出对我来说很好。如果我不希望 powershell 进程立即完成/退出但保持打开状态,以便我可以写入其 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);
此代码从 powershell 返回“dir”命令的结果 - 很好。但正如你所看到的,我正在尝试使用
运行第二个“dir”命令 PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream())), true);
writer.println(input);
writer.flush();
这没有任何效果 - 当我运行我的代码时没有显示第二个目录输出。我还尝试了一个 powershell.exe 选项来打开 powershell 但不立即关闭它:
String[] commandList = {"powershell.exe", "-NoExit", "-Command", "dir"};
但是随后我的代码挂起,这意味着使用进程的 inputStream 的 Gobbler 不读取任何内容 - 奇怪的是:他们甚至不读取第一行 - 必须至少有一些输出......
在写入第二个“dir”命令后,我还尝试关闭进程的 outputStream - 没有改变任何东西。
非常感谢任何帮助。 谢谢 库尔特
【问题讨论】:
标签: java powershell process