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

use*_*013 4 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);
Run Code Online (Sandbox Code Playgroud)

然后我意识到当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

open/Users/user1/Desktop /文件夹中


为了解决这个问题,我改变了s定义,如下所示:

String s = "open "+ "\"" + instFolder.toString() + "\"";
Run Code Online (Sandbox Code Playgroud)

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

打开"/ Users/user1/Desktop/folder name/appInstaller.pkg"


但是从Java运行它确实不行.

请问你能帮帮我吗?

谢谢.

ben*_*y23 5

为了正确转义参数,您可以使用以下命令:

Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() });
Run Code Online (Sandbox Code Playgroud)

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

ProcessBuilder pb = new ProcessBuilder("open", instFolder.toString());
Process p = pb.start();
int exitCode = p.waitFor();
Run Code Online (Sandbox Code Playgroud)

虽然可能值得一读但取决于您想要对流程输出做什么.

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