[GastForen Programmierung/Entwicklung AppleScript Finder Datum überschreiben

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Finder Datum überschreiben

Braut2
Beiträge gesamt: 40

7. Aug 2008, 15:27
Beitrag # 1 von 9
Bewertung:
(3873 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Nach langer Zeit einmal wieder Grüsse aus Norwegen.

Habe gerade ein recht umfassened Bilderarchiv mit einem meiner Resolutions-Scripte bearbeitetet, zu denen Du, Hans, dankenswerter Weise wesentlich beigetragen hast. Dabei ist mir aufgefallen, dass ja - um mir die Arbeit zu ersparen, JPG Lagerungsoptionen manuell anzugeben - alle Finder Erstellungsdaten fur JPF Bilder mit dem "Save"-Befehl überschrieben werden. Für gewisse Bilder sind die für mich aber relativ wichtig.

Dachte zunächst, dass ich das alte Erstellungsdatum vorher auslesen und dann später zurückschreiben könnte, aber so einfach soll das wohl nicht gehen.

NUn habe ich ein anderes Script gefunden, das ich in meins reingebastelt habe. Es sieht auch so aus als würde das funktionieren, aber ich finde das Script ist viel zu umständlich für das, was ich eigentlich nur will.

Bin dankbar für jeden Hinweis.

Nachfolgend ein Auszug aus dem Script:


on convFile(phFile)
   
    tell application "Image Events"
        activate
        set ignoreMissingValue to false
        set ignoreWrongDate to false
    end tell
   
    set okay to true
    set fileInfo to info for file phFile
   
    if kind of fileInfo contains "JPEG" then
        set okay to false
    end if
   
    tell application "Image Events"
        activate
        set img to open phFile
        set allDates to value of every metadata tag of img whose name is "creation"
    end tell
   
    set creationDate to min(allDates)
    if creationDate is missing value then
        if not ignoreMissingValue then
            display_error("The image" & return & "«" & (phFile as string) & "»" & return & "Has no EXIF tags or at least no creation date", "No EXIF data", true)
            set ignoreMissingValue to true
        end if
        return
    end if
   
   
    try
        run application "Adobe Photoshop CS3"
    end try
   
    tell application "Adobe Photoshop CS3"
        activate
       
        if not okay then
            set saveOptions to ¬
                {class:JPEG save options, embed color profile:true, quality:10, format options:standard}
        end if
       
        open file phFile showing dialogs never
        tell document 1
                ...

    end tell
   
    if kind of fileInfo contains "JPEG" then
        EXIF_touch(phFile as alias)
    end if
   
end convFile


-- does the touch
on EXIF_touch(phFile)
    tell application "Image Events"
        set img to open phFile
        set allDates to value of every metadata tag of img whose name is "creation"
        close img
    end tell
   
    -- I'm not sure whether or not we have several creation dates for the image
    -- so I pick the oldest
    set creationDate to min(allDates)
    if creationDate is missing value then
        if not ignoreMissingValue then
            display_error("The image" & return & "«" & (phFile as string) & "»" & return & "Has no EXIF tags or at least no creation date", "No EXIF data", true)
            set ignoreMissingValue to true
        end if
        return
    end if
   
    -- check the creation date of the file
    tell application "Finder" to set fileCreation to creation date of phFile
    set fileCreation to EXIF_format(fileCreation)
   
    -- check today's date
    set today to EXIF_format(current date)
   
    -- all dates are in EXIF format, which is YYYY:MM:DD hh:mm:ss
    if creationDate ? fileCreation then
        -- a simple touch works if we set the modified and access time
        -- to a date prior to file creation
        touch(creationDate, phFile)
    else if creationDate ? today then
        -- if the image was created before today, but after file creation
        touch(creationDate, refresh(phFile))
    else -- damn! Something is wrong!
        display_error("Your computer's date (" & today & ") is lower than the creation date (" & creationDate & ") of the image" & return & "«" & (phFile as string) & "»" & return & "Please try to fix this before you proceed.", "Wrong Date", true)
        set ignoreWrongDate to true
    end if
end EXIF_touch


-- make a cp (copy) of the file
-- this sets the file's creation date to the current date
on refresh(anAlias)
...
end refresh

-- renames the file
-- appends " bck" to the filename (or " bck-#") if it already exists
on backup(anAlias)
...
end backup

-- newDate has to be in EXIF format
on touch(newDate, anAlias)
    if class of anAlias is not alias then return
    set x to words of newDate
    set x to ((items 1 thru -2 of x) as string) & "." & last item of x
    do shell script "touch -t " & x & " " & quoted form of POSIX path of anAlias
end touch
X

Finder Datum überschreiben

Hans Haesler
  
Beiträge gesamt: 5822

7. Aug 2008, 21:37
Beitrag # 2 von 9
Beitrag ID: #422549
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Elisabeth,

welcome back! :-)

Also ... wenn ich es richtig verstehe, dann funktioniert das Script.
Deshalb würde ich meinen: "Never change a winning team." Oder etwa nicht?

Gruss, Hans


als Antwort auf: [#422548]

Finder Datum überschreiben

Braut2
Beiträge gesamt: 40

8. Aug 2008, 08:29
Beitrag # 3 von 9
Beitrag ID: #422550
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

funktioniert leider doch nicht, hab wohl gestern ein bisschen zu lange damit rumgebastelt.

Nun habe ich das Script etwas vereinfacht, ich wollte ja eigentlich nur den "Creation Date" auslesen. Und das funktioniert jetzt wohl auch. Aber irgendwie "merkt" sich das Script die Variable nicht.

Wenn der TOUCH Handler aufgerufen wird, klriege ich immer eine Fehlmeldung , dass die Variable Creation nicht definiert sei.

Könntest Du nicht doch noch mal draufschauen?


on processObject(aObject)
   
    tell application "Finder"
        set creationDate to creation date of file aObject
    end tell
    set creationDate to EXIF_format(creationDate)
   
   
    -- wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner ...
    if (aObject as Unicode text) ends with ":" then
        -- die Liste der Objekte wird erstellt (ohne unsichtbare Dateien)
        set contentsList to list folder aObject without invisibles
        -- Wiederholungsschleife durch diese Liste
        repeat with anItem in contentsList
            -- der Pfad wird zusammengesetzt
            set objPath to ((aObject as Unicode text) & anItem)
            -- die Elemente (Dateien oder Ordner) werden an den aktuellen Handler geschickt
            processObject(objPath as alias)
        end repeat
        -- ... sonst ist das Objekt eine Datei
    else
        set curFile to (aObject as Unicode text)
        -- ... den Pfad dem Handler 'printFile' übergeben
       
        convFile(curFile)
    end if
   
   
    EXIF_touch(aObject as alias)
   
   
end processObject

-- in diesem Handler versucht Photoshop CS3, die Datei zu öffnen, die Resulotion zu aendern und die Datei in ihrem Original-Format zu speichern
on convFile(phFile)
   
    set okay to true
    set fileInfo to info for file phFile
   
   
    if kind of fileInfo contains "JPEG" then
        set okay to false
    end if
   
    try
        run application "Adobe Photoshop CS3"
    end try
   
    tell application "Adobe Photoshop CS3"
        activate
       
        if not okay then
            set saveOptions to ¬
                {class:JPEG save options, embed color profile:true, quality:10, format options:standard}
        end if
       
        open file phFile showing dialogs never
       
       
        tell document 1
            try
                convert to profile "Working RGB" intent absolute colorimetric
            end try
            set vert to height as pixels
            set hori to width as pixels
            resize image width hori height vert resolution 150
        end tell
        if okay then
            close document 1 saving yes
        else
            save document 1 in phFile with options saveOptions
            close document 1 saving no
        end if
       
    end tell
   
end convFile


-- does the touch
on EXIF_touch(aObject)
   
    touch(creationDate, aObject)
end EXIF_touch

-- newDate has to be in EXIF format
on touch(newDate, anAlias)
    if class of anAlias is not alias then return
    set x to words of newDate
    set x to ((items 1 thru -2 of x) as string) & "." & last item of x
    do shell script "touch -t " & x & " " & quoted form of POSIX path of anAlias
end touch

-- format a date to EXIF format
on EXIF_format(aDate)
    set {year:y, month:m, day:d, hours:hh, minutes:mm, seconds:ss} to aDate
    return (y & ¬
        ":" & (leftfill of (m as integer) by "00") & ¬
        ":" & (leftfill of d by "00") & ¬
        " " & (leftfill of hh by "00") & ¬
        ":" & (leftfill of mm by "00") & ¬
        ":" & (leftfill of ss by "00")) as string
end EXIF_format

-- leftfill of 4711 by "000000" => "004711"
to leftfill of aNumber by pattern
    set aNumber to aNumber as string
    set missing to (length of pattern) - (length of aNumber)
    if missing ? 0 then return aNumber
    return (text 1 thru missing of pattern) & aNumber
end leftfill


als Antwort auf: [#422548]

Finder Datum überschreiben

Hans Haesler
  
Beiträge gesamt: 5822

8. Aug 2008, 09:30
Beitrag # 4 von 9
Beitrag ID: #422551
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Elisabeth,

mit 'touch' und so habe ich keine Erfahrung. Da muss ich mich erst schlau machen.

Vielleicht kann ich im Laufe des heutigen Abends damit beginnen. Sonst übers Wochenende.

Ich habe zwar Dateien mit EXIF-Einträgen. Doch es wäre gut, wenn Du mir eine Deiner Dateien senden könntest, damit wir die gleichen Voraussetzungen haben.

Unter welchem Betriebssytem bist Du unterwegs? Tiger? Leopard?

Gruss, Hans


als Antwort auf: [#422548]

Finder Datum überschreiben

Braut2
Beiträge gesamt: 40

8. Aug 2008, 10:10
Beitrag # 5 von 9
Beitrag ID: #422552
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

danke dass Du Dir mal wieder Zeit für mich nimmst.

Ich arbeite auf einem MacBook Pro,  Leopard mit Creative Suite CS3.
Aber eigentlich will ich ja gar nicht an die EXIF daten ran, sondern den "Creation Date" in Finder benutzen.
Das sind so weit ich weiss zwei ganz verschiedene Dinge.

Wenn ich es richtig verstehe ruft das originale Script für EXIF_Touch das Datum auf, das in Bridge "Date Time" heisst.
Wenn, dann müsste ich aber ohnehin an "Date Time Original" ran, wenn ich es nicht hinbekomme, das gewünschte Datum vor der Photoshop-Konvertierung zu speichern.

Wenn ich die Variable dagegen schon vorher definieren kann, reicht mir das Datum im Finder.

Wie krieg ich denn das Bild zu Dir?
Krieg es nicht als Anhang mit, obwohl ich es unter 75 k bekommen habe.
Und deine Email Adresse habe ich leider verbummelt.


als Antwort auf: [#422548]

Finder Datum überschreiben

Hans Haesler
  
Beiträge gesamt: 5822

8. Aug 2008, 12:45
Beitrag # 6 von 9
Beitrag ID: #422553
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Elisabeth,

bitteschön.

Also ... wenn Dir das Finder-Erzeugungs-Datum genügt, dann kann man es leicht erfahren. Aber es wird schwierig sein, es zurückzuändern.

Beim Modifikationsdatum habe ich es schon vor Jahren ab und an gemacht.

Bitte sende mir dennoch eine Bilddatei. Ich habe Dir ein E-Mail geschickt, damit Du meine Adresse wieder hast.

Gruss, Hans


als Antwort auf: [#422548]

Finder Datum überschreiben

Anonym
Beiträge gesamt: 22827

8. Aug 2008, 17:12
Beitrag # 7 von 9
Beitrag ID: #422554
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Elisabeth.
Also, ich fürchte, mit touch wird das nix. Ein Unix-Datei-System kennt in diesem Sinne überhaupt kein creation date. Das ist nur ein "Nice-To-Have" am Mac.
Zur Zwischenspeicherung des "creation date", dass der Finder im Zusammenhang mit HFS+ kennt, könntest du das Erstellungsdatum z.B. vor der Bearbeitung in den Spotlight-Kommentar der zu bearbeitenden Datei schreiben.
In etwa so: [url=http://tinyurl.com/5f2n7z]KLICK.
Und zum ändern des creation date könntest du z.B. auf "SetFile" und "GetFileInfo" aus den Developer-Tools von Apple zurückgreifen.
Siehe [url=http://www.macosxhints.com/article.php?story=20011018172352562&query=creation+date]diesen Beitrag auf macosxhints.com

Hab's grad mal selbst getestet. Hier mal ein beispiel fürs auslesen und ein beispiel für's ändern (aber bitte nur mit einer testdateien verwenden):
[url=http://tinyurl.com/5tlfhf]KLICK KLICK
Gruß, H =:o) L G I


als Antwort auf: [#422548]

Finder Datum überschreiben

Hans Haesler
  
Beiträge gesamt: 5822

8. Aug 2008, 20:13
Beitrag # 8 von 9
Beitrag ID: #422555
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Elisabeth,

ich kann leider nur bestätigen, was mein Vorredner bereits gesagt hat.

Wenn Du das Programm "Terminal" startest und nach der Prompt-Zeile (welche bei Dir vielleicht mit "elisabeth$" endet) wo der dicke graue Cursor sitzt, man touch eintippst und mit Return bestätigst, dann erscheint die Manual-Seite für "touch". Und nirgends wird das Erzeugungsdatum erwähnt. Nur 'modification time' und 'access time'.

Zum Beenden die Leertaste betätigen bis unten links das Wort End erscheint. Dann die Taste "Q" antippen, mit Befehl+W das Fester schliessen und mit Befehl+Q das Programm beenden.

Damit das alles praktisch nachvollzogen werden kann, habe ich den Code aus Deinem Posting auf die folgenden Zeilen zusammengeschmolzen. Bitte zuerst in einen Ordner zwei alte Dateien (nicht mit dem Datum von heute) kopieren und dann das Script starten.

Es erscheint der Dialog zur Auswahl der ersten Datei. Deren Erzeugungsdatum wird in eine Variable gegeben und zum Vorbereiten des EXIF-Formats schon mal in eine kürzere Form gebracht.

Dann kommt der Dialog zum Auswählen der zweiten Datei. Und deren Pfad, sowie das gespeicherte Erzeugungsdatum werden zum 'touch'-Handler geschickt.

Das Ergebnis: Bei der zweiten Datei ist nicht das Erzeugungsdatum, sondern das Modifikationsdatum geändert worden.
Code
-- eine erste Datei wählen 
set objectOne to (choose file) as Unicode text

-- das Erzeugungsdatum speichern
set creationDate to creation date of (info for of file objectOne)

-- das Datum ins EXIF-Format umformen lassen
set modDate to EXIF_format(creationDate)

-- eine zweite Datei wählen
set objectTwo to (choose file) as Unicode text
touch(modDate, objectTwo as alias)

------------------------
-- die drei Handler

on EXIF_format(aDate)
set {year:y, month:m, day:d, hours:hh, minutes:mm, seconds:ss} to aDate
return (y & ¬
  ":" & (leftfill of (m as integer) by "00") & ¬
  ":" & (leftfill of d by "00") & ¬
  " " & (leftfill of hh by "00") & ¬
  ":" & (leftfill of mm by "00") & ¬
  ":" & (leftfill of ss by "00")) as string
end EXIF_format

-- leftfill of 4711 by "000000" => "004711"
to leftfill of aNumber by pattern
set aNumber to aNumber as string
set missing to (length of pattern) - (length of aNumber)
if missing ? 0 then return aNumber
return (text 1 thru missing of pattern) & aNumber
end leftfill

on touch(newDate, anAlias)
if class of anAlias is not alias then return
set x to words of newDate
set x to ((items 1 thru -2 of x) as string) & "." & last item of x
do shell script "touch -t  " & x & " " & quoted form of POSIX path of anAlias
end touch


Mit klassischem AppleScript kann (wie schon erwähnt) das Modifikationsdatum leicht geändert werden:
Code
-- eine Datei wählen 
set oneObject to (choose file) as Unicode text
set curDate to current date
-- das Modifikationsdatum ändern
tell application "Finder" to set modification date of file oneObject to curDate

Aber wenn man dasselbe mit dem Erzeugungsdatum versucht, kommt eine Fehlermeldung, weil jenes nur 'read only' ist.
Code
-- eine Datei wählen 
set oneObject to (choose file) as Unicode text
set curDate to current date
-- das Erzeugungsdatum ändern
tell application "Finder" to set creation date of file oneObject to curDate



Wie H =:o) L G I erwähnt hat, hättest Du mit SetFile mehr Erfolg. Aber dazu müssten die DevTools installiert sein.

Gruss, Hans


als Antwort auf: [#422548]

Finder Datum überschreiben

Braut2
Beiträge gesamt: 40

11. Aug 2008, 12:28
Beitrag # 9 von 9
Beitrag ID: #422556
Bewertung:
(3872 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Es funktioniert !  :-)

Herzlichen Dank, Ihr beiden.
Habe DevTools installiert und danach noch ein bisschen rumgebastelt,
bis ich die richtige Platzierung der Scripte von H =:o) L G I heraus hatte. Aber jetzt funktioniert es.

Schon ein bisschen eigenartig, dass man für eine relativ einfache Handlung mehr als 2 GB installieren muss.


als Antwort auf: [#422548]
X