Java-команда Runtime.getRuntime (). Exec () в Mac OS - PullRequest
4 голосов
/ 02 ноября 2011

Я использую Mac OS Lion с версией Java 1.6.0_26

Я делаю небольшое приложение для Mac на 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-файл с необходимыми подпапками на USB-накопитель с именем «NO NAME» (или именем с пробелами).

Поскольку s станет чем-то вроде:

open / Volumes / NO NAME / имя_фолдера / appInstaller.pkg
или
open / Users / user1 / Desktop / имя папки / appInstaller.pkg



Поэтому при запускеВ процессе p команда завершится, когда на пути появится первый пробел

open / Volumes / NO
или
open / Users / user1 / Desktop / folder


Чтобы попытаться это исправить, я изменил определение s примерно так:

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

ЭтоСверху работает нормально.Странно то, что если я скопирую значение s (после создания переменной s) и вставлю его в терминал, оно будет работать:

open "/ Users / user1 / Desktop / имя папки / appInstaller.pkg"


но запуск его с Java не работает.

Не могли бы вы мне помочь, пожалуйста?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 02 ноября 2011

Чтобы правильно экранировать аргументы, вы можете использовать следующее:

Runtime.getRuntime().exec(new String[] { "open", instFolder.toString() });

Хотя я бы, вероятно, использовал более современный ProcessBuilder :

ProcessBuilder pb = new ProcessBuilder("open", instFolder.toString());
Process p = pb.start();
int exitCode = p.waitFor();

Хотя это может стоить прочитать в зависимости от того, что вы хотите сделать с выводом процессов.

Примечание: отредактировано, чтобы отразить вопрос в комментарии

1 голос
/ 02 ноября 2011

кажется, что ваш путь не имеет кавычек при превращении в оболочку.

Вероятно, вам следует добавить "'" по обе стороны вашего пути, чтобы последняя команда оболочки выглядела следующим образом:

open 'your path' 

вместо

open your path
0 голосов
/ 14 июня 2016

Вот небольшая хитрость, которая появилась из ответов, упомянутых выше:

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

Скажите commandString = "killall Mail", тогда разделение разделит слова, превращая его в параметр String[] в ProcessBuilder.

...