Automatizar la apertura de las herramientas de trabajo y carpetas en MAC (Applescript)

Este artículo es el primero para realizar unas acciones concretas. En este caso lo haremos mediante applescript y en el siguiente se realizarán las mismas acciones con  automator.

Si ya está familiarizado con el uso de AppleScript y conoce su metodología, prácticamente podría saltar directo al script ya que el artículo, en su mayoría, trata de explicar los conceptos básicos utilizados en el script.

Una de las maravillas del sistema OS X es la facilidad que ofrece para automatizar todo tipo de tareas y, como veremos en este pequeño manual, utilizando applescript, podremos con un simple clic de ratón abrir una serie de carpetas, scripts, programas o incluso que nos pregunte que es lo que queremos abrir. Resulta ideal, sobre todo cuando tienes varios proyectos en marcha haciendo que las carpetas de trabajo sean varias, en diferentes ubicaciones y los archivos no siempre sean los mismos a utilizar ya que puede haber diferentes versiones de ellos.

Ahora que ya estamos metidos en situacion, concretemos un poco más el caso. Para que sea algo realista, voy a basar el artículo en un caso real que me hizo recurrir a las maravillas de applescript para abrir una serie de carpetas con los archivos de un proyecto y tras ello abrir la ultima version del script en el que estuviera trabajando. Respecto a las carpetas no hay mucho que decir ya que siempre serán las mismas pero respecto al script, si queremos que nuestra automatización sea práctica y no tengamos que modificarla cada vez que cambiemos de nombre el sctipt, (cosa que yo hago continuamente ya que añado la verison del mismo en el propio nombre del archivo) tendremos que recurrir a uno de los diálogos del sistema. Así pues, el objetivo es el siguiente…

Crear un Applescript con las siguientes características:

  • Debe abrir 2 carpetas específicas (La carpeta de los archivos de prueba y la de los scripts)
  • Abrir un archivo de código (Applescript también) cuyo nombre puede cambiar todos los días, incluso varias veces en el mismo día

Como puede ver, no es un guión nada complicado así que vamos manos a la obra, comenzando con la parte de las carpetas aunque antes, veamos un poquito de teoría…

Applescript tiene una amplia gama de posibilidades para referirse a carpetas y archivos. Estas son las siguientes:

  • Referencias anidadas
  • Referencia de ruta
  • Referencias de alias
  • Rutas Posix
  • URLs

Cada una de las formas tiene su método y no siempre se pueden utilizar todas en cualquier punto del script o de cualquier forma aunque lo que si es posible es convertir unas en otras de forma sencilla y en este caso vamos a recurrir a 2 tipos para que el script resulte un poco más didáctico 😉 . Usaremos tanto las referencias de ruta como las referencias anidadas.

El método de referencia de ruta consiste básicamente en escribir la ruta completa desde su comienzo. En este caso en vez de usar el caracter «/» para separar los directorios, lo haremos tipo MAC mediante el caracter «:» para separar cada uno. Para asegurarnos de que queda totalmente claro, veamos un pequeño ejemplo sobre las rutas:

Para las personas procedentes de Windows esto sería una ruta común:

C:\Usuarios\alvaro\DropBox\Proyectos\Applescript\en_DESARROLLO\ARCHIVA2

Para quienes llegan de Linux o Unix la ruta tendría este aspecto:


Macintosh HD/Usuarios/alvaro/DropBox/Proyectos/Applescript/en_DESARROLLO/ARCHIVA2

Mientras que en los sistemas Apple, la ruta pasaría a ser así:

Macintosh HD:Usuarios:alvaro:DropBox:Proyectos:Applescript:en_DESARROLLO:ARCHIVA2

Teniendo en cuenta que el corazón de OS X es un UNIX, las rutas cuyo delimitador es la barra invertida «/» tambien serían válidas aunque en este caso nos vamos a basar en el tipo de ruta de MAC por defecto.
En cambio, las referencias anidadas, aun siendo una forma muy sencilla y lógica tambien, se basan en el concepto contrario, es decir, vamos anidando los items para formar la ruta PERO en sentido contrario. Mientras que en con las referencias de ruta vamos formando la estructura partiendo del inicio del disco hasta el directorio destino, en las referencias anidadas se hace al revés comenzando por el directorio en cuestion e indicándo que esta dentro de… y dentro de… y dentro de…. Veamos un ejemplo que, seguramente, resulte más aclarador que mis explicaciones:
Imaginemos la tenemos la siguiente ruta:

Macintosh HD/Usuarios/alvaro/Escritorio/samples/zona_pruebas/archiva2

Para referirnos a ella mediante referencias anidadas tendriamos que hacerlo de la siguiente manera:

...of folder "archiva2" of folder "zona_pruebas" of folder "samples" of desktop of folder "alvaro" of folder "usuarios"...etc

Dependiendo de donde este ubicada la ruta, tendríamos que seguir especificando los directorios o no. En este caso, una de las carpetas es el escritorio (Desktop), la cual es una de las carpetas reconocidas por el sistema por lo que podríamos terminar la anidación de elementos con un simple «of desktop» y de hecho, así se hará en el script.
Ahora que estoy seguro de que la primera parte del script no va representar ningún problema, vamos al grano con él, de manera que, en esta primera parte lo que haremos será abrir las 2 carpetas de trabajo necesarias:

tell application "Finder"
set DirectorioDeTrabajo to folder "
Macintosh HD:Usuarios:alvaro:DropBox:Proyectos:Applescript:en_DESARROLLO:ARCHIVA2" as alias
open folder "archiva2" of folder "zona_pruebas" of folder "samples" of desktop
open folder DirectorioDeTrabajo
end tell

Como se puede apreciar, en la segunda línea, aunque se puede ver claramente la estructura de carpetas, su objetivo no es abrirla sino guardarla en una variable llamada DirectorioDeTrabajo que luego, en la penúltima línea si abriremos mediante la orden «open folder». Esto no es obligatorio ni mucho menos pero nos resultará mucho más cómodo ya que asignándole la ruta como valor a dicha variable, cada vez que tengamos que hacer uso de toda esa concatenación de directorios para referirnos a la carpeta que apuntan, podremos hacerlo simplemente escribiendo al variable y más adelante es algo que nos vendrá muy bien para mantener «limpio» el script facilitando tanto su lectura y comprensión como su escritura.

Ahora que tenemos la parte de las carpetas, tenemos que escribir la parte que nos abrá el script. Como he dicho antes, en mi caso el script no es el mismo de un dia para otro. Incluso puede cambiar varias veces en el mismo dia ya que en el nombre incluyo la versión y muchas veces hasta alguna palabra que especifique más el punto donde se encuentra mi trabajo en dicho archivo. Esto hace que no pueda especificar un archivo concreto a abrir desde el script que iniciará todo a no ser que quiera cambiar cada dia mi script, cosa que haría que todo este sistema no fuese viable. Para solucionar este problema, la mejor manera es recurrir a uno de los diálogos del sistema para la apertura de archivos, que en este caso será el script que yo seleccione en el momento. Esto se consigue mediante la orden «choose file». Ahora bien, si me abre el diálogo de seleccion de archivo en una carpeta perdida o lejana a mi destino, haria de nuevo que este método no fuese más rápido o práctico que hacerlo todo a mano pro lo que vamos a personalizar un poco la orden…

choose file with prompt "Selecciona el SCRIPT DE TRABAJO" default location DirectorioDeTrabajo
Veamos que quiere decir cada cosa:

  • choose file: Es la orden en sí misma para la apertura del diálogo de seleccion de archivo
  • with prompt: es el parámetro encargado de añadir un pequeño mensaje en la ventana.
  • default location: Es lo que nos permitirá abrir el diálogo de seleccion de archivo en el directorio que queramos.

Con esa simple linea hemos definido prácticamente todos los parámetros pero nos falta lo más importante y es que aún no le hemos dicho que es lo que hay que hacer con el archivo seleccionado por lo que hasta ahora esta parte del script no sirve de nada. Solucionémoslo…

En este caso de ejemplo, lo que queremos es automatizar la apertura de los elementos de trabajo. Estos elementos habíamos dicho que eran las dos carpetas anteriores y un script sobre el que estoy trabajando. Esta última parte, abrirá un script pero hay que tener en cuenta que puede ser aplicable a cualquier otro tipo de documento sobre el que estemos trabajando. De hecho, escrito de la siguiente manera, no tendríamos que cambiar nada del script para que funcionase con otros tipos de documentos como archivos de pages o numbers, de word o excel, de música…etc etc ya que el método a seguir será que Finder abra el documento, sin más. Esto hace que para abrirlo, él solito busque la aplicación por defecto para abrir el tipo de documento que sea seleccionado en el diálogo o ventana de selección de archivo.

tell application "Finder" to open (choose file with prompt "Selecciona el SCRIPT DE TRABAJO" default location DirectorioDeTrabajo)

Se puede apreciar también que esta linea sirve para cualquier otro tipo de documento al que queramos adaptar el script y además no es necesario que sea modificada ya que, al hacer uso de la variable antes mencionada DirectorioDeTrabajo, cuando se cambien las rutas en la primera parte del script, dicha variable tomará el nuevo valor por lo que la ventana invocada por esta linea se abrirá en la nueva ruta. Además es destacable tambien la sensación de limpieza que transmite el código usando la variable en lugar de toda la ruta.

Finalmente ya tenemos las dos partes por separado completamente explicadas por lo que vamos a proceder con el script completo:
tell application "Finder"
set DirectorioDeTrabajo to folder "
Macintosh HD:Usuarios:alvaro:DropBox:Proyectos:Applescript:en_DESARROLLO:ARCHIVA2:" as alias
open folder "archiva2" of folder "zona_pruebas" of folder "samples" of desktop
open folder DirectorioDeTrabajo
open (choose file with prompt "Selecciona el SCRIPT DE TRABAJO" default location DirectorioDeTrabajo)
end tell

Y con esto damos por finalizado el artículo y solamente recuerde que, para personalizar y adaptar este script a sus propósitos personales solamente tendrá que modificar 2 cosas:

  • Las rutas de la primera parte (Añadiendo, eliminando o modificando las existentes)
  • El mensaje del cuadro de diálogo (En el caso de que quiera seleccionar algo que no sea script 😉 )

También podría darse el caso de que lo que quiera abrir no sea un documento, es decir, que el objetivo del script sea simplemente abrir X aplicaciones. En ese caso, el script seria más sencillo aún ya que se podría suprimir la segunda parte del script y añadir una linea como la siguiente por cada una de las aplicaciones:

Si deseamos que se abra y quede visible en pantalla, por ejemplo la aplicacion TextMate:
tell application "TextMate" to activate
Si queremos que se abra pero que permanezca oculta:
tell application "TextMate" to open

Para no extender más aún el artículo, nos quedaremos con esta manera de referirse a las aplicaciones aunque es importante mencionar que no es la única forma de referirse a un aplicacion.

Y ya finalmente si, de la misma manera que mi script podria no ser el mismo de un dia para otro obligándome a recurrir a un diálogo para seleccionar el documento a abrir, puede recurrir a un diálogo para seleccionar la(s) aplicaciones a abrir. Para hacerlo, seria de la siguiente forma:
choose application
Cabe destacar tambien que al igual que el diálogo de selección de archivo, este otro para seleccionar aplicación dispone de varios parámetros para personalizarlo al gusto del usuario aunque eso sería ya un nuevo artículo 😉

4 Comentarios

  1. Alejandro Max

    Hola queria hacerte una consulta ver si me puedes ayudar.

    He creado un script que al ejecutarlo me crea un icono en el escritorio de mac web a modo de acceso directo que al hacer click en el me lleva a la pagina. El script es el siguiente:

    tell application «Finder»
    make new internet location file at desktop to ¬
    «http://www.maxflats.com/» with properties {name:»maxflats»}
    end tell

    lo hace bien… me crea un icono en el escritorio y cuando hago click en el me lleva a la pagina indicada. Pero el icono que crea me pone un simbolo de arroba, y la pregunta hay alguna manera que le indique que me ponga otro icono.

    Espero puedas ayudarme. Muchas gracias, es importante.

    Saludos.

  2. @Alejandro Max,

    Hola, dependiendo del objetivo que busques se puede complicar un poco el tema.
    Me explico: El tema de cambiar los iconos de los archivos con AppleScript mediante «comandos simples» hoy por hoy, no es posible aunque de formas más o menos indirectas se puede hacer.

    Las 2 primeras soluciones que se me ocurren son:

    a.- Que el Script principal (El que ejecuta el usuario) lo guardes como paquete de aplicación o de script. Esto te crearía un directorio .app que, a los ojos del usuario seria un archivo .app común, es decir, una aplicación más, pero en cuyo contenido tendrías la estructura de carpetas y archivos de tu aplicación. Dentro de esta estructura podrías meter el enlace a la WEB ya hecho previamente y con un icono personalizado de forma que, para tener dicho lanzador en el escritorio, desde el script principal no tendrías que crearlo con un icono diferente sino que bastaría con solo copiarlo del App principal.

    b.- La otra opción, si realmente necesitas o quieres crearlo desde cero, te obligaría a recurrir a las pulsaciones de teclado «Virtuales», es decir, realizar con código los mismos pasos que realizarías para cambiar el icono de forma manual. Sería algo así como esto:
    1.- Crear el lanzador
    2.- Seleccionar el icono deseado y copiarlo con las teclas «Comando+C»
    3.- Seleccionar el lanzador
    4.- Abrir la ventana de información del mismo y pegar el icono, desde el portapapeles, mediante las teclas «comando+v»

    Ten en cuenta que también en la segunda deberías tener «a mano» el icono original. Si no es un icono estándar en el sistema tendrás que incorporarlo en la estructura del script principal como en la opción A. Si en cambio usas un icono que si esté siempre en el sistema, por ejemplo, el de Safari, creo que podrías ahorrarte esa parte.

    Espero haberte ayudado

  3. Alejandro Max

    Hola, muchas gracias por la respuesta… he estado buscando mucho por internet y no he dado con la solución, tal como dices en un poco complicado de hacer. Te explico mejor que es lo que necesito ya que la opción A es la que me parece puede funcionar.

    El script que te envié en el post, es para colocarlo dentro de un pendrive y que al insertarlo en el ordenador se ejecute automaticamente y te coloque en el escritorio un icono (webloc) que te lleve directamente al sitioweb. Por eso es la necesidad de cambiar el icono para que visualmente una persona identifique el icono del producto que a comprado.

    Con lo creo que la solucion seria una vez creado el webloc con el icono que deseo a traves de command+c y command+v. es hacer un sencillo escript que lo copie del pendrive al escritorio del usuario. Ahora como seria ese script?

    Saludos y muchas gracias por tu pronta respuesta.

  4. Ufff, lo de crear un «autorun» en Mac para un USB lo veo complicado… creo que lo más cercano puede ser un archivo .DMG que al abrirlo ejecute el applescript que realice la tarea de meter el lanzador en el Desktop.

    Ahora bien, la parte de cambiar el icono ya está hecha. Date cuenta de cambiar el nombre del archivo lanzador en el escritorio (Este solo es el nombre) y la ruta completa (TODA la ruta, en el caso del archivo con el icono)

    Me ha llevado un ratillo pero funciona perfectamente.
    (*
    IMPORTANTE:

    Es necesario cambiar las siguientes partes:
    «/compartida/icono» –> Debe ser la RUTA COMPLETA al icono personalizado que queremos usar
    «sample.webloc» –> Es, SOLAMENTE EL NOMBRE del archivo LANZADOR en el escritorio.

    Solo es necesario cambiar esas dos partes
    *)

    — Creamos IconoPersonalizado con la ruta al Icono que queremos
    set IconoPersonalizado to (POSIX file «/compartida/icono») as alias
    — Ahora Creamos Lanzador con la ruta al lanzador en el escritorio
    set Lanzador to POSIX path of (path to desktop as alias)
    set Lanzador to Lanzador & «sample.webloc»
    set Lanzador to (POSIX file Lanzador) as alias

    — Creamos una variable con la ventana de informacion del icono
    tell application «Finder»
    activate
    set VentanaInformacion to open information window of IconoPersonalizado
    set VentanaInformacionAbierta to name of VentanaInformacion
    end tell

    — Copiamos el icono
    tell application «System Events»
    tell application process «Finder»
    tell window VentanaInformacionAbierta
    keystroke tab
    delay 1
    keystroke «c» using command down
    end tell
    end tell
    end tell

    — Cerramos la ventana de info y RE-creamos de nuevo la variable VentanaInformacion pero con la info del lanzador
    tell application «Finder»
    close VentanaInformacion
    set VentanaInformacion to open information window of Lanzador
    set VentanaInformacionAbierta to name of VentanaInformacion
    end tell

    –Pegamos el icono
    tell application «System Events»
    tell application process «Finder»
    tell window VentanaInformacionAbierta
    keystroke tab
    delay 1
    keystroke «v» using command down
    end tell
    end tell
    end tell

    –Cerramos la ventana de info
    tell application «Finder»
    close VentanaInformacion
    end tell