gpt4 book ai didi

java - 与从 Java 应用程序调用的 Powershell 进程交互

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:10 25 4
gpt4 key购买 nike

我正在尝试运行一个 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 - 没有改变任何东西。

非常感谢任何帮助。谢谢库尔特

最佳答案

对于由另一个进程启动的进程的性质来说,这听起来是正确的。我认为您正在经历非常标准的行为。

这是关键:p.waitFor()

来自 Java 文档:

causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.

在 PowerShell 输出流终止之前,您将无法接收它。当您使用 -NoExit 运行时,它永远不会退出,这就是您遇到挂起的原因。

如果你运行 ProcExp从 Sysinternals,您将能够看到您的 Java 进程启动了一个子 PowerShell 进程。

所以我认为您无法像它是内存中的 Activity 对象那样与之交互。

关于java - 与从 Java 应用程序调用的 Powershell 进程交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8740118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com