我在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"
);
应该怎么做?
答案 0 :(得分:17)
<强>窗:强>
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");
答案 1 :(得分:5)
不,你应该不引用* nix上的args。在交互式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”参数。进程启动程序/操作系统应该自动处理启动批处理文件(基于扩展名)。