Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mac OS中的Java命令Runtime.getRuntime().exec()_Java_Macos_Runtime.exec - Fatal编程技术网

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

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

我使用的是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 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(" "));