entzippen per AppleScript?!? Was für eine doofe Idee! Das geht doch ganz einfach mit einem Doppelklick!
Stimmt. Aber es gibt Workflows, in welchen man das Dekomprimieren automatisch erledigen möchte. Zum Beispiel wenn eine Mail-Message eintrifft, deren Inhalt sagt, dass eine Datei hochgeladen wurde. Eine Mail-Rule kann daraufhin ein AppleScript starten, welches die ZIP-Datei verschiebt, entzippt und den Ordner in einen bestimmten Ordner verschiebt.
Dann wird der Verantwortliche per Mail informiert, dass das Entzippen und Verschieben geklappt hat. Zusätzlich wird das Ergebnis in eine Logdatei geschrieben.
***** Für die erste Version benutzte ich unzip mit 'do shell script':
Das Entzippen funktioniert. Aber nicht ganz zufriedenstellend: 1. Zusätzlich wird ein Ordner namens "__MACOSX" erzeugt. Dieser kann mit einem Scriptbefehl entfernt werden. 2. Doch ein echtes Problem ist die Tatsache, dass der Inhalt von älteren Schriftdateien (z.B. vom 'Type 1') gelöscht wird.
***** Auf eine Anregung des Kunden hin, versuchte ich es mit dem Programm Archive Utility. Dieses Dienstprogramm ist auf jedem Mac installiert und wirkt im Hintergrund, wenn Dateien per Menü-Befehl komprimiert werden. Und es agiert auch umgekehrt, wenn ein Doppelklick auf eine Zip-Datei gemacht wird.
Die letztere Aktion kann auch per AppleScript ausgelöst werden, obwohl "Archive Utility" eigentlich nicht scriptbar ist. Dennoch reagiert es auf 'open' (und auf 'quit'):
Das ist schon alles. Weil das Programm offen bleibt, sollte es abschliessend beendet werden (dritte Zeile).
Aber Achtung: Okay, die beiden oben aufgeführten Probleme existieren nicht mehr. Doch es gibt ein neues ... Während man mit dem do-script-Befehl den Namen des entpackten Ordners (oder der Datei) zurückbekommt, ist das Ergebnis des Archive-Utility-Befehls ein unbrauchbares missing value ...
Wenn das entpackte Objekt nicht verschoben werden muss, ist das kein Problem. Aber sonst muss man den Namen erfahren können. Es reicht nicht, diesen zu "erraten", weil die Zip-Datei möglicherweise umbenannt wurde.
Die Lösung: Vor dem Entzippen eine Liste der Namen aller Objekte im selben Ordner erstellen. Und nach der Aktion erneut. Dann eine Schleife durch die Namen der zweiten Liste. Bei jedem prüfen, ob er in der ersten Liste enthalten ist. Falls nicht, ist es jener des entzippten Objekts und die Schleife kann verlassen werden.
***** Angehängt an diesen Beitrag ist das Droplet "Entzippen_01.app". Zum Gebrauch: Eine Zip-Datei (oder mehrere) auf das Icon des Droplets ziehen.
Weil: Es gibt doch einen Grund, dem "ditto" den Vorzug zu geben! :-)
Der Kunde meldete ein Problem: Eine beschädigt (wie auch immer) hochgeladene Zip-Datei (von 94.4 MB) blockierte den Workflow. "Archive Utility" zeigte einen Dialog, laut welchem es unmöglich ist, die Datei zu dekomprimieren, weil eine Datei oder ein Ordner fehlt.
Ein Doppelklick auf die Zip-Datei zeigt zuerst einen Forschrittsbalken und danach dieselbe Meldung.
Ein neuer Versuch mit dem oben geposteten "ditto"-Script ... Schon besser: Eine Fehler-Meldung nennt den Namen einer fehlenden Bild-Datei. Im Arbeitsordner liegt neben der defekten Zip-Datei der Ordner "__MACOSX", welcher die leere Ordnerstruktur enthält. Und auch der dekomprimierte Ordner, welcher vier Dateien enthält: eine ".idml", eine ".indd", eine ".pdf" sowie die übliche "Instructions.txt". Zudem auch den Ordner "Document fonts" (samt Inhalt) und den Ordner "Links" mit drei Bild-Dateien.
Als erstes habe ich einen 'try'-Wickel um den "Archive Utility"-Befehl gelegt. Keine Verbesserung: Der "on error"-Abschnitt wird ignoriert.
Dann habe ich "Archive Utility" durch das "ditto"-Script ersetzt. Damit werden die "on error"-Zeilen ausgeführt. Dem Abteilungsleiter wird per E-Mail mitgeteilt, dass die Zip-Datei "Xyz.zip" beschädigt ist. Nun noch aufräumen: Den Arbeitsordner leeren, indem die beiden Ordner und die Zip-Datei in den Papierkorb befördert werden.
bitte sehr. Allerdings ist nachträglich ein weiteres Problem aufgetaucht, welches diese Ursache hat: Beim Erzeugen der ZIP-Datei wurden mehrere Ordner (oder Dateien) ausgewählt. Das ergibt die Datei Archiv.zip.
Beim manuellen Entzippen bekommt man den Ordner Archiv. Dasselbe per Script mit Archive Utility.
Doch ditto schafft das nicht. Das Entzippen schon. Aber der Ordner Archiv wird nicht erzeugt.
An sich nicht so schlimm. Aber weil alles in einem Ordner in einen bestimmten Zielordner befördert werden muss, geht das nicht. Okay, das Script könnte einen Ordner erzeugen und alle Objekte hineinverschieben. Geht auch nicht, weil schon die nächste ZIP-Datei eingetroffen sein könnte.
Also kehrte ich zerknirscht zu Archive Utility zurück. Für das im Beitrag #5 erwähnte Problem habe ich eine Lösung gefunden.