21.11 Nützliche Beispiele 

Die folgenden Beispiele sind aus dem Leben vieler Anwender gegriffen und zeigen auf, wie sinnvoll man AppleScript einsetzen kann, um umfangreichere Aufgaben effizient zu automatisieren. Sie können die folgenden Skripten einfach auf Ihrem System selbst anwenden. In den Erklärungen nehmen wir Skript für Skript in seine Bestandteile auseinander, damit Sie nachvollziehen können, was darin genau passiert.
21.11.1 Automatisches Backup 

Aufgabenstellung ist ein Skript, das einen ausgewählten Ordner in das Verzeichnis Backup auf dem Volume Daten kopiert. Dabei soll das Skript einen Ordner erstellen, dessen Name dem jeweils aktuellen Datum des Backups entspricht:
set Ordner to choose folder set Datum to Date string of (current date) tell application "Finder" set Ziel to "Daten:Backup:" & Datum if not (exists folder Ziel) then make new folder at "Daten:Backup" set name of folder "Daten:Backup:Neuer Ordner" to Datum end if copy folder Ordner to folder Ziel end tell
Listing 21.1 Beispiel für ein Backup-Skript
Dieses Skript fragt zuerst nach dem Verzeichnis, das in den Backup-Ordner kopiert werden soll.
In den Anweisungen an den Finder wird zuerst mit der Variablen Ziel das Verzeichnis definiert, in das die Daten kopiert werden sollen. Hierbei wird die schon feststehende Pfadangabe Daten:Backup mit dem ausgelesenen Datum zu einer Zeichenkette kombiniert. Damit der Ordner korrekt in das Verzeichnis kopiert werden kann, muss dieses zunächst existieren. Umgekehrt würde der Versuch, ein bereits existierendes Verzeichnis zu erstellen, ebenfalls zum Abbruch eines Skriptes führen. Man könnte sich mit der Anweisung try behelfen, indes ist es einfacher, das Verzeichnis auf seine Existenz hin zu prüfen. So es nicht existiert, soll es erstellt werden. Wenn Sie bei einer Bedingung mit der Ausgabe eines Befehls arbeiten möchten, in diesem Fall exists, müssen Sie ihn einklammern. Dann wird ein neuer Ordner erstellt.
Da nun sichergestellt ist, dass das Zielverzeichnis auch wirklich existiert, wird zuletzt der Ausgangsordner dorthin kopiert. Wenn Sie statt mit einem Ordner nur mit einer Datei arbeiten möchten, dann müssen Sie die Angabe folder am Anfang und am Ende des Skriptes einfach in file umwandeln, wobei der Typ folder als Ziel erhalten bleibt.
| Datum auslesen | Damit ein Ordner erzeugt werden kann, dessen Name dem aktuellen Datum des Backups entspricht, muss dieses zunächst ausgelesen werden. Da eine vollständige Datumsangabe inklusive Uhrzeit das Format Montag, 1. März 2004 12:49:29 Uhr hat, würde dies zu Problemen führen: Die in der Uhrzeit verwendeten Doppelpunkte würden bei der vorzunehmenden Umbenennung eines Ordners als Trennzeichen zwischen mehreren untergeordneten Ordnern interpretiert werden und zum Abbruch des Skriptes führen. Aus diesem Grund beschränken wir uns in diesem Skript auf den Text-Teil des Datums. |
| Ordner umbennen | Da der neue Ordner standardmäßig die entsprechende Bezeichnung Neuer Ordner trägt, muss seinem Attribut name noch der Wert der Variablen Datum zugewiesen werden. |
21.11.2 Ordner synchronisieren 

Wenn Sie sowohl mit einem Powerbook als auch mit einem Desktop-Rechner arbeiten, wird es vorkommen, dass Sie den einen oder anderen Ordner zwischen den Rechnern synchronisieren möchten. Es kann dabei recht lästig sein, sich jedes Mal im Finder mit der Listendarstellung das Inhaltsverzeichnis der einzelnen Ordner anzuschauen und dann manuell die geänderten Dateien auf den Desktop-Rechner zu übertragen. Unter anderem laufen Sie dabei Gefahr, Dateien, die auf dem Desktop-Rechner auf dem neuesten Stand sind, ungewollt zu überschreiben. Ein Skript kann Ihnen dabei einige Mühe sparen, denn AppleScript erlaubt es auch, das Änderungsdatum von Dateien einzulesen, zu vergleichen und davon ausgehend weitere Aktionen auszuführen. Mit dem folgenden Skript erhalten Sie eine komfortable Synchronisationsfunktion:
set Quellordner to choose folder with prompt "Welcher Quellordner?" set Zielordner to choose folder with prompt "Welcher Zielordner?" set Datum to (current date) set Quelldateien to list folder Quellordner without invisibles set Zieldateien to list folder Zielordner without invisibles tell application "Finder" repeat with Datei in Quelldateien set Quelldatei to (Quellordner as string) & Datei set Zieldatei to (Zielordner as string) & Datei if not (Zieldateien contains Datei) then copy file Quelldatei to folder Zielordner else set Quelldatum to modification date in (info for file Quelldatei) set Zieldatum to modification date in (info for file Zieldatei) if Zieldatum comes before Quelldatum then delete file Zieldatei copy file Quelldatei to folder Zielordner end if end if end repeat end tell
Listing 21.2 Beispiel für ein Skript, um Ordner zu synchronisieren
Dieses lange Skript sieht auf den ersten Blick komplizierter aus, als es eigentlich ist. Die ersten zwei Schritte bestehen darin, den Quell- und den Zielordner zu erfragen sowie deren Inhalt jeweils in eine eigene Liste einzulesen. Anschließend wird der Finder angesprochen und eine Schleife erzeugt. Diese soll so oft durchlaufen werden, wie die Liste des Ausgangsordners Einträge – ergo Dateien – besitzt.
Der erste Schritt innerhalb der Schleife besteht nun darin, dass die für den jeweiligen Durchlauf aktuellen Dateien konstruiert werden. Wenn Sie den Inhalt eines Verzeichnisses in einer Liste speichern, werden dort nur die Dateinamen hinterlegt, nicht jedoch die Pfadangaben. Um wie in unserem Beispiel das Änderungsdatum einer Datei zu ermitteln, wird diese jedoch benötigt. Mit dem Befehl
set Quelldatei to (Quellordner as string) & Datei
wird eine Pfadangabe eingelesen.
Klammern | Hierbei mag die Klammer und der Zusatz as string überraschen. Der Sinn der Klammern besteht in diesem Fall darin, dass automatisch der Rückgabewert der eingeklammerten Anweisung verwendet werden soll. Das Äquivalent wäre
set Quellordnerstring to Quellordner as string
Sie können sich aber mit der obigen Lösung den Umweg über die zusätzliche Variable sparen. Die Umwandlung, die wir hier vornehmen, ist notwendig, da der mit choose folder ausgewählte Ordner nicht als einfacher Text, sondern als ein Dateiobjekt zur Verfügung steht, das in AppleScript auch als alias bezeichnet wird.
Stehen die Ausgangs- und die vermutliche Zieldatei fest, wird zuerst geprüft, ob es die Zieldatei bereits gibt. Ist dies nicht der Fall, wird die Ausgangsdatei gleich ins Zielverzeichnis kopiert. Wenn bereits eine gleich lautende Datei im Zielverzeichnis existiert, sie also in der Liste der Dateien im Zielordner vorkommt, muss geprüft werden, welche Datei die aktuellere Fassung ist. Mit dem Befehl
set Quelldatum to modification date in (info for file Quelldatei)
wird eine Variable vom Typ date erzeugt, die das Änderungsdatum der Datei beinhaltet. Hierbei wird wieder auf die Methode mit der Klammerung zurückgegriffen. Die Rückgabe des Befehls info for ist eine Liste mit den unterschiedlichsten Einträgen, dementsprechend muss mit dem Aufruf von modification date in gezielt der Wert des Änderungsdatums ausgelesen werden.
Datum vergleichen | Nun gilt es, die Daten zu vergleichen. Wenn das Änderungsdatum der Zieldatei vor dem der Ausgangsdatei liegt, was mit der Anweisung comes before überprüft wird, dann wird die gleichnamige Datei im Zielordner gelöscht und wieder ein Kopiervorgang gestartet.
Unser Skript arbeitet in der oben stehenden Fassung nur in einer Richtung. Um die Ordner in beide Richtungen miteinander abzugleichen, können Sie es ein zweites Mal aufrufen und Ausgangs- und Zielordner vertauschen. Eine Ergänzung könnte auch darin bestehen, dass Sie sowohl prüfen, ob der Inhalt des Zielverzeichnisses dem des Ausgangsverzeichnisses entspricht, als auch, ob die Zieldatei jünger als die Ausgangsdatei ist, und dann Letztere löschen.
21.11.3 FileMaker und das Adressbuch 

Fast alle von Apple mitgelieferten Applikationen können über AppleScript angesprochen werden. So auch das Adressbuch, bei dem AppleScript Zugriff auf alle darin gespeicherten Kontakte und Adressen erhalten kann. Da das Adressbuch von vielen Programmen, wie etwa Mail, verwendet wird, wäre eine Interaktion mit einer Datenbank nützlich. Für unser Beispiel setzen wir den Fall, dass wir all unsere Adressen in der Datenbank FileMaker speichern und einige der dort gespeicherten Datensätze automatisch in das Adressbuch von Mac OS X übertragen möchten. Mit einem Skript möchten wir bewirken, dass die Adressbasis von FileMaker mit Hilfe des Adressbuchs auch anderen Programmen zur Verfügung gestellt wird.
Das hier vorgestellte Beispiel geht davon aus, dass die Einträge der FileMaker-Datenbank in eine Gruppe des Adressbuchs einsortiert werden sollen:
tell application "Address Book" if not (exists group "FileMaker") then make new group with properties {name:"FileMaker"} end if end tell tell application "FileMaker Pro" open "Brain:Users:kai:Desktop:Adressen.fp5" set Anzahl to count records go to record 1 repeat with Zaehler from 1 to Anzahl set Vorname to cell "Vorname" of record Zaehler set Nachname to cell "Nachname" of record Zaehler set Strasse to cell "Straße" of record Zaehler set PLZ to cell "PLZ" of record Zaehler set Ort to cell "Ort" of record Zaehler tell application "Address Book" set Eintrag to (make new person) add Eintrag to group "Filemaker" tell Eintrag set last name to Nachname set first name to Vorname make new address with properties {street:Strasse, zip:PLZ, city:Ort} end tell end tell end repeat end tell
In diesem Skript wird als erstes dem Adressbuch mitgeteilt, dass eine neue Gruppe FileMaker erstellt werden soll, sofern diese noch nicht existiert. Die Anweisung with properties {name:"FileMaker"} gibt der gegebenenfalls zu erstellenden Gruppe gleich den Namen FileMaker, da schon beim Erstellen auf eine der möglichen Eigenschaften Bezug genommen wird.
| Speichern mit ID | Intern speichert und verwaltet das Programm die Einträge mit eigenen IDs wie person id "DAC54053 – 6C3D-11D8 – 8FAE-000502E1B154:ABPerson". Mit Hilfe von set wird die ID der neu erstellten Person gleich in einer Variablen gespeichert und diese anschließend der Gruppe FileMaker hinzugefügt. |
Als nächstes erteilen wir dem Programm FileMaker, das mit seinem vollständigen Namen FileMaker Pro angesprochen werden muss, den Befehl, die Adressdatei zu öffnen.
Mit count records wird die Anzahl der in der Datenbank vorhandenen Datensätze ermittelt und mit go to record 1 zum ersten Datensatz gesprungen. Die Schleife wird so oft durchlaufen, wie Einträge vorhanden sind. Das Skript nimmt an, dass die Datenfelder (cell) innerhalb der Datenbank die Bezeichnungen Vorname, Nachname, Straße, PLZ und Ort tragen. Diese werden ausgelesen und in Variablen des Skripts gespeichert. Der Zusatz of record Zaehler stellt sicher, dass jeweils alle Datensätze nacheinander durchlaufen werden und nicht einfach beim ersten Halt gemacht wird.
Sind alle benötigten Variablen ausgelesen, gilt es, sie in das Adressbuch zu importieren. Zuerst muss dafür mit set Eintrag to (make new person) eine neue Person erstellt werden.
| Weitere FileMaker-Felder | Das so programmierte Skript arbeitet nun die FileMaker-Datenbank ab und fügt nacheinander alle vorhandenen Datensätze in das Adressbuch ein. Wenn in der FileMaker-Datenbank noch weitere Felder wie zum Beispiel eine Fax-Nummer definiert wurden, so müssen Sie das Skript um die entsprechenden Felder und Properties ergänzen. |
Die Zuweisung des Vor- und Nachnamens folgt dem üblichen Schema. Mit make new address with properties {street:Strasse, zip:PLZ, city:Ort} wird der Eintrag, der die Adresse darstellt, erzeugt. Beim Adressbuch ist es möglich, dass ein Eintrag oder eine Person über mehrere Adressen verfügt. Bei den Adressdaten handelt es sich nicht um die Eigenschaft name, sondern um ein der Person zugehöriges Objekt. Selbstverständlich wäre es auch möglich, zuerst nur das neue Adressobjekt zu erzeugen und dann anschließend mehrmals mit set die einzelnen Daten wie Straße und Ort einzufügen.




Jetzt bestellen


