10 votes

Automator utilise l'emplacement du répertoire actuel

Mon objectif est d'utiliser Automator pour ouvrir une application avec des arguments

open ./MyApp.app -arguments

en exécutant une application partageable Buddy.app avec Myapp.app (l'Automator/workflow). les deux applications devraient être partageables ensemble avec n'importe qui pour qu'elles s'exécutent directement.

le moyen le plus simple de le faire semble être d'exécuter Buddy.app depuis le même dossier que MyApp.app. ensuite je peux déplacer Buddy.app avec MyApp.app n'importe où, et elles fonctionneront toujours ensemble

pour mettre en place les emplacements de fichiers relatifs dans un script bash,

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

le seul problème est qu'Automator utilise le répertoire personnel au lieu du répertoire de l'application. c'est-à-dire que pwd est le répertoire personnel, et non l'emplacement réel du fichier.

dans Automator, la sortie de

echo $(pwd)

est mon répertoire personnel, /Users/User

donc la question est, comment faire en sorte qu'Automator (Buddy.app) détecte l'emplacement du dossier actuel et exécute MyApp.app ?

1 votes

À partir de macOS 10.12, Automator.app est toujours situé dans /Applications et protégé par SIP. Vous pouvez vérifier cela en exécutant grep Automator /System/Library/Sandbox/rootless.conf, ou ls -ldAO@ /Applications/Automator.app. Alors pourquoi ne pas simplement coder en dur /Applications?

0 votes

Désolé, ce n'est pas ce que je souhaite réaliser. je me rends compte de l'ambiguïté de mon message initial et l'ai modifié pour plus de clarté. je veux exécuter myapp.app -arguments de n'importe où en ouvrant simplement l'automator.app/workflow

0 votes

Si je comprends correctement la question, votre flux de travail nécessiterait de copier myapp.app (ou du moins un alias) vers le chemin actuel. Habituellement, c'est l'inverse qui est fait : le chemin actuel (par exemple un fichier/dossier) est transmis à l'application sous forme d'un argument. pwd ou ls ne seront pas copiés dans $pwd pour obtenir le répertoire de travail actuel ou une liste de contenu mais resteront dans /bin!

4voto

Yitzchok Points 528

Dans Automator, créez un flux de travail avec Exécuter un script Apple en premier :

on run {input, parameters}
    set p to path to me
    return p
end run

.. puis enchaînez-le avec un Exécuter un script shell qui a Passer l'entrée : en argument :

APP_PATH=$1
cd "$APP_PATH/Contents"
...

Enregistrez-le en tant qu'Application.

Voici une capture d'écran où j'utilise cela pour démarrer SQLWorkbench/J : capture d'écran d'Automator

(Le fichier zip de SQLWorkbench/J est dézippé dans le dossier Contents de l'application résultante)

0 votes

Ceci est solide et m'a beaucoup aidé! Merci!

2voto

Synoli Points 1131

Faites en sorte que votre flux de travail trace son propre chemin (plus robuste)

Cela fonctionne tant que votre flux de travail Automator se trouve dans le même répertoire que MyApp.app; vous pouvez créer des copies du flux de travail ou de l'application à votre discrétion et réutiliser ces copies où bon vous semble; rien n'a besoin d'être unique.

Étapes

Voici les étapes pour automatiser le lancement de MyApp.app:

  1. Ouvrez le flux de travail dans Automator.

  2. Ajoutez une action Exécuter un script Apple. Supprimez tout le code d'exemple à l'intérieur et remplacez-le par les lignes suivantes:

    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. Enregistrez le flux de travail Automator dans le même dossier que MyApp.app.

  4. Exécutez le flux de travail Automator; il devrait lancer MyApp.app.

Explication

set AppleScript's text item delimiters to ":"

Cela signifie “Attention, je vais bientôt diviser une chaîne; et je veux que tu utilises le caractère : comme limite de division.”

path to me as text

Cela indique au flux de travail de trouver le chemin vers lui-même; les composants du chemin sont délimités par un deux-points (:), qui est un vestige du Mac OS classique.

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

Cela supprime la dernière partie du chemin, et ajoute MyApp.app au chemin.

[…] as text

Cela reconstitue le chemin (de nouveau avec : comme délimiteur).

tell application "Finder" to open file appPath

Enfin, cette dernière ligne fait en sorte que MyApp.app se lance.

0 votes

Cela fonctionne bien sans argument. Cependant, j'ai encore besoin de passer des arguments lors de l'ouverture.

0voto

Synoli Points 1131

Utiliser l'identifiant de groupes de l'application cible (plus flexible)

Prévoyez-vous de garder une seule copie de MyApp.app sur l'ensemble du système?

Si c'est le cas, vous pouvez tirer parti de l'identifiant de groupe de MyApp.app et laisser Launch Services gérer tous les détails pour vous.

Cette solution est plutôt flexible; vous pouvez mettre votre workflow Automator où vous voulez - il n'est pas nécessaire qu'il soit situé au même endroit que MyApp.app, ni à un endroit fixe par rapport à celui-ci.

Étapes

Voici les étapes à suivre :

  1. Ouvrez Terminal.app et exécutez la commande suivante :

    osascript -e 'id of app "'"$(mdfind MyApp.app)"'"'
  2. L'étape précédente aurait dû afficher une seule ligne en résultat. Notez ce que cette ligne indique (par ex. com.example.MyApp).

  3. Ouvrez votre workflow dans Automator.

  4. Ajoutez une action Exécuter un script Shell avec le contenu :

    open -b com.example.MyApp
  5. Enregistrez le workflow Automator dans le dossier de votre choix - pas besoin de le placer à un emplacement fixe par rapport à MyApp.app.

  6. Exécutez le workflow Automator; cela devrait lancer MyApp.app.

Explication

Services de lancement

Cette solution tire parti d'une partie de macOS appelée Launch Services, qui maintient une base de données système des applications et de leurs propriétés:

Chaque fois qu'une nouvelle application devient connue du système (par exemple lorsque l'utilisateur la fait glisser depuis un disque d'installation dans le dossier Applications), l'application est enregistrée auprès de Launch Services, qui copie les informations nécessaires sur l'application dans sa base de données. Launch Services peut ensuite utiliser ces informations pour déterminer l'application préférée pour ouvrir un fichier de document ou une URL donnée.

Le plan

L'information qui nous intéresse est l'identifiant de groupe, ou bundle ID.

Un développeur d'applications attribue généralement à chacune de ses applications un identifiant de groupe (de préférence) globalement unique. Nous pouvons tirer parti de cette unicité uniquement s'il n'y a pas plus d'une seule application avec le même identifiant de groupe sur l'ensemble de notre système - et une seule copie de cette application. Pas de doublons.

Déterminer le chemin

La commande

mdfind MyApp.app

est simplement un moyen astucieux d'exécuter une recherche Spotlight en raccourci une fois pour déterminer le chemin de l'application à l'heure actuelle. Nous avons besoin du chemin une seule fois pour extraire l'identifiant de groupe de l'application.

Spotlight retournera (j'espère) quelque chose comme ceci :

/Users/watermelon/foo/MyApp.app

Extraction de CFBundleIdentifier

Placer le chemin actuel de l'application dans la commande AppleScript suivante :

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

est simplement un moyen pratique pour **extraire le CFBundleIdentifier** du bundle MyApp.app.

(Vous auriez également pu rechercher manuellement l'identifiant de groupe en cliquant avec le bouton droit sur l'application dans Finder, en choisissant Afficher le contenu du paquet, en naviguant jusqu'au sous-dossier Contenu et en ouvrant Contenu/Info.plist dans TextEdit, en recherchant la clé qui indique CFBundleIdentifier et en trouvant sa valeur String une ligne plus bas. Je trouve cela fastidieux, c'est pourquoi je préfère toujours utiliser le snippet AppleScript/mdfind.)

Lancement d'une application par identifiant de groupe

Enfin, regardons la commande que vous allez réellement utiliser dans votre workflow Automator :

open -b com.example.MyApp

Cette commande est simplement une façon technique de dire "Hey macOS, tu es bon ami avec launchd, non? Peux-tu le faire lancer cette application pour moi? Ah, au fait, je n'ai jamais pris la peine de rechercher le chemin complet. Ce que je sais en revanche, c'est son CFBundleIdentifier, qui est com.example.MyApp; demande à Launch Services et ils trouveront le chemin."

0 votes

Merci pour les deux réponses. J'ai modifié ma question pour mentionner que les deux applications doivent être partageables et utilisables immédiatement après le partage, donc cette réponse n'est malheureusement pas appropriée.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X