我在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)
不,你应该不报价*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"参数.进程启动程序/操作系统应自动处理启动批处理文件(基于扩展名).