0

私は最終的に外部プロセスの統合にかなり深くなる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

助けてくれてありがとう。

4

1 に答える 1

2

引数を単一の文字列としてpowershell呼び出しに連結するのではなく、別々の文字列に入れる必要があります。何かのようなもの

new ProcessBuilder("Powershell", scriptFileName,  INPUT_FILE_NAME);
于 2013-08-09T17:29:38.933 に答える