有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java应用程序调用Powershell进程时挂起

我正在尝试编写一个简单的应用程序,它接受一个命令行参数(它将是一个Powershell ps1文件),然后运行它。因此,我尝试了许多不同的方法,似乎遇到了一个问题。如果我尝试从java内部调用powershell,windows进程将启动,并通过process explorer可见,但是powershell从未返回,从外观上看,它挂起在某种循环中。我使用的命令是:

            String command = "powershell -noprofile -noninteractive \"&C:\\new\\tst.ps1\"";

然后使用以下命令执行该命令:

Runtime systemRuntime = Runtime.getRuntime();
Process proc = systemRuntime.exec(command);

目前,我正在将位置硬编码到ps1文件中,因为我试图排除这一问题。使用process explorer,我可以看到挂起的powershell进程,传递给它的命令是:

powershell -noprofile -noninteractive "&C:\new\tst.ps1"

当复制到cmd窗口时,可以启动tst。ps1文件。在本例中,文件本身非常简单,我想我可以排除它是冻结的原因,因为我尝试启动其他ps1文件,可以看到相同的行为

为了进一步增加混淆,如果我使用上面发布的java代码并传入powershell命令而不是文件名,那么它将成功运行

我浏览过网络,看到很多人都遇到同样的问题,但似乎没有人在那里发布解决方案,我希望这只是我的一个简单疏忽,可以很容易地解决

如有任何提示/提示,敬请谅解:D

艾伦


共 (2) 个答案

  1. # 1 楼答案

    您必须关闭OutputStream才能退出Powershell

    Runtime systemRuntime = Runtime.getRuntime();
    Process proc = systemRuntime.exec(command);
    
    proc.getOutputStream().close();
    
  2. # 2 楼答案

    您的外部程序是否写入标准输出(err和out)? 如果是,它可以挂起等待您从java父进程中使用它们。 您可以通过调用

    Process.getInputStream()
    

    Process.getErrorStream()
    

    这里有更多的细节: Javadoc for Process