使用参数执行
我很难在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"
);
这应该怎么办?
的Windows:
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");
我试过了,它的工作原理! – 2010-01-27 02:42:25
这是为什么发作? java.io.IOException:java.io.IOException:sh:在java.lang.UNIXProcess找不到。 DmMdbConsumer.migrateData(DmMdbConsumer.java:328)at java.lang.ProcessBuilder.start(ProcessBuilder.java:451)at 012. DmMdbConsumer.run(DmMdbConsumer.java:230)在java.lang.Thread.run(Thread。java:595) – 2010-01-27 13:34:40
“sh”在我的情况下必须是“/ bin/sh”。谢谢! – 2010-01-27 14:33:56
不,你应该不是引用* nix上的参数。在交互式shell中* nix需要引用以防止shell误解它们,但是直接启动进程时不涉及shell。因此不需要引用。
如果您确实包含引号,则启动的进程会将其视为其传入参数的一部分,并执行诸如(例如)尝试打开包含引号的文件名。
你也不希望bash的“-c”参数。这告诉它将下一个参数解析为一个命令行,但是您提供了一个参数列表。删除“-c”选项和多余的引号,它应该工作。
正确的Linux电话是:
ProcessBuilder pb = new ProcessBuilder(
"bash",
"myshellscript.sh",
"param 1",
"param 2",
"param 3"
);
也不是,如果文件“myshellscript.sh”是可执行文件,并有适当的家当线(如“#/斌/庆典!”),你也不需要“bash”论证。这是可取的,因为如果脚本被替换为用不同语言编写的脚本,则不必更新您的调用应用程序。
同样,在Windows上,您不应该需要“cmd”和“/ c”参数。进程启动器/ OS应该自动处理启动批处理文件(基于扩展名)。
不幸的是我需要Windows的cmd和/ c。我的shell脚本确实有shebang行,但是我无法让它使用sh或不使用sh。 – 2010-01-27 13:36:28
你不是引号内他们对于确切原因?你为什么不为你最后的片段做这件事? – zneak 2010-01-27 02:22:05
我正在努力使前两个片段的工作。第三个片段将传递6个参数给mybat.bat,当我只查找三个参数时。 – 2010-01-27 02:25:11