使用参数执行

问题描述:

我很难在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

你不是引号内他们对于确切原因?你为什么不为你最后的片段做这件事? – zneak 2010-01-27 02:22:05

+0

我正在努力使前两个片段的工作。第三个片段将传递6个参数给mybat.bat,当我只查找三个参数时。 – 2010-01-27 02:25:11

的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"); 
+0

我试过了,它的工作原理! – 2010-01-27 02:42:25

+1

这是为什么发作? 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

+0

“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应该自动处理启动批处理文件(基于扩展名)。

+0

不幸的是我需要Windows的cmd和/ c。我的shell脚本确实有shebang行,但是我无法让它使用sh或不使用sh。 – 2010-01-27 13:36:28