Среда выполнения команд Java.getRuntime ().exec () в Mac OS


Im использует Mac OS Lion, с java версии 1.6.0_26

Я делаю небольшое приложение для Mac на Java с главным меню для пользователя, чтобы он мог выбрать несколько вариантов.

Один из них-установить приложение с помощью a .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/foldername/appInstaller.pkg
или
откройте /Users / user1 / Desktop / folder name / appInstaller.pkg



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

open / Volumes / NO
или
открыть /пользователи / user1 / рабочий стол / папка


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

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

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

откройте " / Users / user1 / Desktop / folder name/appInstaller.pkg"


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

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

Спасибо.

3 4

3 ответа:

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

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

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

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

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

Примечание: отредактировано для отражения вопроса в комментарии

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

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

open 'your path' 

Вместо

open your path

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

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

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