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

时间:2011-01-20 10:23:00

标签: java powershell

我正在尝试编写一个简单的应用程序,它接受一个命令行参数(将是一个Powershell ps1文件),然后运行它。所以我已经开发了许多不同的方法,似乎遇到了问题。如果我尝试从java中调用powershell,则启动windows进程并通过进程资源管理器可见,但是PowerShell永远不会返回,它会以某种形式挂起。我正在使用的命令是:

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

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

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

目前我正在努力将位置编码为ps1文件,因为我试图将此问题排除在外。使用进程资源管理器,我可以看到挂起的powershell进程和传递给它的命令是:

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

当复制到cmd窗口时,用于启动tst.ps1文件。在这个例子中,文件本身非常简单,我认为我可以将其排除在原因之外,因为我试图启动其他ps1文件,可以看到相同的行为。

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

我在网上搜索过,看到很多人遇到同样的问题,但似乎没有人在那里发布解决方案,我希望这对我来说是一个简单的疏忽,可以很容易地修复。

感谢任何提示/提示:D

艾伦

2 个答案:

答案 0 :(得分:9)

您必须关闭OutputStream才能退出Powershell。

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

proc.getOutputStream().close();

答案 1 :(得分:2)

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

将其作为InputStreams
Process.getInputStream()

Process.getErrorStream()

这里有更多细节: Javadoc for Process