私は最終的に外部プロセスの統合にかなり深くなるJavaアプリケーションを持っています。これには、それらのプロセスとのIPCが含まれます。今のところ、私がやろうとしているのは、単純に Java から powershell スクリプトを実行することです。
私が持っているもの:
private void runPowershellScript() {
String command =
"" + "powershell" + " ";
// Paths.get("").toAbsolutePath() + "\\" + scriptFileName + " " +
// Paths.get("").toAbsolutePath() + "\\" + INPUT_FILE_NAME + " " +
// Paths.get("").toAbsolutePath() + "\\" + OUTPUT_FILE_NAME + "";
try {
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Process process = builder.start();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine ()) != null) {
System.out.println ("Stdout: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
そこに表示されている内容で、Windows Powershell の名前と著作権がそのリーダーに表示されますが、コメント アウトされた行 (すべて適切なパスに解決されますC:\Users\Geoff\Code\OPTIP\FakeProgram.ps1
) を追加すると、次のようになります。
java.io.IOException: Cannot run program "powershell C:\Users\Geoff\Code\OPTIP\FakeProgram.ps1 ": CreateProcess error=2, The system cannot find the file specified
強い引用符と弱い引用符のさまざまな組み合わせを12回試しました。それらを引数として渡そうとしましたcmd.exe /c powershell ...
が、試したことはありません。スクリプトを実行します。コマンド文字列に単一のスペースがある場合、IO 例外が発生します。
文字エンコーディングと関係があるのではないかと思いますか?単純に powershell を呼び出すと、'back from reader.readLine()
is:
' が返されます。W\u0000i\u0000n\u0000 ...
これは、IDE (IntelliJ) が「Windows Powershell」を各文字の間にヌル Unicode 文字を使用して伝える方法であると推測します。
Java ProcessBuilder のドキュメントでは、引数として何を渡すことができるかについて、少しあいまいです。
コマンド、呼び出される外部プログラム ファイルとその引数 (存在する場合) を示す文字列のリスト。どの文字列リストが有効なオペレーティング システム コマンドを表すかは、システムによって異なります。たとえば、各概念的な引数がこのリストの要素であることは一般的ですが、プログラムがコマンド ライン文字列自体をトークン化することが期待されるオペレーティング システムがあります。そのようなシステムでは、Java 実装はコマンドに正確に 2 つの要素を含める必要がある場合があります。
それが何を意味するのかわかりません。私が与えようとしているコマンドは、CMD および Powershell ウィンドウから、また Windows 実行ダイアログからも機能します。
上記のメソッドのクラスを含む要点: https://gist.github.com/Groostav/9c5913e6f4696a25430d 私のパワーシェルスクリプトを含む要点: https://gist.github.com/Groostav/347a283ac7ec6a738191
助けてくれてありがとう。