繁体   English   中英

使用任何命令行参数对exec调用进行Java IOException

[英]Java IOException on exec call with any command-line arguments

我有一个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时 ,我从' reader.readLine()回来了: W\i\n\ ...我认为这是我的IDE(IntelliJ)的方式告诉我它的“Windows Powershell”每个字母之间的null unicode字符。

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

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

我不知道这意味着什么。 我试图给它的命令可以从CMD和Powershell窗口以及Windows运行对话框中运行。

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

谢谢你的帮助。

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

new ProcessBuilder("Powershell", scriptFileName,  INPUT_FILE_NAME);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM