AppleScript asynchron ausführen

Wenn ein AppleScript aus FileMaker heraus gestartet wird, wartet FileMaker solange, bis das AppleScript fertig ausgeführt wurde und setzt dann die eigene Script-Ausführung fort. In vielen Fällen ist das erwünscht, wenn z.B. auf ein bestimmtes Script-Ergebnis gewartet werden muss, welches anschließend weiter verarbeitet werden soll.

Problem: Script-Aufruf blockiert FileMaker

Manchmal ist es jedoch unnötig oder sogar hinderlich, wenn der Script-Ablauf in FileMaker durch das gestartete AppleScript blockiert wird. In diesen Fällen wäre es hilfreich, wenn man das AppleScript “asynchron” starten könnte, so dass beide Scripte parallel abgearbeitet werden können. In diesem Fall kann das FileMaker-Script bereits enden, während das AppleScript noch weiter läuft.

Mit den Bordmitteln von FileMaker lässt sich dieses Verhalten nicht ohne weiteres erreichen. Der Befehl “AppleScript ausführen” kennt keine Option für die asynchrone Ausführung.

Machbar wäre dies allerdings mit dem Befehl “Event senden”, welcher wahlweise die Option zum Abschalten anbietet “Beendigung des Events abwarten”. Leider hat Apple in den neueren OSX Versionen das Dateiformat der AppleScript-Dateien in sogannte “Pakete” geändert. Dies sind Ordner, welche weitere Datei-Ressourcen enthalten, im Finder jedoch als ausführbare Dateien angezeigt werden. Speichert man ein AppleScript als “Programm” ab, so wird der gespeicherte Paket-Ordner – obwohl richtig dargestellt – im Auswahl-Dialog des FileMaker Befehls “Event senden” nicht mehr erkannt. Hier handelt es sich offensichtlich um einen Bug in FileMaker (siehe FileMaker Forum).

Event senden Optionen

Workaround

Mit einem kleinen Trick ist allerdings möglich, das gewünschte Verhalten trotzdem zu erreichen. Der Ablauf gestaltet sich dann folgendermassen:

Wir bauen uns ein Starter-Script innerhalb von FileMaker mit Hilfe des Befehls “AppleScript ausführen”. Das Starter-Script übergibt die Kontrolle an ein Shell-Script, welches das AppleScript über die Systemfunktion ‘osascript’ ausführt. Indem die Standard-Ausgabe auf “DevNull” umgeleitet wird, verhält sich das gestartete Script wie ein Hintergrundprozess!
Einzige Einschränkung: Als Hintergrundprozess darf das Script keine GUI-Interaktionen erzeugen. Dialoge müssen daher z.B. an den Finder delegiert werden (siehe Beispiel-Datei).

Hier nochmal der Ablauf schematisch:

  1. per ‘do shell script’ wird ein Shell-Sript gestartet
  2. per ‘osascript’ wird eine externe AppleScript-Datei ausgeführt
  3. mit dem Zusatz ‘&>/dev/null&’ (Standard-Out umleiten auf DevNull) verhält sich der Script-Aufruf wie ein Hintergrund-Prozess

So sieht der fertige Befehlsaufruf des Starter-Scripts aus:

do shell script "osascript " & the quoted form of(POSIX path of "/Users/myaccount/Desktop/Test.scpt") & " &>/dev/null&"

So kommt das Kommando in der Unix-Befehlszeile an:

osascript "/Users/myaccount/Desktop/Test.scpt" &>/dev/null&

Beispiel-Datei

Nachfolgend gibt es eine Beispiel-Datei zum Download, welche das unterschiedliche Verhalten (synchron/asynchron) verdeutlicht. Das beigefügte ZIP-Archiv enthält die FileMaker-Demo im Format .fp7 und .fp12 sowie eine AppleScript-Datei “Test.scpt”, welche zum Start der Demo auf den Desktop kopiert werden muss.

In der FileMaker-Beispieldatei sind zwei Scripte enthalten, die sich per Copy&Paste in eigene Anwendungen übertragen lassen:

  • AppleScript asynchron als Hintergrund-Prozess starten [Dateipfad]
  • AppleScript synchron starten mit warten auf Scriptende [Dateipfad]

Mit Hilfe des Auswahlfelds “Scriptmode” und dem Button “Demo-Script starten” in der Demo-Datei lassen sich beide Varianten testen.

AppleScript asynchron FileMaker Demo

Download Demo-Ordner:
AppleScript-asynchron.zip (25 KBytes)

weitere Infos

Hintergrund-Infos zu den verwendeten Techniken finden sich unter folgenden Links:

Hinweis: sofern auf dem Computer eine ältere Version der Adobe-Suite installiert ist, kann es bei der Verwendung des Befehls ‘osascript’ zu Fehlermeldungen wegen inkompatibler Libraries kommen. In diesem Fall sollte die aktuelle 64-Bit Version des ‘Adobe Unit Types.osax’ installiert werden (siehe Link).

Tags: ,

Kommentare sind geschlossen.