Jump to content
skeletor

aprender AppleScript

Recommended Posts

pues eso..me gustaria aprender applescript, hacer mis propios scripts no creo q sea muy dificil vamos eso creo, pero de momento no tengo npi de por donde empezar ya q no entiendo muy bien como funcionan si alguno de vosotros controla del tema, pues le estaria muy agradecido si me hecha una manilla, muchas gracias....

Share this post


Link to post
Share on other sites

Hola skeletor,

 

pues la verdad, para empezar te recomiendo la ayuda de AppleScript que viene con Mac OS 9.1. Es cierto que normalmente los documentos de ayuda de Mac OS son muy básicos, pero en este caso la ayuda sobre AppleScript que viene con la versión 9.1 está muy bien estructurada y es bastante completa, además de fácil de entender. No sé si es la misma ayuda que viene con Mac OS 9.0, pero desde luego es mejor, más completa y mejor estructurada, en mi opinión, que la de Mac OS 8.5.

 

Por otra parte, existe un tutorial AppleScript en castellano bastante bueno en La Bondiola, una web argentina. Lo puedes encontrar en:

http://www.labondiola.com.ar/software/training/

 

Aparte de esta información, si dices en qué nivel te encuentras con AppleScript (¿sabes qué es un diccionario y cómo se usa? ¿has grabado alguna acción del Finder o de otras aplicaciones? ¿tienes experiencia con algún otro lenguaje de programación/scripting?... ) te puedo dar alguna orientación más concreta sobre cómo aprender AppleScript.

 

En cuanto a libros en Castellano, me temo que ninguno de los pocos libros sobre AppleScript que existen está traducido. Lo que sí puedes es bajarte varios documentos pdf sobre AppleScript, de diferente profundidad técnica, desde la web de Apple - en inglés, por supuesto.

 

saludos,

 

Eduardo

Share this post


Link to post
Share on other sites

muchas gracias por los enlaces y eso...

la verdad es q mi nivel es 0 patatero simplemente pense q aprender applescript seria una buena manera de aprender hacer otro tipo de cosas q no sean navegar y toquetear los progs de diseño, por supuesto me he leido la ayuda de mac os 9, parece bastante completilla pero....no me entero de lo q leo supongo q tengo la mente atrofiada...jejeje lo seguiere intentando

Share this post


Link to post
Share on other sites

Hola skeletor,

 

perdona, no me había fijado en que decías que aún estabas en la fase npi image Bueno, a ver si, en combinación con la ayuda de Mac OS, esta introducción que he preparado te sirve para facilitar un poco el aprendizaje de AppleScript, que realmente vale la pena aprender.

 

¿Para qué sirve AppleScript?

 

AppleScript es un lenguaje de programación (o de scripting, como dirían algunos) que se puede usar para "hablar" con las aplicaciones en Mac OS, que ofrecen a través de AppleScript una interfaz de uso alternativa, no gráfica, a través de la que acceder a la funcionalidad de esas aplicaciones. Mas que para realizar scripts en AppleScript "puro", AppleScript es un lenguaje "pegamento" usado para controlar otras aplicaciones.

 

Con AppleScript se pueden escribir desde pequeños scripts de tres o cuatro líneas para realizar tareas repetitivas en el Finder, hasta complejos programas que coordinen varias aplicaciones, organizando flujos de información entre ellas. Precisamente, el mayor atractivo de AppleScript es que permite coordinar varias aplicaciones, usando scripts para sincronizar las acciones de las aplicaciones controladas y compartir información entre ellas.

 

¿Cómo es AppleScript? Lenguaje natural y frases

 

Quizás la característica más singular de AppleScript, y la primera que uno nota cuando conoce el lenguaje, es que la manera de escribir scripts en AppleScript es muy parecida a como se escribe en un lenguaje natural. En concreto AppleScript está pensado para imitar el inglés, aunque tiempo atrás AppleScript estuvo pensado para que se pudiera usar en el idioma propio de cada versión de sistema operativo. Un script escrito en inglés en un Mac OS inglés se traduciría automáticamente a alemán al abrirlo en un Mac OS alemán. Increíble pero cierto; y lo mejor de todo es que el sistema funcionaba.

 

Escribir un script en AppleScript es en cierto modo como escribir una redacción, de las que escribíamos en el colegio. En el fondo, un script es una colección de frases, con las que se define qué es lo que queremos que haga el script y las aplicaciones que éste controla. Sin embargo, cada frase, en vez de separarse de la frase anterior por un punto, una coma, o cualquier otro signo de puntuación, se escribe en una línea nueva. Por otra parte, AppleScript sólo imita a un lenguaje natural, pero por supuesto no lo es. Los verbos que se usan en un script nunca se usan en pasado o en futuro, por ejemplo. El único modo verbal usado en AppleScript es el imperativo, porque, al fin y al cabo, el objetivo de AppleScript es dar órdenes a las aplicaciones para que hagan cosas por nosotros.

 

Los bloques "tell"

 

Como he dicho, AppleScript está pensado para "hablar" a otras aplicaciones, y sobre todo para coordinar acciones entre varias aplicaciones. Esto se consigue con lo que se llaman "bloques tell", o bloques "dile" (de decir), que no son más que grupos de sentencias dirigidas a una determinada aplicación, y que esa aplicación debe realizar. Podríamos pensar en un grupo tell como en un determinado párrafo de nuestra "redacción" en AppleScript. Estos grupos de frases siempre empiezan con la frase Tell application "nombre de la aplicación" y terminan con end tell. Si pudiéramos escribir un bloque tell en castellano, sería algo así como:

 

code:

Dile a la aplicación "Finder"

haz esto

haz aquello

haz lo otro

fin de dile

 

Dentro del bloque tell se puede escribir cualquier cosa que la aplicación a la que va dirigido el bloque entienda. Si escribimos algo que la aplicación no puede entender (porque está mal escrito o porque es algo que sólo entiende otra aplicación), el script dará un error y se parará.

 

¿Cómo "entienden" los programas a AppleScript? ¿Qué programas "entienden" a AppleScript?

 

Para poder usar una aplicación con AppleScript, la aplicación debe estar preparada para ello. No basta con que una aplicación esté programada para Mac OS para que entienda AppleScript (ojalá fuera así..). Así, cuando una aplicación está preparada para AppleScript, se pueden escribir sentencias destinadas a la aplicación, que ésta deberá procesar para realizar la acción que describe la sentencia.

 

Por supuesto, no se le puede decir a una aplicación cualquier cosa y esperar que siempre vaya a poder hacer lo que le decimos. Son las aplicaciones las que definen qué son capaces de hacer, y en función de ello, qué es lo que se les puede decir. Si la aplicación se preparó para poder ser usada con AppleScript, entonces define en su "diccionario" de AppleScript qué es lo que se le puede decir y cómo debe decirse, o dicho de otra manera, qué es lo que se le puede ordenar que haga desde un bloque tell.

 

Comandos y objetos. Jerarquías de objetos

 

Los elementos centrales de AppleScript son dos: comandos y objetos. Con estos elementos construimos la mayoría de sentencias o frases en AppleScript.

 

Los comandos son definiciones de acciones que queremos que las aplicaciones a las que hablamos lleven a cabo. Son básicamente verbos o formas verbales que describen una determinada acción que puede llevar a cabo la aplicación a la que va dirigido el comando. Muchas veces el verbo principal de un comando necesita un objeto como objeto directo de la frase de AppleScript que define el comando; a veces también son necesarios otros complementos verbales, que deben usar objetos u otros valores (números o texto, por ejemplo).

 

Los objetos son entidades contenidas en una aplicación, que pueden ser manipuladas con comandos. Son objetos en AppleScript, por ejemplo, una ventana, un archivo o una película abierta en el reproductor de Quicktime. Además, por una parte cada objeto puede tener propiedades, que son características propias del objeto, y por otra parte puede estar compuesto de o contener otros objetos, que llamamos elementos del objeto contenedor; haciendo un símil con un coche, su color o su peso serían propiedades, mientras que las ruedas o el motor serían elementos. En este sentido es importante entender estas relaciones entre objetos que se producen siempre dentro de una aplicación, pues en cada aplicación todos sus objetos están relacionados, ya sea por contener a otros objetos, o sólo por estar contenidos en otro objeto. Todos los objetos existentes en una aplicación se relacionan así en una jerarquía de objetos en la que unos contienen a otros, y en la que el objeto principal, el que contiene todos los demás objetos en la aplicación, debe ser siempre el objeto application.

 

En definitiva, la esencia de un script en AppleScript es manipular objetos mediante comandos. Un ejemplo típico es el de mover un ítem del Finder, como un archivo o una carpeta, de un sitio a otro:

 

code:

Dile a la aplicación "Finder"

mueve el archivo "borrador" a la papelera

fin de dile

 

En este ejemplo, el comando es "mueve ... a ...", que usa en este caso dos objetos: el objeto que queremos mover (el archivo "borrador") y el destino al que lo queremos llevar (la papelera). Aquí hemos usado objetos simples en los dos casos, pero podríamos usar referencias más complejas, como:

 

code
el primer archivo de la carpeta "documentos" del disco de arranque

 

y:

 

code
la carpeta "importante" del disco "Copias de seguridad"

 

que serían ejemplos de uso de la jerarquía de objetos que define el Finder. Finalmente, podemos llegar a crear referencias bastante elaboradas usando filtros con la cláusula whose (cuyo):

 

code
todos los archivos de la ventana del frente cuyo nombre contenga "informe"

 

En todos los casos, no necesitamos nombrar el objeto application que contiene esas referencias, pues la aplicación sabe que ese objeto siempre contiene cualquier otra referencia a objetos en la aplicación y lo añade a las referencias de manera implícita.

 

Comandos básicos de AppleScript, diccionarios de aplicaciones y adiciones de scripts

 

AppleScript en sí define unos pocos comandos básicos (como se puede leer en la ayuda de AppleScript, estos comandos son Count, Copy, Get, Set y Run). Son comandos elementales, que permiten realizar acciones muy básicas, y que cualquier aplicación debería entender.

 

Los comandos get y set, de hecho, son muy importantes. Con el comando set podemos manipular objetos, modificando sus propiedades y elementos. Se usa con la forma "set <referencia> to <valor>", donde <referencia> es una referencia a una propiedad o elemento de un objeto, o bien una variable, de las que hablaremos más adelante, y <valor> es el valor que queremos asignar a la referencia, como en este comando para el Finder:

 

code
set name of front window to "nuevo nombre"

 

Con el comando get, por el contrario, podemos obtener valores contenidos en las propiedades y elementos de objetos. Sin embargo, ninguno de los comandos básicos de AppleScript permite acciones más sofisticadas como manipular textos (buscar y cambiar ocurrencias en un texto), trabajar con archivos o acceder a recursos en red, por ejemplo.

 

Los comandos realmente interesantes son los que definen las aplicaciones que se pueden usar con AppleScript. Estos son los comandos que se pueden ver al abrir el diccionario de una determinada aplicación desde el Editor de scripts. Son los comandos que permiten manipular bases de datos de Filemaker, extraer mensajes de Eudora o automatizar tareas con QuarkXpress, por poner algunos ejemplos. El Finder, por ejemplo, que no es más que una aplicación, entiende comandos como "shut down", para apagar el ordenador, o "eject" para expulsar un disco extraíble.

 

También definen comandos adicionales las adiciones de scripts, pero de ésas, aunque son componentes muy útiles de AppleScript, hablaremos en otra ocasión.

 

Los diccionarios, el modelo de objetos

 

Para saber qué se puede hacer con una aplicación mediante AppleScript, hay que abrir el diccionario de la aplicación desde el Editor de Scripts, con el menú Archivo : Abrir diccionario. Las aplicaciones que no permiten abrir un diccionario desde el editor de scripts simplemente no se pueden usar con AppleScript, pues no entienden el lenguaje.

 

En el diccionario de una aplicación se muestran en un listado a la izquierda del diccionario todos los comandos y objetos propios de la aplicación; los comandos se muestran en texto normal, mientras que los objetos se muestran en cursiva (estrictamente hablando, lo que se muestran son clases de objetos, no objetos en sí). Muchas veces, comandos y objetos aparecen además agrupados en diferentes "suites" o grupos temáticos, resaltados en negritas. A la derecha del diccionario se pueden ver las descripciones detalladas de los comandos y objetos seleccionados en el listado de la izquierda.

 

Los comandos que una aplicación define en su diccionario son relativamente fáciles de entender, pues no son más que plantillas de formas verbales que hay que rellenar con la información que se pide en el diccionario de la aplicación; además, muchas veces los comandos tiene partes opcionales, mostradas entre corchetes en la definición del comando, que no es obligatorio usar. Los objetos de una aplicación, sin embargo, pueden traer un poco más de confusión. Personalmente creo que el no entender bien cómo construir correctamente referencias válidas a objetos de una aplicación es uno de los mayores obstáculos al aprender AppleScript, y también una de las mayores frustraciones durante el aprendizaje.

 

En el diccionario de una aplicación, tal como lo muestra el Editor de scripts, todos los objetos que puede contener la aplicación aparecen en cursiva. Sin embargo, el Editor de scripts que viene con Mac OS es un programa muy simple, y no refleja bien la jerarquía en que estos objetos se organizan dentro de la aplicación. La única manera de ver la relación entre objetos, en el Editor de scripts, es leer la descripción de cada objeto en el diccionario de la aplicación y comprobar de qué elementos puede estar compuesto. Pongamos por ejemplo un supuesto editor de texto, que puede contener varios objetos, mostrados así en el Editor de scripts:

 

code:

aplicacion

ventana

barra de informacion

documento

parrafo

palabra

 

En la lista de objetos no se aprecia ninguna relación entre ellos. Sin embargo, si analizamos la descripción de cada uno de estos objetos, empezando por el objeto aplicacion, veremos que unos contienen a otros en forma de elementos, y que la relación se expresaría mejor simulando un listado de carpetas, conteniendo unas a otras, tal como se verían en un listado del Finder:

 

code:

aplicacion

-->ventana

----->barra de informacion

-->documento

----->parrafo

-------->palabra

 

El objeto aplicacion, como vemos, puede contener ventanas y documentos, y un documento a su vez puede contener parrafos. Así, según el listado de objetos tal como nos lo muestra el Editor de scripts, le podríamos pedir a la aplicación que nos diga simplemente cuál es la tercera palabra. Sin embargo, en ese caso la aplicación nos daría un error, pues no sabría a qué palabra nos referimos. Debemos darle a la aplicación la referencia completa del objeto que nos interesa; por ejemplo, la tercera palabra del primer parrafo del documento "Informe" (por supuesto, en este caso debería existir, y estar abierto, un documento "Informe" con al menos un párrafo, con tres palabras).

 

Esta organización jerárquica de objetos en una aplicación es el "modelo de objetos" particular de cada aplicación, que se adapta mejor o peor a la descripción estándar de Modelo de objetos propuesta por Apple.

 

Otros elementos útiles: variables, construcciones de control de flujo

 

Se puede programar en AppleScript usando sólo comandos y objetos puros. Sin embargo, para poder realizar scripts de cierta complejidad, se necesitan otros elementos de programación. Estos elementos, comunes a la mayoría de lenguajes de programación, son principalmente las variables y las construcciones o sentencias de control de flujo.

 

Las variables son básicamente contenedores que podemos usar para guardar otros valores, como referencias a objetos, números, o texto, y que podemos usar en los mismos lugares en que usaríamos esos mismos valores. Para usar las variables, debemos darles un nombre, y como en otros lenguajes, los nombres de variables sólo pueden contener letras, número y el carácter _, pero no pueden empezar con un número. Al igual que se puede hacer con las referencias a objetos, las variables se manipulan principalmente con los comandos básicos get y set, para obtener y modificar sus valores. En el siguiente ejemplo, le decimos al Finder que guarde en una variable una referencia a todos los archivos en el escritorio que contengan ".gif" en su nombre:

 

code
set mis_imagenes to every file of desktop whose name contains ".gif"

 

En cuanto al control de flujo dentro de los scripts, AppleScript dispone de las construcciones habituales en otros lenguajes de programación: control condicional de sentencias y bloques de repetición de sentencias. Al igual que los bloques tell, estas construcciones se usan para englobar una o más sentencias de AppleScript. Sin embargo, a diferencia de los bloques tell, en los que las sentencias que contienen se ejecutan en todos los casos, y una sola vez, con estas construcciones es posible controlar cuándo y cuántas veces deben realizarse las acciones descritas por las sentencias que contienen estos bloques.

 

Para el control condicional se usa la construcción if ... then (si ... entonces), que permite restringir la ejecución de las sentencias contenidas en el bloque a los casos en que se cumpla la condición descrita por la sentencia if ... then, como en el siguiente ejemplo:

 

code:

si el nombre de la ventana frontal es el nombre de la papelera entonces

muestra un dialogo con "La papelera está abierta"

fin de si

 

En cuanto a los bloques de repetición, llamados habitualmente bucles, se realizan con construcciones repeat (repite). La construcción repeat puede tener varias formas, pero siempre permite repetir una o varias veces las sentencias que contiene el bloque. Con una de estas formas de bloque repeat podemos crear esta versión en AppleScript del conde drácula de Barrio Sésamo, aquél que nos enseñaba a contar de pequeños:

 

code:

repite con i desde 1 hasta 10

muestra un dialogo con "Ja Ja Ja ... " & i & " ... Ja Ja Ja!"

fin de repite

 

La versión oficial, en inglés, sería:

 

code:

repeat with i from 1 to 10

display dialog "Ja Ja Ja ... " & i & " ... Ja Ja Ja!"

end repeat

 

Usando las construcciones condicionales y de repetición, en combinación con variables, se puede, en definitiva, controlar con exactitud qué debe hacer un script en cada circunstancia particular.

 

Ejemplos

 

Terminamos con un par de ejemplos sencillos de scripts en AppleScript. Se pueden copiar al Editor de scripts y ejecutarlos sin necesidad de guardarlos.

 

El primer ejemplo es muy simple. Lo único que hace es abrir el disco que contiene la carpeta de sistema activa (el Finder le llama "startup disk"), calcular el tamaño de cada carpeta y mostrar el contenido en modo de listado, ordenado por tamaños.

 

code:

tell application "Finder"

activate

open startup disk

set listado_por_tamano to 4

set calculates folder sizes of front window to true

set view of front window to listado_por_tamano

end tell

 

El segundo ejemplo es un poco más útil. Lo que hace es extraer la información de cada una de las pistas de una película Quicktime, y guarda la información recopilada. Como Mac OS no viene con ningún editor de textos scriptable, guardamos la información en carpetas del Finder con los nombres e información de cada una de las pistas. Por supuesto, sería más lógico usar un editor scriptable, como BBEdit, para guardar la información en un archivo de texto. Aunque es un poco más elaborado que el primer ejemplo, sigue siendo bastante básico. Por ejemplo, no tiene en cuenta qué puede pasar si Quicktime no está abierto o no tiene abierta ninguna película, o qué pasará si en el Finder ya existe una carpeta con un nombre que quieras usar; en cualquiera de estos casos, el script dará un error y se parará.

 

code:

tell application "QuickTime Player"

 

set la_pelicula to movie 1 of front window

set las_pistas to every track of result

 

tell application "Finder"

activate

 

make new folder at desktop with properties {name:"Información " & name of la_pelicula}

set carpeta_de_pelicula to result

open carpeta_de_pelicula

end tell

 

repeat with una_pista in las_pistas

 

set nombre to name of una_pista as string

set tipo to kind of una_pista as string

set duracion to duration of una_pista as string

 

tell application "Finder"

make new folder at carpeta_de_pelicula with properties {name:"Pista " & nombre}

set carpeta_de_pista to result

make new folder at carpeta_de_pista with properties {name:"Tipo - " & tipo}

make new folder at carpeta_de_pista with properties {name:"Duracion - " & duracion}

end tell

 

end repeat

 

end tell

Share this post


Link to post
Share on other sites

¿¿¿Cómo es que nadie le ha dado una medalla a Eduardo y puesto su entrada en las descargas de Macuarium???

 

¡Un poco de por favor! :D

Share this post


Link to post
Share on other sites

Ole, ole y ole!!

Quiero felicitar a Eduardo por realizar uno de los mejores tutoriales de Applescript en español, por no decir el mejor.

¿Cómo es que no se ha colocado este post como tema importante? ¿O colcocarlo en la sección de descargas como pdf?

Creo que ayudaria a mucha gente como yo que está empezando con el lenguaje de Applescript, y más viendo que la mayoría de tutoriales y libros están en ingles.

Me he sentido tan identificado con la frase: "... el no entender bien cómo construir correctamente referencias válidas a objetos de una aplicación es uno de los mayores obstáculos al aprender AppleScript, y también una de las mayores frustraciones durante el aprendizaje."

 

Felicidades y gracias por la ayuda, Eduardo. :D

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.