使用参数执行

2022-09-04 01:39:23

我在Java中执行需要参数的批处理文件时遇到了困难。这些参数可能包含空格,因此我需要将它们括在引号中。我还需要对Linux做同样的事情,因为某些参数可能包含特殊字符,例如.!

非功能性窗口代码:

ProcessBuilder pb = new ProcessBuilder(
        "cmd",
        "/c",
        "\"mybat.bat\"",
        "\"param 1\"",
        "\"param 2\"",
        "\"param 3\""
        );    

非功能性 Linux 代码:

ProcessBuilder pb = new ProcessBuilder(
        "bash",
        "-c",
        "'myshellscript.sh'",
        "'param 1'",
        "'param 2'",
        "'param 3'"
        ); 

我知道我应该添加像下面的Windows示例这样的参数,但这不适用于空格:

ProcessBuilder pb = new ProcessBuilder(
        "cmd",
        "/c",
        "mybat.bat param 1 param 2 param 3"
        );   

应该如何做到这一点?


答案 1

窗户:

ProcessBuilder pb = new ProcessBuilder(
        "cmd", "/c", "mybat.bat", 
        "param 1", "param 2", "param 3");

Unix:

ProcessBuilder pb = new ProcessBuilder(
        "sh", "mybat.sh", 
        "param 1", "param 2", "param 3");

答案 2

不,你不应该在*nix上引用参数。在交互式 shell 中的 *nix 上引用是必要的,以防止 shell 误解它们,但是当直接启动进程时,不涉及 shell。因此,无需引用。

如果确实包含引号,则启动的进程会将它们视为其传入参数的一部分,并执行诸如(例如)尝试打开包含引号的文件名之类的操作。

您也不希望“-c”参数受到抨击。这告诉它将下一个参数解析为命令行,但您提供的是参数列表。删除“-c”选项和多余的引号,它应该有效。

正确的 Linux 调用是:

ProcessBuilder pb = new ProcessBuilder(
    "bash",
    "myshellscript.sh",
    "param 1",
    "param 2",
    "param 3"
    );

同样不是说,如果文件“myshellscript.sh”是可执行的,并且具有适当的shebang行(例如“#!/bin/bash”),你也不需要“bash”参数。这是可取的,因为如果脚本被替换为用其他语言编写的脚本,则不必更新调用应用。

同样,在Windows上,您不应该需要“cmd”和“/ c”参数。进程启动器/ OS应自动处理启动批处理文件(基于扩展名)。


推荐