2011-01-20 81 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