Mac命令中的Java命令Runtime.getRuntime()。exec()

时间:2011-11-02 11:00:52

标签: java macos runtime.exec

我使用的是Mac OS Lion,java版本为1.6.0_26

我正在为Java制作一个小型应用程序,并为用户提供主菜单,因此他可以选择多个选项。

其中一个是使用.pkg

安装应用

使用这些命令一切正常:

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

然后我意识到当foldername有空格或者我将带有所需子文件夹的java文件复制到名为“NO NAME”的USB笔式驱动器(或带空格的某个名称)时会出现问题。

因为s会变成:

open / Volumes / NO NAME / foldername / appInstaller.pkg

open / Users / user1 / Desktop / folder name / appInstaller.pkg



因此,当您运行p进程时,该命令将在路径上出现第一个空格的位置完成

开/卷/没有 或
打开/ Users / user1 / Desktop /文件夹


为了解决这个问题,我改变了这样的定义:

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

它停止了正常工作。奇怪的是,如果我复制s值(在创建s变量之后)并将其粘贴到终端中,它可以工作:

打开“/ Users / user1 / Desktop / folder name / appInstaller.pkg”


但是从Java运行它不起作用。

请问你能帮帮我吗?

感谢。

3 个答案:

答案 0 :(得分: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可能值得阅读,但取决于您想要对流程输出执行的操作。

注意:已编辑以反映评论中的问题

答案 1 :(得分:1)

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

您应该在路径的两边添加“'”,因此最终的shell命令将如下所示:

open 'your path' 

而不是

open your path

答案 2 :(得分:0)

这是上面提到的答案中出现的一个小技巧:

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

说出commandString = "killall Mail",然后拆分会将String[]参数的单词分隔为ProcessBuilder