Fischer-Bayern.de
Letztes Update: 12.01.2005 | 1:12:03 Uhr
OSAXen installieren 
Peter Fischer


Wollen Sie erst nochmal die Seite "Scripting Additions prüfen" nachlesen?

Im vorigen Artikel haben wir schon ziemlich umfangreich geprüft, ob eine bestimmte Scripting Addition bereits installiert ist. Dabei wurden jedoch einige, durchaus denkbare Fälle noch nicht beachtet.

Was ist, wenn z.B. eine ältere Version installiert ist? Die Überprüfung nach Name und einer einzelnen Funktion genügt hier nicht. Was, wenn der Name der OSAX die Versionsnummer beinhaltet? In dem Fall werden womöglich mehrere Versionen installiert.

Ich habe mir darüber Gedanken gemacht und ein Skript geschrieben, das auch Duplikate, ältere und neuere Versionen erkennt und darauf entsprechend reagiert. Das ganze Skript kann ohne große Anpassungen in andere Projekte integriert werden. Man kann es aber auch als eigenständiges Skript zur Installation von OSAXen verwenden.

Das folgende Skript habe ich so ausführlich wie möglich kommentiert. Wenn Sie es testen wollen, legen Sie einen Ordner mit den zu installierenden OSAXen in das gleiche Verzeichnis wie dieses Skript. Falls Sie es mit dem Skripteditor testen, muss dieser Ordner im gleichen Verzeichnis wie Skripteditor liegen.

Das Skript ist in dieser Form noch NICHT für OS X geeignet, ich habe jedoch vor, demnächst die entsprechende Version zur Verfügung zu stellen.

Wenn Sie dieses Skript in Ihren eigenen Projekten verwenden wollen, bitte ich um Erwähnung in den Credits. - Mehr nicht.

Auf der Download-Seite finden Sie eine deutsche und eine englische Version des Skripts.





(* Dieses Skript prüft, ob gewisse Scripting Additions
installiert und funktionsbereit sind. 
© 2002 by Fischer-Bayern
http://fischer-bayern.de/applescript/
snow@fischer-bayern.de
*)
property dPfad : ((path to scripting additions folder) as string)
-- Die folgenden 5 Properties müssen angepasst werden
-- wenn eine andere OSAX geprüft werden soll

---------------------------------------------------
-- ***********   IN DIESEM BEREICH ANPASSEN   *************

-- 1. VN_List: Versionsnummer als Text
property VN_List : {"2.0.1", "1.8.5", "2.1.1"}
--  2. ON_List: Name ohne Versionsnummer angeben
property ON_List : {"Tanaka's OSAX", "Satimage", "Jon’s Commands"}
(* 3. has_Version: enthält der Name die Versionsnummer? 
Wenn ja -> true, sonst -> false  *)
property has_Version : {true, false, false}
(*4. PathToStuff: Name des Ordners, der die OSAXen enthält
 WICHTIG:  Den abschließenden Doppelpunkt nicht vergessen
 Wenn sich der Ordner in einem weiteren Unterordner befindet, sollte dies
in etwa so aussehen: "Zuerst installieren:OSAXen:"*)
property PathToStuff : "OSAXen:"
--5. tC_list:  Jeweils ein Befehl (möglichst ohne Außenwirkung) jeder OSAX
property tC_list : {MT Digit String 123 digit 2, uppercase "abc", the ticks}

-- ***********   KEINE WEITEREN ANPASSUNGEN NöTIG   ********
---------------------------------------------------



global OsaxName, VN, tCom
global TestFlag, DlogFlag, installFlag, NameList, AltVers
global aktVers, NeuVers, Meldung, tIcon, OSAXpfad, FullName

on run
   (* Diesen Handler-Aufruf können Sie beliebig in Ihrem Skript platzieren.
   Hier wird die ganze Prozedur gestartet. *)
   initMe()
end run

on initMe() -- zuerst mal grundlegende Einstellungen
   -- Der Ordner, der dieses Skript enthält wird festgestell
   tell application "Finder"
      set aktuellerOrdner to (container of (path to me)) as string
   end tell
   -- die Anzahl der zu prüfenden OSAXen wird ermittelt   
   set tCount to number of items in ON_List
   -- die folgende Schleife sorgt dafür, dass die Prozedur für alle
   -- eingetragenen OSAXen nacheinander erfolgt.   
   repeat with i from 1 to tCount
      set VN to item i of VN_List
      set versFlag to item i of has_Version
      set OsaxName to item i of ON_List
      (* an bestimmten Stellen im Skript wird der Name evtl. inkl.
 der Versionsnummer benötigt. Damit die Variable "OsaxName" ihren
Wert behält, wird hier die neue Variable "FullName" definiert.   *)
      if versFlag = true then
         set FullName to OsaxName & " " & (item i of VN_List)
      else
         set FullName to OsaxName
      end if
      set tCom to item i of tC_list
      
      (* Der Ordner "Osaxen" sollte im gleichen Verzeichnis
 wie dieses Skript liegen. Zum Testen mit dem Skripteditor,
 muss er im gleichen Ordner wie Skripteditor liegen *)
      set SubPfad to (PathToStuff & FullName) as string
      set OSAXpfad to (aktuellerOrdner & SubPfad) as string
      prepareMode()
      Auswertung()
      if DlogFlag = true then
         display dialog Meldung buttons {"OK"} ¬
            default button 1 with icon tIcon ¬
            giving up after 15
      end if
      if installFlag = true then
         DoInstall()
      end if
   end repeat
end initMe

on prepareMode()
   -- Initialisierung der Flags
   set TestFlag to false -- Flag für den Funktionstest
   set DlogFlag to true
   set tIcon to note
   set installFlag to false
   -- Initialisierung der Listen 
   set NameList to {} --  Namen aller Suchergebnisse
   set AltVers to {} -- älter als gefordert
   set aktVers to {} -- gesuchte Version
   set NeuVers to {} -- neuer als gefordert
   
   tell application "Finder"
      -- zuerst mal schauen, ob überhaupt was da ist
      set tFiles to ¬
         (every file of folder dPfad whose name contains OsaxName) as list
      set tCount to (number of items in tFiles)
      if tCount = 0 then
         -- die OSAX ist nicht vorhanden
         set Meldung to ¬
            "Die Scripting Addition " & FullName & ¬
            " muss erst installiert werden."
      else --  mindestens 1 Version ist vorhanden
         repeat with oneFile in tFiles
            my CheckVers(oneFile)
            (* Im Handler "CheckVers" werden die gefundenen Additions auf ihre
Versionsnummer hin überprüft. *)
         end repeat
      end if
   end tell
end prepareMode

-- Handler zur Prüfung der Versionsnummer
on CheckVers(tOsax)
   set tOsax to tOsax as alias
   set dInfo to info for tOsax
   set tVers to short version of dInfo -- Versionsnummer
   set tName to name of dInfo -- Name der OSAX
   if tVers < VN then
      -- ältere Version(en) vorhanden. Die entsprechende
      -- Liste wird aufgefüllt   
      set the end of AltVers to tName
   else if tVers = VN then
      -- Gesuchte Version(en) vorhanden. Die entsprechende
      -- Liste wird aufgefüllt   
      set the end of aktVers to tName
   else if tVers > VN then
      -- Neuere Version(en) vorhanden. Die entsprechende
      -- Liste wird aufgefüllt   
      set the end of NeuVers to tName
   end if
end CheckVers

-- Handler, der feststellt, ob ein Neustart erforderlich ist.
on CheckFunk()
   try
      tCom
      set TestFlag to true -- Funktionstest bestanden
   end try
end CheckFunk


-- Im folgenden Handler werden die Listen ausgewertet und entsprechende
-- Meldungen für die Dialoge erstellt
on Auswertung()
   -- Die Einträge in den einzelnen Listen werden jeweils gezählt
   set oldV to number of items in AltVers
   set curV to number of items in aktVers
   set newV to number of items in NeuVers
   -- falls eine oder mehrere neuere Versionen vorhanden sind
   if newV > 0 then
      if newV > 1 then
         set VersText to "neuere"
         removeDup(NeuVers, VersText)
         set DlogFlag to false
      end if
      set Meldung to ¬
         "Es ist bereits eine neuere Version von \"" & OsaxName & ¬
         "\" installiert." & return & "Eine Installation ist daher nicht notwendig."
      if oldV is not 0 or curV is not 0 then
         removeOld() -- alte Versionen werden entfernt
         removeCur() -- gesuchte Versionen werden entfernt, da aktuellere vorhanden
      end if
      -- falls eine oder mehrere aktuelle Versionen vorhanden sind   
   else if curV > 0 then
      if curV > 1 then
         set VersText to "aktuelle"
         removeDup(aktVers, VersText)
         set DlogFlag to false
      end if
      set Meldung to ¬
         "Es ist bereits die aktuelle Version von \"" & OsaxName & ¬
         "\" installiert." & return & "Eine Installation ist daher nicht notwendig."
      if oldV is not 0 then
         removeOld()
      end if
      -- nur ältere Version(en) vorhanden
   else if oldV > 0 then
      if oldV > 1 then
         set txtpart1 to "Es sind "
         set txtpart2 to "Sie werden durch die aktuelle Version ersetzt."
      else
         set txtpart1 to "Es ist "
         set txtpart2 to "Sie wird durch die aktuelle Version ersetzt."
      end if
      set Meldung to txtpart1 & oldV & " ältere Version von \"" & ¬
         OsaxName & "\" installiert." & return & txtpart2
      set tIcon to caution
      removeOld()
      set installFlag to true -- Installation der neueren Version ist notwendig
   else
      set Meldung to "Die Scripting Addition \"" & FullName & ¬
         "\" muss erst installiert werden."
      set tIcon to stop
      set installFlag to true -- Installation der neueren Version ist notwendig
   end if
end Auswertung

-- Handler zum Entfernen der älteren Version(en)
on removeOld()
   tell application "Finder"
      try
         repeat with oneFile in AltVers
            set oneFile to (dPfad & oneFile) as alias
            move oneFile to trash
         end repeat
      end try
   end tell
end removeOld

-- Handler zum Entfernen der gesuchten Version(en)
on removeCur()
   tell application "Finder"
      try
         repeat with oneFile in aktVers
            set oneFile to (dPfad & oneFile) as alias
            move oneFile to trash
         end repeat
      end try
   end tell
end removeCur

-- Handler zum Entfernen von Duplikaten einer Version
on removeDup(tList, VersText)
   set FinalOsax to choose from list tList with prompt "Es sind mehrere " & ¬
      VersText & " Versionen von \"" & OsaxName & "\" installiert." & return & ¬
      "Welche möchten Sie behalten?"
   if FinalOsax is not false then -- false ist, wenn "Abbrechen" gedrückt wurde
      set FinalOsax to item 1 of FinalOsax -- war zuvor eine Liste
      
      repeat with oneFile in tList
         set fName to (dPfad & FinalOsax) as alias
         
         set oneFile to (dPfad & oneFile) as alias
         if fName = oneFile then
         else
            tell application "Finder"
               move oneFile to trash
            end tell
         end if
      end repeat
   else
      removeDup(tList, VersText)
   end if
end removeDup

--Handler zur Installation der benötigten OSAXen
on DoInstall()
   tell application "Finder"
      move alias OSAXpfad to folder dPfad
      my CheckFunk() -- Prüfung, ob Neustart nötig ist
      if TestFlag = true then
         display dialog ¬
            "Die Scripting Addition \"" & FullName & ¬
            "\" wurde erfolgreich installiert." buttons ¬
            {"OK"} default button 1 with icon note giving up after 15
      else
         display dialog ¬
            "Die Scripting Addition \"" & FullName & ¬
            "\" wurde installiert, es ist jedoch ein Neustart erforderlich." buttons ¬
            {"OK"} default button 1 with icon note giving up after 15
      end if
   end tell
end DoInstall



Tipps zum Testen:

Legen Sie Kopien von den zu testenden OSAXen an und ändern Sie mit ResEdit die Versionsnummer (short version string). So können Sie sehen, was passiert, wenn ältere, neuere und/oder doppelte Versionen einer OSAX im Scripting Additions Ordner existieren.

Beispiel:

Tanaka's osax 1.9.5
Tanaka's osax 1.9.5 Kopie
Tanaka's osax 2.0
Tanaka's osax 2.0 Kopie
Tanaka's osax 2.0.1
Tanaka's osax 2.0.2
Tanaka's osax 2.0.2 Kopie
Tanaka's osax dummy 2.0.2

Die Version 2.0.1 dieser OSAX ist übrigens derzeit (Stand: 01.09.2002) aktuell.




 

 

Workshop



snow@fischer-bayern.de

Ebene 1