2011-01-20 30 views
5

叫我想写一个简单的应用程序需要在命令行arguement(这将是一个PowerShell PS1文件),然后运行它时,PowerShell进程挂。所以我已经用了许多不同的方法,并且似乎遇到了问题。如果我试图从Java中调用的PowerShell,Windows的过程开始,是通过进程管理器可见,但是PowerShell的永远不会返回,它挂在某种循环通过它的外观。我使用的命令是:从Java应用程序

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

目前我硬编码位置PS1的文件,因为我试图排除这个可能性是:

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

命令,然后使用执行一个问题。使用进程管理器,我可以看到挂PowerShell进程,并传递给它的命令是:

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

,当复制到一个cmd窗口,工作启动tst.ps1文件。文件本身就是在这个例子非常简单,我想我可以排除它被冻结的原因,因为我曾试图启动其他PS1的文件相同的行为就可以看出。

为了进一步增加混乱,如果我用上面贴的Java代码,并通过在PowerShell命令,而不是那么成功运行一个文件名。

我已经冲刷网页,看到很多人遇到同样的问题,但似乎没有人已经张贴有解决方案,我希望对我而言它是一个简单的监督,很容易固定。

任何提示/提示是赞赏:d

艾伦

回答

7

您必须关闭的OutputStream为了PowerShell来退出。

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

proc.getOutputStream().close(); 
2

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

Process.getInputStream() 

Process.getErrorStream() 

这里还有更多的细节让那些为InputStreams: Javadoc for Process

+0

感谢您的回复,我使用Process.getInputStream()调用。我已成立的那一刻,直到我得到这个java类的工作简直是调用mkdir命令,只是为了让我轻松地检查它跑了PS1文件,从它的输出只应该是标准的东西,PowerShell的splurts出来,如果你用它来创建一个文件夹。奇怪的是我看到输出很好,如果我从java调用powershell命令mkdir,但是当java直接调用ps1文件而不是命令它挂起?任何其他的想法都会很棒,因为我希望它有一些非常简单的东西,我忽略了! – Alan 2011-01-20 14:11:16