Mac OS中的Java命令Runtime.getRuntime().exec()
我使用的是Mac OS Lion,java版本为1.6.026 我正在用Java为Mac制作一个小应用,为用户提供一个主菜单,这样他可以选择几个选项 其中之一是使用.pkg安装应用程序 使用这些命令,一切正常:Mac OS中的Java命令Runtime.getRuntime().exec(),java,macos,runtime.exec,Java,Macos,Runtime.exec,我使用的是Mac OS Lion,java版本为1.6.026 我正在用Java为Mac制作一个小应用,为用户提供一个主菜单,这样他可以选择几个选项 其中之一是使用.pkg安装应用程序 使用这些命令,一切正常: File instFolder = new File(System.getProperty("user.dir") + "/foldername/appInstaller.pkg"); String s = "open "+ instFolder.toString(); Process
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会变成这样:
打开/Volumes/NO NAME/foldername/appInstaller.pkg
或
打开/Users/user1/Desktop/foldername/appInstaller.pkg
因此,当您运行p进程时,该命令将在路径上出现第一个空格的位置完成
打开/卷/否
或
打开/Users/user1/桌面/文件夹
为了解决这个问题,我更改了s的定义,如下所示:
String s = "open "+ "\"" + instFolder.toString() + "\"";
它停止正常工作。奇怪的是,如果我复制s值(在创建s变量之后)并将其粘贴到终端中,它就会工作:
打开“/Users/user1/Desktop/folder name/appInstaller.pkg”
但是从Java运行它是行不通的 你能帮帮我吗
谢谢。将路径转换为shell时,似乎没有引号 您可能应该在路径的两侧添加“'”,因此最终的shell命令如下所示:
open 'your path'
而不是
open your path
为了正确地转义参数,可以使用以下命令:
Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() });
虽然我可能会使用更现代的:
不过,这可能值得一读,这取决于您希望对进程输出执行什么操作
注:编辑以反映评论中的问题以下是从上述答案中得出的一个小技巧:
ProcessBuilder pb = new ProcessBuilder(commandString.split(" "));
说
commandString=“killall Mail”
然后拆分会将单词分离,使其成为ProcessBuilder的String[]
参数Hi@Nicolas:
这就是我在修改s variableString s=“open”+“\”“+instFolder.toString()+“\”的定义时试图做的事情;谢谢你的回答。嗨@beny23:谢谢你的建议。他们都做得很好,但我有个问题。假设instFolder错误,那么当我尝试运行安装程序时,进程将返回exitcode0,这样我就可以知道发生了错误。我如何用process builder检查这一点呢?Runtime.exec
方法实际上使用了ProcessBuilder
,所以我不会说其中一个比另一个“更现代”。
ProcessBuilder pb = new ProcessBuilder(commandString.split(" "));