2011-01-20 33 views
5

私はコマンドライン引数(Powershell ps1ファイルになる)を取り込んで実行する単純なアプリケーションを作成しようとしています。だから、私はいくつかの異なるアプローチを駆使して問題を抱えているようだ。 java内からpowershellを起動しようとすると、Windowsプロセスが開始され、プロセスエクスプローラ経由で表示されますが、powershellは戻ってこないので、見た目では何らかのループでハングします。私が使っているコマンドは次のとおりです。私はこれを排除しようとしていたとして、私はハードPS1ファイルに場所をコーディングしています現時点ではJavaアプリケーションから呼び出されたときPowershellプロセスがハングする

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

:コマンドは、その後、使用して実行され

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

問題。私がぶら下がっPowerShellプロセスを見ることができ、プロセスエクスプローラと、それに渡されたコマンドを使用するとします。cmdウィンドウにコピー

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

は、tst.ps1ファイルを起動するように動作します。ファイルそのものはこの例では非常にシンプルで、同じ動作を見ることができる他のps1ファイルを起動しようとしたので、フリーズの原因となっているのを排除できます。

上記のJavaコードを使用してファイル名の代わりにpowershellコマンドを渡すと、さらに混乱することになります。

私はウェブを精査して、同じ問題を抱えている多くの人を見ましたが、誰もそこにソリューションを掲載していないようです。私はその部分を簡単に監視して簡単に修正できることを願っています。

任意のヒント/先端が高く評価されている:D

アラン

答えて

7

あなたはPowerShellが終了するためにOutputStreamをクローズする必要があります。 あなたはより多くの詳細がここにあります

Process.getInputStream() 

Process.getErrorStream() 

を呼び出すことにより、入力ストリームとしてそれらを得ることができます。

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

proc.getOutputStream().close(); 
2

は、標準出力(ERRとアウト)への外部プログラムの書き込みですか? 「はい」の場合、Java親プロセスからそれらを消費するのを待っている可能性があります。 Javadoc for Process

+0

返信いただきありがとうございます。私はProcess.getInputStream()呼び出しを使用しています。このjavaクラスが動作するまで私が設定したps1ファイルは、文字通りmkdirコマンドを呼び出すだけで、簡単に実行を確認できるようにしています。唯一の出力は、powershellがそれを使用してフォルダを作成します。奇妙なことは、javaからmkdirへのpowershellコマンドを呼び出すと出力が正常に表示されますが、javaがコマンドの代わりにps1ファイルを直接呼び出すと、それはハングしますか?私が見落としてしまった何かが本当にシンプルなことを願っているので、他のアイデアは素晴らしいでしょう! – Alan

+0

SSHでPS1スクリプトを呼び出す際に問題が発生しました。彼らは定期的に特定のケースでハングアップします。スクリプトは完了まで実行されますが、戻りません。何かがスタンダードを待っていたことが判明した(私はなぜか分からない)。だから私はstdinをnulに結びつけた。 – JasonMArcher

+0

ご返信ありがとうございます。あなたがstdinをnulに結びつけたと言うとき、これはprocの入力ストリームを取得して終了させることでしたか?私はprocの入出力ストリームを閉じようとしましたが、運がありません。 – Alan

関連する問題