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", "Jons 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.
|