8 votos

Automator utiliza la ubicación del directorio actual

Mi objetivo es utilizar Automator para abrir una aplicación con argumentos

open ./MyApp.app -arguments

a través de la ejecución de un Buddy.app compartible con Myapp.app (el automatizador/flujo de trabajo). ambas aplicaciones deben ser compartibles junto con cualquier persona para que se ejecuten directamente.

la forma más sencilla de hacerlo, parece ser ejecutar el Buddy.app desde la misma carpeta que MyApp.app. entonces puedo mover la Buddy.app con MyApp.app a cualquier lugar, y seguirán funcionando juntas

para configurar las ubicaciones relativas de los archivos en bash script,

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

El único problema es que Automator utiliza el directorio de inicio en lugar del directorio de la aplicación. es decir, pwd es el directorio principal, y no la ubicación real del archivo.

en Automator la salida de

echo $(pwd)

es mi directorio personal, /Users/Usuario

Así que la pregunta es, ¿cómo hacer que Automator (Buddy.app) detecte la ubicación de la carpeta actual y ejecute MyApp.app?

1 votos

A partir de MacOS 10.12, Automator.app se encuentra siempre en /Applications y protegido por SIP . Puede comprobarlo ejecutando grep Automator /System/Library/Sandbox/rootless.conf o ls -ldAO@ /Applications/Automator.app . Entonces, ¿por qué no codificar simplemente /Applications ?

0 votos

Me doy cuenta de la ambigüedad de mi mensaje inicial y lo he cambiado para que quede más claro. quiero ejecutar myapp.app -argumentos desde cualquier lugar simplemente abriendo el automator.app/workflow

0 votos

Si entiendo bien la pregunta, su flujo de trabajo requeriría copiar myapp.app (o al menos un alias) a la ruta actual. Normalmente esto se hace al revés: la ruta actual (de, por ejemplo, un archivo/carpeta) se pasa a la aplicación como un argumento. pwd o ls no lo hará ¡ser copiado a $pwd para obtener el directorio de trabajo actual o un listado de contenido pero permanecer en /bin!

2voto

user91500 Puntos 6355

Haga que su flujo de trabajo decida su propio camino (más robusto)

Esto funciona siempre que el flujo de trabajo de Automator se encuentre en el mismo directorio como MyApp.app ; puede crear copias del flujo de trabajo o de la aplicación a su discreción y reutilizar esas copias donde quiera; no es necesario que nada sea único.

Pasos

Estos son los pasos para automatizar el lanzamiento MyApp.app :

  1. Abra el flujo de trabajo en Automator.

  2. Añade un Ejecutar AppleScript acción. Elimine todo el código de la plantilla interior y sustitúyalo por las siguientes líneas:

    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. Guarde el flujo de trabajo de Automator en la misma carpeta que MyApp.app .

  4. Ejecute el flujo de trabajo de Automator; debería lanzarse MyApp.app .

Explicación

set AppleScript's text item delimiters to ":"

Esto significa "Cuidado, pronto voy a dividir una cadena; y quiero que uses el : carácter como los límites de la división".

path to me as text

Esto indica al flujo de trabajo que debe averiguar la ruta hacia sí mismo; los componentes de la ruta están delimitados por dos puntos ( : ), que es un remanente del Mac OS clásico .

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

Esto corta la última parte de la ruta, y añade MyApp.app al camino.

[…] as text

De este modo se recompone el camino (de nuevo con : como delimitador).

tell application "Finder" to open file appPath

Por último, esta última línea provoca MyApp.app para el lanzamiento.

0 votos

Esto funciona bien sin argumentos. sin embargo necesito pasar argumentos al abrir.

2voto

Yitzchok Puntos 528

En Automator, cree un flujo de trabajo con Ejecutar Applescript primero:

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

.. y luego encadenarla a un Ejecutar Shell script que tiene Pasar la entrada: como argumentos :

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

Guárdelo como una aplicación.

Aquí hay una captura de pantalla donde uso esto para iniciar SQLWorkbench/J: screenshot from Automator

(El archivo zip de SQLWOrkbench/J se descomprime en la carpeta Contents de la aplicación resultante)

0voto

user91500 Puntos 6355

Utilizar el identificador del paquete de la aplicación de destino (más flexible)

¿Piensa mantener un solo ejemplar de MyApp.app en todo el sistema?

Si es así, puede aprovechar MyApp.app 's identificador del paquete, y tienen Servicios de lanzamiento resolver todos los detalles por ti.

Esta solución es bastante flexible; tiene la ventaja de que puedes poner tu flujo de trabajo de Automator donde quieras - no tiene que estar en el mismo lugar que MyApp.app ni en ningún lugar fijo con respecto a ella.

Pasos

Estos son los pasos que quieres dar:

  1. Abra Terminal.app y ejecute el siguiente comando:

    osascript -e 'id of app "'"$(mdfind MyApp.app)"'"'
  2. El paso anterior debería haber impreso una sola línea como resultado. Observe lo que dice esa línea (por ejemplo com.example.MyApp ).

  3. Abra su flujo de trabajo en Automator.

  4. Añade un Ejecutar Shell script acción con el contenido:

    open -b com.example.MyApp
  5. Guarde el flujo de trabajo de Automator en cualquier carpeta a su discreción - no es necesario ponerlo en una ubicación fija relativa a MyApp.app .

  6. Ejecute el flujo de trabajo de Automator; debería lanzarse MyApp.app .

Explicación

Servicios de lanzamiento

Esta solución aprovecha una parte de MacOS llamada Servicios de lanzamiento, que mantener una base de datos de aplicaciones y sus propiedades en todo el sistema :

Cada vez que una nueva aplicación es conocida por el sistema (por ejemplo, cuando el usuario la arrastra desde un disco de instalación a la carpeta de aplicaciones), la aplicación se registra en Launch Services, que copia la información necesaria sobre la aplicación en su base de datos. Los Servicios de Lanzamiento pueden entonces utilizar esta información para determinar la aplicación preferida para abrir un determinado archivo de documento o URL.

El plan

El dato que nos interesa es el identificador del paquete, o ID del paquete.

Un desarrollador de aplicaciones suele asignar a cada una de ellas un ID de paquete (con suerte) único a nivel mundial. Podemos aprovechar esta singularidad si, y sólo si, no hay más de una aplicación con el mismo ID de paquete en todo nuestro sistema, y sólo una única copia de esa aplicación. No hay duplicados.

Descubrir el camino

El comando

mdfind MyApp.app

es sólo una forma elegante de ejecutar una búsqueda en Spotlight como un acceso directo de una sola vez con el fin de averiguar la trayectoria de la aplicación a partir de ahora. Necesitamos la ruta sólo una vez para extraer el identificador del paquete de la aplicación.

Spotlight volverá (con suerte) con algo así:

/Users/watermelon/foo/MyApp.app

Extracción de CFBundleIdentifier

Envolviendo la ruta actual de la aplicación en el siguiente comando AppleScript:

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

es simplemente una forma conveniente de **extraer el CFBundleIdentifier ** de la MyApp.app paquete.

(También podría haber buscado el ID del paquete manualmente haciendo clic con el botón derecho del ratón sobre la aplicación en el Finder y eligiendo Mostrar el contenido del paquete , navegando hacia el Contents subcarpeta y abrir Contents/Info.plist en TextEdit, busque la clave que dice CFBundleIdentifier y encontrar su String valor una línea más abajo. Creo que esto es tedioso, por lo que siempre prefiero utilizar el programa AppleScript/ mdfind fragmento).

Lanzar una aplicación por el ID del paquete

Por último, echemos un vistazo al comando que realmente va a utilizar en su flujo de trabajo de Automator:

open -b com.example.MyApp

Este comando es sólo una forma técnica de decir "Oye MacOS, eres buen amigo de launchd ¿verdad? ¿Puede usted hacer que se inicie esta aplicación ¿para mí? Ah, por cierto, nunca me he molestado en buscar la ruta completa. Lo que sí sé es que su CFBundleIdentifier que es com.example.MyApp ; sólo hay que ir a preguntar Servicios de lanzamiento y ellos descubrirán el camino".

0 votos

Gracias por las dos respuestas. He modificado mi pregunta para mencionar que ambas aplicaciones deben ser compartibles y utilizables inmediatamente después de ser compartidas, por lo que esta respuesta lamentablemente no es apropiada.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X