代码之家  ›  专栏  ›  技术社区  ›  Dan Polites

使用参数执行

  •  14
  • Dan Polites  · 技术社区  · 15 年前

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

    非功能Windows代码:

    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"
            );   
    

    怎么做?

    2 回复  |  直到 15 年前
        1
  •  17
  •   Gladwin Burboz    15 年前

    窗户:

    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
  •  5
  •   nobody    15 年前

    不,你应该 引用args on*nix。在交互shell中,在*nix上引用是必要的,以防止shell误解它们,但直接启动进程时,shell不参与其中。因此无需报价。

    如果包含引号,则启动的进程会将其视为传入参数的一部分,并尝试打开包含引号的文件名(例如)。

    您也不希望使用“-c”参数进行bash。这告诉它将下一个参数解析为命令行,但您提供了一个参数列表。删除“-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应该处理自动启动批处理文件(基于扩展名)。