使用参数执行

Dan*_*tes 14 java batch-file

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

非功能性Windows代码:

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

非功能性Linux代码:

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

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

ProcessBuilder pb = new ProcessBuilder(
        "cmd",
        "/c",
        "mybat.bat param 1 param 2 param 3"
        );   
Run Code Online (Sandbox Code Playgroud)

该怎么做?

Gla*_*boz 17

视窗:

ProcessBuilder pb = new ProcessBuilder(
        "cmd", "/c", "mybat.bat", 
        "param 1", "param 2", "param 3");
Run Code Online (Sandbox Code Playgroud)

Unix的:

ProcessBuilder pb = new ProcessBuilder(
        "sh", "mybat.sh", 
        "param 1", "param 2", "param 3");
Run Code Online (Sandbox Code Playgroud)


And*_*ico 5

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

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

你也不希望bash的"-c"参数.这告诉它将下一个参数解析为命令行,但是你提供了一个参数列表.删除"-c"选项和多余的引号,它应该工作.

正确的Linux调用将是:

ProcessBuilder pb = new ProcessBuilder(
    "bash",
    "myshellscript.sh",
    "param 1",
    "param 2",
    "param 3"
    );
Run Code Online (Sandbox Code Playgroud)

如果文件"myshellscript.sh"是可执行的并且具有适当的shebang行(例如"#!/ bin/bash"),那么你也不需要"bash"参数.这是首选,因为如果脚本被替换为用不同语言编写的脚本,则不必更新您的调用应用程序.

同样,在Windows上,您不应该需要"cmd"和"/ c"参数.进程启动程序/操作系统应自动处理启动批处理文件(基于扩展名).