![](/img/trans.png)
[英]Using Runtime.getRuntime().exec() in Mac OS causes error
[英]Java command Runtime.getRuntime().exec() in Mac OS
我使用的是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进程时,该命令将在路径上出现第一个空格的位置完成
open / Volumes / NO
要么
打开/ Users / user1 / Desktop /文件夹
为了解决这个问题,我改变了s定义,如下所示:
String s = "open "+ "\"" + instFolder.toString() + "\"";
它停止了正常工作。 奇怪的是,如果我复制s值(在创建s变量之后)并将其粘贴到终端中,它可以工作:
打开“/ Users / user1 / Desktop / folder name / appInstaller.pkg”
但是从Java运行它不起作用。
请问你能帮帮我吗?
谢谢。
为了正确转义参数,您可以使用以下命令:
Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() });
虽然我可能会使用更现代的ProcessBuilder :
ProcessBuilder pb = new ProcessBuilder("open", instFolder.toString());
Process p = pb.start();
int exitCode = p.waitFor();
虽然这可能值得一读但取决于您想要对流程输出做什么。
注意:编辑以反映评论中的问题
看来你的路径在转入shell时没有引号。
您应该在路径的两侧添加“'”,因此最终的shell命令将如下所示:
open 'your path'
代替
open your path
这是上面提到的答案中出现的一个小技巧:
ProcessBuilder pb = new ProcessBuilder(commandString.split(" "));
假设commandString = "killall Mail"
那么拆分将把它作为String[]
参数的单词分离到ProcessBuilder
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.