2011-11-02 124 views
4

I'm使用Mac OS狮子,用java版本的exec()1.6.0_26Java命令调用Runtime.getRuntime()。在Mac OS中

我正在做一个小的应用程序的Mac在Java中有一个主菜单对于用户来说,他可以选择几个选项。

其中之一是使用的.pkg

一切工作正常使用这些命令安装应用程序:

File instFolder = new File(System.getProperty("user.dir") + "/foldername/appInstaller.pkg"); 
String s = "open "+ instFolder.toString(); 
Process p = Runtime.getRuntime().exec(s); 

然后我意识到有问题时,文件夹名称中有空格,或者如果我复制这个带有所需子文件夹的java文件以“NO NAME”作为名称(或带空格的某个名称)作为USB笔驱动器。

由于S1将成为类似:

开/卷/ NO NAME/FOLDERNAME/appInstaller.pkg

开/用户/用户1 /桌面/文件夹名称/ appInstaller.pkg



所以,当你运行该p过程中,该命令将完成,其中第一空间的路径上出现

开/卷/ NO

开/用户/用户1 /桌面/文件夹


要尝试解决这个问题,我改变了的定义这样的事情:

String s = "open "+ "\"" + instFolder.toString() + "\""; 

它停止工作正常。奇怪的是,如果我复制的价值(创建变量s后),并粘贴在终端它的工作原理:

开“/用户/用户1 /桌面/文件夹名称/ appInstaller.pkg”


但从Java运行它不起作用。

请问您能帮我吗?

谢谢。

回答

5

为了正确逃生的论点,你可以使用以下内容:

Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() }); 

虽然我可能会用更现代的ProcessBuilder

ProcessBuilder pb = new ProcessBuilder("open", instFolder.toString()); 
Process p = pb.start(); 
int exitCode = p.waitFor(); 

虽然this可能是值得依赖于要与流程的输出做一读。

注:编辑,以反映在评论问题

+0

嗨@ beny23:谢谢你的建议。他们都很好,但我有一个问题。假设instFolder是错误的,所以当我尝试运行安装程序时,进程将返回一个exitcode <> 0,所以我可以知道发生了错误。我如何检查与流程建设者? – user897013

1

看起来你的路径在转换成shell时没有引号。

你或许应该加上“'”你的路的两侧,所以最终shell命令看起来像:

open 'your path' 

,而不是

open your path 
+0

Hi @Nicolas:
这是我修改s variableString s =“open”+“\”“+ instFolder.toString()+”\“”的定义时所要做的。 – user897013

+0

无论如何你的答案。 – user897013

0

下面是从上述问题的答案就出来了一个小窍门:

ProcessBuilder pb = new ProcessBuilder(commandString.split(" ")); 

commandString = "killall Mail"然后,将分离将分离的话使其成为一个String[]参数到ProcessBuilder

相关问题