Fischer-Bayern.de
Letztes Update: 12.01.2005 | 1:11:40 Uhr
Parent Folder 
Peter Fischer

Es hat sich gezeigt, dass immer wieder unklar ist, wie man per Skript einen übergeordneten Ordner (parent Folder) ansprechen kann. Deshalb möchte ich hier einmal einige Möglichkeiten aufzeigen.

Anwendungsmöglichkeiten gibt es ja sehr viele dafür. Angenommen Sie haben ein Skript, das auf verschiedene Textdateien zugreift. Ihr Skript befindet sich in einem Ordner - nennen wir ihn mal "Projektordner". In diesem Projektordner befindet sich ebenfalls ein Ordner namens "Data", der die Textdateien enthält.

In ihrem Skript könnte nun folgende Zeile stehen:

set StoredPath to (path to me) as string

Wenn diese Zeile im Skripteditor ausgeführt wird, erhalten Sie eine Pfadangabe zum Skripteditor, z.B.:

"Festplatte:AppleScript:Skripteditor"

Sobald das Skript als Applet gesichert wird, verweist die Pfadangabe natürlich auf das Skript selbst:

"Festplatte:Dokumente:Scripts:Projektordner:MeinSkript"

Von dieser Pfadangabe ausgehend kann man nun auf die Textdateien zugreifen. Die Pfadangabe ist aber zu lang. Wir brauchen sie ja nur bis zum Projektordner, um dann die entsprechenden Ergänzungen anzuhängen. Der Vorteil dabei ist, dass es egal ist, wo der Projektordner abgelegt wird.

Jetzt sind wir auch endlich beim Thema ;-)

Eine sehr kurze Möglichkeit, den parent folder zu ermitteln, wäre wohl diese:

set StoredPath to (path to me) as string


tell application "Finder" set theFolder to (container of item StoredPath) as text end tell

StoredPath könnte dabei ebenso gut eine Pfadangabe zu einem Ordner enthalten.

Es geht noch kürzer:

set ParentFolder to ":" as alias

Diese Zeile führt, wenn das Skript im Skripteditor ausgeführt wird, zum Ordner der den Skripteditor enthält. Steht die Zeile in einem Applet, verweist das Ergebnis auf den Parent Folder des Applets.

So kann man auch mehrere Ordnerhierarchien aufwärts wandern:

set Container_of_ParentFolder to "::" as alias

Für ältere System- bzw. AppleScript-Versionen empfiehlt sich jedoch oft eine andere Vorgehensweise.

Apple selbst bietet einen Handler, der jedoch nur funktioniert, wenn der Ausgangspfad auf eine Datei verweist - bei Ordnern klappt es nicht:

on extract_parent_folder_path_from(this_filepath)
   set this_filepath to this_filepath as text
   set x to the offset of ":" in ¬
      (the reverse of every character of this_filepath) as string
   set the parent_folder_path to ¬
      (characters 1 thru -(x) of this_filepath) as text
   return the parent_folder_path
end extract_parent_folder_path_from

Hierbei wird die Pfadangabe (als Text) zunächst umgekehrt und die Position des ersten Doppelpunktes gesucht. Diese Position wird in der Variablen x gespeichert. Anschließend wird der Pfad erneut ausgegeben vom ersten Zeichen bis einschließlich -(x). -(x) bewirkt dabei, dass die in x gespeicherte Anzahl von Zeichen vom Ende der Pfadangabe gezählt werden. Deshalb funktioniert dieser Handler auch nur mit Pfadangaben zu Dateien. Bei einem Ordner wäre ja das letzte Zeichen ein Doppelpunkt. Da die Pfadangabe bis einschließlich diesem Zeichen wieder ausgegeben wird, hätte man gar nichts damit bewirkt.

Ich persönlich bevorzuge folgende Methode:

set StoredPath to (path to me) as string

set oldDelims to AppleScript's text item delimiters
set AppleScript's text item delimiters to ":"
set itemCount to (count text items of StoredPath)
set lastItem to the last text item of StoredPath
if lastItem = "" then
   set itemCount to itemCount - 2 -- bei Pfad zu einem Ordner 
else
   set itemCount to itemCount - 1 -- bei Pfad zu einer Datei
end if
set EventPath to ¬
   text 1 thru text item itemCount of StoredPath & ":"
set AppleScript's text item delimiters to oldDelims

Diese Methode benutzt die Texttrennzeichen (Text Item Delimiters). Bei text item delimiters handelt es sich um eine reservierte Variable von AppleScript. Vorbelegt ist diese Variable mit "" - also nichts. Das führt z.B. bei der Ausgabe von Listen als Text zu folgendem Ergebnis:

get {"Peter", "Fischer", "ScriptMyMac.de"} as text

--> "PeterFischerScriptMyMac.de"

Diese Texttrennzeichen können jedoch abgeändert werden, was in unserem Fall ganz nützlich ist. Man sollte dabei die originalen Trennzeichen aber zuerst sichern und am Ende des Skripts wieder zuweisen. Sonst werden die geänderten Trennzeichen bis zum nächsten Neustart beibehalten.

Da in einer Pfadangabe die einzelnen Ordnerhierarchien durch Doppelpunkt getrennt werden, bietet es sich an, den Doppelpunkt als Texttrennzeichen zu verwenden.

Im Beispielskript werden zunächst die alten Trennzeichen in die Variable oldDelims gesichert.

set oldDelims to AppleScript's text item delimiters

Dann wird der Doppelpunkt als Trennzeichen deklariert.

set AppleScript's text item delimiters to ":"

Als nächsten Schritt zählt das Skript die Anzahl der Textelemente.

set itemCount to (count text items of StoredPath)

Nun habe ich im Skript eine Bedingung eingebaut, so dass man das Skript sowohl mit einer Pfadangabe zu einem Ordner, als auch mit einem Pfad einer Datei füttern kann.

set lastItem to the last text item of StoredPath
if lastItem = "" then
   set itemCount to itemCount - 2 -- bei Pfad zu einem Ordner 
else
   set itemCount to itemCount - 1 -- bei Pfad zu einer Datei
end if

Übergibt man dem Skript einen Ordnerpfad, ist das letzte Zeichen ein Doppelpunkt. Da dieser jetzt ja als Trennzeichen fungiert, ist sich AppleScript sicher, dass nach diesem Doppelpunkt ein Textelement sein muss. Es ist einfach ein leeres Textelement.

Von der Anzahl der Textelemente werden nun im Falle eines Ordnerpfades die letzten beiden Textelemente abgezogen (das leere und das letzte wirkliche Textelement). Handelt es sich um einen Dateipfad wird nur das letzte Element abgezogen.

Jetzt wird der Pfad erneut zusammen gesetzt. Vom ersten Element bis zum Textelement mit der ermittelten (verkürzten) Zahl. Da bei dieser Methode am Ende immer ein Text steht, müssen wir abschließend einen Doppelpunkt hinzufügen um einen vollständigen Pfad zum übergeordneten Ordner zu erhalten.

set EventPath to ¬
   text 1 thru text item itemCount of StoredPath & ":"

Abschließend werden die ursprünglichen Trennzeichen wieder hergestellt.

set AppleScript's text item delimiters to oldDelims



 

 

Workshop



snow@fischer-bayern.de

Ebene 1