Automator использует текущее местоположение каталога

6

моя цель - использовать Automator для открытия приложения с аргументами

open ./MyApp.app -arguments

через запуск разделяемого Buddy.app с Myapp.app (Automator / рабочий процесс). оба приложения должны быть доступны всем пользователям, чтобы они сразу запускались.

кажется, что самый простой способ сделать это - запустить Buddy.app из той же папки, что и MyApp.app. тогда я могу переместить Buddy.app с MyApp.app куда угодно, и они все равно будут работать вместе

установить относительное расположение файлов в скрипте bash,

open "$(pwd)"/myapp.app -arguments

Единственная проблема заключается в том, что Automator использует домашний каталог вместо каталога приложения. т.е. pwd это домашний каталог, а не фактическое местоположение файла.

в Automator вывод из

echo $(pwd)

мой домашний каталог, / Пользователи / Пользователь

поэтому вопрос в том, как заставить Automator (Buddy.app) определить текущее местоположение папки и запустить MyApp.app?

арбуз
источник
1
Начиная с macOS 10.12, Automator.app всегда находится в SIP/Applications и защищен им . Вы можете проверить это, запустив , или . Так почему бы не просто жесткий код ? grep Automator /System/Library/Sandbox/rootless.confls -ldAO@ /Applications/Automator.app/Applications
Синоли
извини, это не то, чего я хочу достичь. Я осознаю неоднозначность в своем первоначальном посте и изменил его для обнадеживающей ясности. я хочу запустить myapp.app -arguments из любого места, просто открыв
арбуз
Если я правильно понимаю вопрос, ваш рабочий процесс потребует скопировать myapp.app (или хотя бы псевдоним) в текущий путь. Обычно это делается наоборот: текущий путь (например, файл / папка) передается приложению как один аргумент. pwd или ls не будут скопированы в $ pwd для получения текущего рабочего каталога или списка содержимого, но останутся в / bin!
klanomath
@watermelon Спасибо за разъяснение и редактирование вашего вопроса; хотя я чувствую, что нам все еще нужно больше информации, чтобы понять ваши требования. Это поможет, если вы отредактируете свой вопрос еще раз и предоставите отдельный пример. Смотрите мой следующий комментарий о том, какова моя собственная интерпретация ваших требований до сих пор. Я могу быть совершенно неправ, и, возможно, я неправильно понимаю ваше требование; однако, если это так, я бы порекомендовал вам привести краткий, автономный пример для ясности.
Синоли,
1
Моя интерпретация: вы начинаете с каталога ~/fooи приложения ~/foo/MyApp.app. Ваша цель состоит в том, чтобы рабочий процесс Automator действовал в качестве партнера MyApp.appи находился в том же каталоге, что и MyApp.appвсегда. Вы хотите иметь возможность перемещаться MyApp.appпо своему усмотрению, например, в любую папку, которая вам нравится ~/bar- до тех пор, пока рабочий процесс собеседника проходит вместе с ним. Наконец, вы хотите иметь возможность запускать рабочий процесс приятеля из любого места, например из Finder, или использовать, open ~/bar/MyWorkflow.workflowнаходясь внутри /tmp/meow. Правильный?
Синоли,

Ответы:

1

Пусть ваш рабочий процесс определит свой собственный путь (более надежный)

Это работает до тех пор, пока ваш рабочий процесс Automator находится в том же каталоге, что и MyApp.app; вы можете создавать копии рабочего процесса или приложения по своему усмотрению и повторно использовать их в любом месте; ничто не должно быть уникальным.

меры

Вот шаги для автоматизации запуска MyApp.app:

  1. Откройте рабочий процесс в Automator.

  2. Добавьте действие « Выполнить AppleScript» . Удалите весь код шаблона внутри и замените его следующими строками:

    set AppleScript's text item delimiters to ":"
    set appPath to (text items 1 through -3 of (path to me as text) & {"MyApp.app"} as text)
    tell application "Finder" to open file appPath
  3. Сохраните рабочий процесс Automator в той же папке, что и MyApp.app.

  4. Запустите рабочий процесс Automator; оно должно запуститься MyApp.app.

объяснение

set AppleScript's text item delimiters to ":"

Это означает: «Берегись, я скоро разделю строку; и я хочу, чтобы вы использовали этот :персонаж в качестве разделенных границ ».

path to me as text

Это инструктирует рабочий процесс, чтобы выяснить путь к себе; Компоненты пути разделяются двоеточием ( :), которое является остатком классической Mac OS .

text items 1 through -3 of […] & {"MyApp.app"}

Это обрезает последнюю часть пути и добавляет MyApp.appк пути.

[…] as text

Это соединяет путь обратно (снова с :разделителем).

tell application "Finder" to open file appPath

Наконец, эта последняя строка вызывает MyApp.appзапуск.

Synoli
источник
это работает нормально без аргументов. Однако мне все еще нужно передать аргументы при открытии.
арбуз
0

Используйте идентификатор пакета целевого приложения (более гибкий)

Вы планируете держать делать только одну копию из MyApp.appна всю систему?

Если да, то вы можете воспользоваться MyApp.app«s идентификатор пакета, и есть Launch Services выяснить все мельчайшие детали для вас.

Это решение довольно гибкое; у него есть то преимущество, что вы можете разместить рабочий процесс Automator там, где вам нужно - он не обязательно должен находиться в том же месте, где он находится MyApp.app, или в каком-либо фиксированном месте относительно него.

меры

Вот шаги, которые вы хотите предпринять:

  1. Откройте Terminal.app и выполните следующую команду:

    osascript -e 'id of app "'"$(mdfind MyApp.app)"'"'
  2. Предыдущий шаг должен был распечатать одну строку в результате. Обратите внимание, что говорит эта строка (например, com.example.MyApp).

  3. Откройте свой рабочий процесс в Automator.

  4. Добавьте действие Run Shell Script с содержимым:

    open -b com.example.MyApp
  5. Сохраните рабочий процесс Automator в любой папке на ваше усмотрение - нет необходимости размещать его в фиксированном месте относительно MyApp.app.

  6. Запустите рабочий процесс Automator; оно должно запуститься MyApp.app.

объяснение

Услуги запуска

Это решение использует часть macOS, называемую Launch Services, которая поддерживает общесистемную базу данных приложений и их свойств :

Всякий раз, когда новое приложение становится известным системе (например, когда пользователь перетаскивает его с установочного диска в папку «Приложения»), приложение регистрируется в Launch Services, которая копирует необходимую информацию о приложении в свою базу данных. Сервисы запуска могут затем использовать эту информацию для определения предпочтительного приложения для открытия данного файла документа или URL-адреса.

План

Интересующая нас информация - это идентификатор пакета или идентификатор пакета.

Разработчик приложения обычно присваивает каждому из своих приложений (надеюсь) глобально уникальный идентификатор пакета. Мы можем воспользоваться этой уникальностью тогда и только тогда, когда в нашей системе не будет более одного приложения с одинаковым идентификатором пакета и только одна копия этого приложения. Нет дубликатов.

Выяснить путь

Команда

mdfind MyApp.app

это просто модный способ запустить поиск Spotlight в виде одноразового ярлыка, чтобы выяснить путь приложения на данный момент. Нам нужен путь только один раз, чтобы извлечь идентификатор пакета приложения.

Прожектор (надеюсь) вернется с чем-то вроде этого:

/Users/watermelon/foo/MyApp.app

Извлечение CFBundleIdentifier

Перенос текущего пути приложения в следующую команду AppleScript:

id of app "/Users/watermelon/foo/MyApp.app"

это просто удобный способ ** извлечь CFBundleIdentifier** из MyApp.appпакета.

(Вы также можете вручную просмотреть идентификатор пакета, щелкнув правой кнопкой мыши приложение в Finder, выбрав « Показать содержимое пакета» , перейдя к Contentsподпапке и открыв его Contents/Info.plistв TextEdit, найдите ключ, который говорит, CFBundleIdentifierи найдите его Stringзначение на одну строку ниже. I думаю, что это утомительно, поэтому я всегда предпочитаю использовать AppleScript / mdfindфрагмент кода.)

Запуск приложения по идентификатору пакета

Наконец, давайте посмотрим на команду, которую вы фактически собираетесь использовать в рабочем процессе Automator:

open -b com.example.MyApp

Эта команда - просто технический способ сказать: «Эй, macOS, с тобой хорошие друзья launchd, верно? Вы можете запустить это приложение для меня? О, кстати, я никогда не удосужился найти полный путь к нему. Что я знаю, хотя это его CFBundleIdentifier, который есть com.example.MyApp; просто зайдите в Launch Services, и они определят путь ».

Synoli
источник
спасибо за оба ответа. Я изменил свой вопрос, упомянув, что оба приложения должны быть доступны для совместного использования и использоваться сразу после публикации, поэтому, к сожалению, этот ответ не подходит.
арбуз