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

我已经尝试了十几种不同的强引号和弱引号组合,并且我尝试将它们作为参数传递给cmd.exe /c powershell ...但我尝试过的没有运行脚本。如果命令字符串中有一个空格,我会得到一个 IO 异常。

我想知道它是否与字符编码有关?当我简单地调用powershell时,我得到的是 'back from reader.readLine()is: W\u0000i\u0000n\u0000 ...我认为这是我的 IDE(IntelliJ's)告诉我它的“Windows Powershell”的方式,每个字母之间有一个空 unicode 字符。

Java ProcessBuilder 文档对于您可以作为参数传递的确切内容有点模糊:

一个命令,一个字符串列表,表示要调用的外部程序文件及其参数(如果有)。哪些字符串列表代表有效的操作系统命令取决于系统。例如,每个概念参数通常是该列表中的一个元素,但在某些操作系统中,程序需要自己标记命令行字符串——在这样的系统上,Java 实现可能需要命令恰好包含两个元素。

我不知道那是什么意思。我试图给它的命令可以在 CMD 和 Powershell 窗口中工作,也可以在 Windows 运行对话框中工作。

包含上述方法类的要点: https : //gist.github.com/Groostav/9c5913e6f4696a25430d 包含我的 powershell 脚本的要点: https ://gist.github.com/Groostav/347a283ac7ec6a738191

谢谢你的帮助。

4

1 回答 1

2

您必须将参数放在单独的字符串中,而不是将它们作为单个字符串连接到 powershell 调用。就像是

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