terug

Applescript

Inhoudsopgave

Introductie
De Applescript-Editor
Simpele Finder scripts
Lanceer script
Kopieer script
Backup script
Links

Introductie

Applescript is de programmeertaal waarmee taken in het Mac OS kunnen worden geautomatiseerd. De taal is opgezet om goed te kunnen lezen zodat de drempel om te beginnen laag is. Het is echter een illusie, dat je zonder tijd en moeite scripts kunt leren schrijven. Niets voor niets.
Er is een nederlandse site, Applescript.nl, waarop wordt beweerd dat er "erg weinig documentatie in het nederlands" over beschikbaar is. Vervolgens wordt je aangemoedigd om hun boek te kopen of een cursus bij de sponsors te volgen. De bladzijde met 'links' is leeg. Dit is prima voor professionele gebruikers, maar de beginnende hobbyist met kleine beurs mag best wat meer hulp krijgen.

Onderaan deze pagina staan enkele (weliswaar engelstalige) sites die in ieder geval voor de beginner nuttig zijn. Tijd voor een eerste kennismaking met Applescript.

Open het programma Applescript-Editor in de map "Hulpprogramma's" en typ eens gewoon de volgende tekst in:

display dialog "Hallo, wereld!"

Druk daarna op de knop "Voer uit" om dit script meteen uit te voeren. Als u geen typfouten gemaakt heeft, zal er een klein nieuw venster verschijnen met de tekst en daaronder de standaard knoppen Annuleer en OK, in die volgorde.
Nou, dat was dan uw eerste script. Snel door naar een volgende:

display dialog "Is het nog leuk?" buttons {"Ja", "Nee"} default button 1

Als u wederom geen typfouten gemaakt heeft, ziet u hier het eerste voorbeeld van interactie. U heeft precies hetzelfde soort venster gemaakt als in het eerste voorbeeld, maar deze keer heeft u zelf de knoppen gedefinieerd die zichtbaar moeten worden en u heeft ook aangegeven welke knop (de eerste) u als standaard keuze beschouwd.

terug naar begin

De Applescript-Editor

Even iets over de Applescript-editor. De script editor is het programma waarin scripts kunnen worden ingetypt en uitgevoerd. Het woord 'kunnen' is op zijn plaats, want het intypen van scripts kan in principe in elk programma waarin tekst kan worden ingevoerd. Zelfs Microsoft Word kan als tekst-editor worden misbruikt, zolang je het resultaat maar bewaart als tekst en niet als document. Echter, een script moet vroeg of later worden gecompileerd en uitgevoerd en dan zal toch de Script Editor zijn kunsten moeten vertonen.
Wanneer u een script vers heeft ingetypt, staat de tekst in een soort onopvallend paars. Zojuist hebben we steeds meteen op de knop 'voer uit' getypt in de hoop dat het werkt, maar het verdient aanbeveling om eerst de knop 'Compileer' te gebruiken. Het script wordt dan gecontroleerd op syntax- en typfouten (oftewel, gecompileerd) en de diverse onderdelen van het script (commando's en objecten) zullen dan in verschillende opmaak worden getoond. Zo kunt u het script ontdoen van kleine fouten en wordt het script iets prettiger leesbaar. Dit wordt ook wel 'syntax-highlighting' genoemd.

Het uitvoeren van een script kan worden gestart met de knop 'voer uit'. Indien het script foutloos is, zal het zonder morren worden uitgevoerd, afhankelijk van het soort script zullen invoer en uitvoer op het scherm voorbijrollen. Na uitvoer staat de computer stil in het programma waarin de handeling zich heeft afgespeeld.
Wanneer een script naar behoren werkt zul je het graag snel willen uitvoeren zonder iedere keer de Applescript Editor te moeten openen en op 'Voer uit' te klikken. Het is daarom mogelijk het script als zelfstandig programma te bewaren. Dit kun je in principe overal neerzetten, maar wees consequent en verzin een plek die makkelijk terug te vinden en waar je in principe al je scripts bewaart. Een script kun je bewaren door in het Archief menu het commando 'Bewaar als...' te kiezen en dan aan te geven dat je het wilt bewaren als programma.

terug naar begin

Simpele Finder Scripts

Met Applescript kunnen diverse programma's op uw Mac geautomatiseerd worden. Een van die programma's is de Finder. Hieronder een script dat alle vensters in de Finder sluit.

tell application "Finder" to close every window

En zie eens hoe 'menselijk' deze instructie eruit ziet!
Via de "tell" instructie geeft het script de Finder de opdracht om alle openstaande vensters te sluiten.

Op zich wordt mijn bureaublad zo wel schoon, maar ik heb geen computer om de hele dag mijn bureaublad schoon te houden. Snel naar het volgende script:

tell application "Finder"
 close every window
 open folder "Afbeeldingen" of home
 tell the front Finder window
  set toolbar visible to false
  set the current view to flow view
  set the bounds to {200, 120, 1020, 680}
 end tell
end tell

Dit begint ergens op te lijken. Hier worden eerst alle vensters gesloten, vervolgens wordt de map Afbeeldingen geopend in een nieuw venster en vervolgens wordt de weergave van dat nieuwe venster op Flow view gezet. Handig om door afbeeldingen te bladeren in de Finder.

terug naar begin

Lanceer script

Het volgende script kan gebruikt worden om een applicatie op te starten.

--vraag wat je op wilt starten

repeat
    set question to display dialog ("Wat wil je starten?") default answer ""
    set answer to text returned of question
    if answer is not "" then
        exit repeat
    end if
   
end repeat

--start de gevraagde applicatie
tell application (answer)
    activate
end tell

Met het Dock en de mogelijkheid om je map Programma's ook in het dock te zetten lijkt dit script vrij overbodig. Echter, je kunt zo toch vrij snel een programma starten dat nou even net niet in je Dock staat en misschien in een submap staat.

terug naar begin

Kopieer script

Het volgende script kan gebruikt worden om een eenvoudige backup van een map te maken naar een andere map of schijf. Hiertoe wordt het commando 'duplicate' gebruikt.

tell application "Finder"

    -- eerst vragen welke map gekopieerd gaat worden  
    set bronmap to choose folder with prompt "Kies de map die u wilt kopieren"
    delay 0.5

    -- vragen onder welke map de kopie terecht komt
    set bestemming to choose folder with prompt "Kies de bestemming"
   
    duplicate bronmap ¬
        to bestemming with replacing
   
end tell

Voor de flexibiliteit laten we het script eerst vragen welke map gekopieerd moet worden en vervolgens waarheen. Voordeel is hierbij ook dat er niet kan worden gekopierd naar niet-bestaande locaties. De toevoeging 'with replacing' zorgt ervoor dat een eventueel bestaande map met identieke files wordt overschreven.

terug naar begin

Backup script

Het volgende script kan gebruikt worden om een backup van een map te maken naar een externe schijf. Daartoe wordt de Unix shell van Mac OS X aangeroepen. Het is in beginsel vrij simpel, het script gaat ervan uit dat de backup schijf is aangesloten en gemount. Na de fatsoenshalve verplichte vraag om de backup te starten wordt met "do shell script" aangegeven dat de Unix shell een script moet uitvoeren. In dit geval bestaat dit script uit een enkel commando dat meteen tussen quotes wordt meegegeven.

-- vragen of backup mag
display dialog "Wilt U een reservekopie maken? " & "" buttons {"Nee", "Ja"} with icon caution with title "Reservekopie" default button "Ja"
if button returned of result = "Ja" then
    display dialog ¬
        "Reservekopie bezig

Dit kan enkele minuten duren." with icon note buttons {"OK"} with title "Backup" giving up after 5
    -- kopie starten
    do shell script ¬
        "rsync -aE ~/downloads /Volumes/MYSTICK/haven > ~/foutjes.txt || echo -n"
   
    -- einde backup aankondigen
    display dialog ¬
        "Backup completed
Do you want to see the log?" with icon note buttons {"No", "Yes"} with title "Backup" default button "No"
    if button returned of result = "Yes" then
        tell application "Finder" to open file "foutjes.txt" of home
    end if
end if

Het echte werk wordt gedaan door het rsync commando dat midden in het script staat geparkeerd. Hij krijgt de opdracht om de map downloads in de home directory te kopieren naar de map haven op de schijf MYSTICK (bijv. een USB stick).
Waarom zou je zo'n omslachtig script gebruiken als je ook de map in een keer naar de usb stick kunt slepen? Omdat je in principe een backup periodiek zou willen uitvoeren (bijv. maandelijks). De eerste keer wordt domweg de volledige inhoud gekopieerd, iedere volgende keer worden alleen de nieuwe items in de folder gekopieerd en zal een backup niet meer zoveel tijd in beslag nemen. Dit kan gebruikt worden om een kopie van je volledige home directory op een backup medium te zetten zonder dat je elke maand je volledige mediaverzameling opnieuw moet kopieren.
Waarom open ik niet gewoon een Terminal venster en typ ik het rsync command daarin? Omdat je een gebruiker dit typwerk wilt besparen.


terug naar begin

Links

Zoals beloofd nog enkele nuttige links:

Mac OS X Automation. Erg nuttige site, die beginners op weg helpt met een eerste kennismaking met Applescript.
MacScripter. Site met veel voorbeeldscripts, vrij te downloaden en voor diverse toepassingen.
Applescript.nl. Nederlandse site over Applescript documentatie en cursussen.

Meer weten? Ga naar de Apple site.