[GastForen Programmierung/Entwicklung AppleScript Datum und Zeit an Dateinamen anhängen

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

Datum und Zeit an Dateinamen anhängen

-Peter-
Beiträge gesamt: 7

12. Jun 2019, 09:07
Beitrag # 1 von 17
Bewertung:
(14580 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, liebe Mit-Scripter

Habe mir dank verschiedener Quellen das folgende Script (Droplet) gebastelt. Es dient dazu, Dateinamen mit Erstellungsdatum und Zeit zu ergänzen.
Z.B.
FPRO4223 Kopie.JPG zu FPRO4223 Kopie___10.6.2019___10'50'24.JPG
FPRO4223 Kopie.RAF zu FPRO4223 Kopie___10.6.2019___10'50'24.JPG

Das Script:

Code
on open 
tell application "Finder"
set input to selection

repeat with x in input
set creationDate to creation date of x
set modDate to modification date of x

set fileInfo to (info for of file (item 1 of input as string)) --- scheint hier hängen zu bleiben
set {fileName, nExt} to {name of fileInfo, name extension of fileInfo}
if nExt is not missing value then
set origName to (text 1 thru -((count of nExt) + 2)) of fileName
end if

set cD to creation date of x
set the_year to year of (cD) as number
set the_month to month of (cD) as number
set the_day to day of (cD) as number
set ts to time string of cD
set c to offset of ":" in ts
set h to text -2 thru -1 of ("0" & (text 1 thru (c - 1) of ts))
set m to text (c + 1) thru (c + 2) of ts
set s to text (c + 4) thru (c + 5) of ts
set Zeit to (h & "'" & m & "'" & s)
set neuName to origName & "___" & ((the_day & "." & the_month & "." & the_year & "___" & Zeit) as string)
set name of x to neuName & "." & nExt
end repeat
end tell
end open



Es funktioniert wie gewünscht, wenn ich 1 Datei darauf ziehe. Schon bei der zweiten kommt die Fehlermeldung:

«class docf» "FPRO4223 Kopie.JPG" of «class cfol» "Desktop" of «class cfol» "mini" of «class cfol» "Users" of «class sdsk» of application "Finder" kann nicht in Typ string umgewandelt werden.

Code
error "«class docf» \"FPRO4223 Kopie.JPG\" of «class cfol» \"Desktop\" of «class cfol» \"mini\" of «class cfol» \"Users\"  
of «class sdsk» of application \"Finder\" kann nicht in Typ string umgewandelt werden." number -1700 from «class docf»
"FPRO4223 Kopie.JPG" of «class cfol» "Desktop" of «class cfol» "mini" of «class cfol» "Users" of «class sdsk» to string

Vielleicht kann mir jemand erklären, wo der Haken ist, worüber ich sehr froh wäre.

Dankbare Grüsse
Peter

(Dieser Beitrag wurde von Hans Haesler am 12. Jun 2019, 14:10 geändert)
X

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

12. Jun 2019, 10:17
Beitrag # 2 von 17
Beitrag ID: #570670
Bewertung:
(14566 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

herzlich willkommen im AppleScript-Forum auf HDS! :-)

Der Code sollte anders aufgebaut sein. Ohne den "Finder" einzuspanne.

Bei meinem ersten Versuch bekam ich eine Fehlermeldung, weil 'origName' nicht definiert ist.
Nach einer Änderung im Script funktionierte es mit einer Datei. Aber der Ordner, in welchem sich die Testdatei befindet, wurde umbenannt.

Wenn zwei Dateien aufs Droplet gezogen werden, wird die erste umbenannt. Doch dann kommt die Fehlermeldung.

Ich muss gleich weg. Werde aber im Laufe des Tages versuchen, ein funktionerendes Doplet zu erstellen.

Gruss, Hans


als Antwort auf: [#570669]

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

12. Jun 2019, 14:12
Beitrag # 3 von 17
Beitrag ID: #570672
Bewertung:
(14539 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

nachstehend die erste Version des Droplets. Die gebrauchsfertige Datei ist unten angehängt.

Code
(* 
Datum_01d.app
© 12.06.2019 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# der 'Run Handler' warnt, wenn die Ausführung mit einem Doppelklick gestartet wurde
on run
activate me
display dialog "Dateien (oder Ordner) auf das Script-Icon ziehen." buttons "OK" default button 1 with icon 0
end run

# der 'Open Handler' reagiert, wenn Objekte auf das Icon des Scripts gedroppt werden
on open allObjects
# Wiederholschleife, welche die gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat
# den Anwender informieren
activate me
display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
end open

# im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist;
# der Inhalt des Hauptordners wird aufgelistet; Dateien werden zum Handler 'processFile' gesandt.
on processObject(aObject)
# wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner oder eine App ...
set curObject to aObject as string
if curObject ends with ":" then
# wenn das Objekt keine App-Datei ist ...
if not (curObject ends with ".app:") then
set contentsList to list folder curObject without invisibles
# die Wiederholschleife schickt die Dateien zum eigenen Handler
repeat with curItem in contentsList
set objPath to curObject & curItem
processObject(objPath as alias)
end repeat
end if
else
# die Datei zum Handler 'workFile()' schicken
workFile(curObject)
end if
end processObject

# der Handler, das Datum einsetzt
on workFile(curObject)
set fileInfo to info for of file curObject
set fileName to name of fileInfo
set nExt to name extension of fileInfo
set origName to (text 1 thru -((count of nExt) + 2)) of fileName
set cD to creation date of fileInfo
set the_year to year of (cD) as number
set the_month to month of (cD) as number
set the_day to day of (cD) as number
set ts to time string of cD
set c to offset of ":" in ts
set h to text -2 thru -1 of ("0" & (text 1 thru (c - 1) of ts))
set m to text (c + 1) thru (c + 2) of ts
set s to text (c + 4) thru (c + 5) of ts
set Zeit to (h & "'" & m & "'" & s)
set neuName to origName & "___" & ((the_day & "." & the_month & "." & the_year & "___" & Zeit) as string)
tell application "Finder" to set name of file curObject to neuName & "." & nExt
end workFile

Es kann eine einzelne Datei oder mehrere Dateien gleichzeitig oder ein Ordner, welche die Dateien enthält auf das Icon des Droplets gezogen werden.

Der "Finder" wird nur am Schluss benutzt, zum Umbenennen der Datei.

Gruss, Hans


als Antwort auf: [#570669]
Anhang:
Datum_01d.zip (59.1 KB)

Datum und Zeit an Dateinamen anhängen

-Peter-
Beiträge gesamt: 7

12. Jun 2019, 15:09
Beitrag # 4 von 17
Beitrag ID: #570675
Bewertung:
(14521 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans

Herzlichen Dank für die Lösung des Problems und das Dokumentieren.
Sie ist aufwendiger geworden als ich mir vorgestellt habe. Sehr praktisch jetzt ist die Möglichkeit, den Ordner drauf zu ziehen. Das Script funktioniert einwandfrei.

Zusätzlicher Gewinn für mich: es gibt einiges zu lernen und auszuprobieren.

Gruss Peter


als Antwort auf: [#570672]

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

12. Jun 2019, 20:35
Beitrag # 5 von 17
Beitrag ID: #570680
Bewertung:
(14495 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

bitte sehr.

aus Zeitgründen hatte ich die folgenden Erklärungen nicht sofort liefern können.

Die Zeile ...

Code
on open allObjects 

... ist charakteristisch für ein Droplet. Die Variable kann anders benannt sein. Aber sie wird immer die Liste der Pfade zu den gedroppten Objekten enthalten. Das sind alles Aliasse.

In der Schleife ...

Code
repeat with aObject in allObjects 

... wird der Variablen 'aObject' das aktuellen Element der Liste zugewiesen.

Dieses wird mit ....

Code
processObject(aObject) 

... dem Handler 'processObject()' übergeben, welcher die Objekte prüft.

Mit ...

Code
set curObject to aObject as string 

... wird der Variablen 'curObject' der Pfad als Textkette zugewiesen.

Und jetzt kann das Script den Pfad prüfen. Wenn dieser mit ":" endet, ist es ein Ordner (oder eine App). Sonst eine Datei.

Falls Ordner: Dessen Inhalt wird aufgelistet und zurück an den Handler 'processObject()' gesandt, in welchem die Prüfung stattfindet. Das nennt man "rekursiv".

Falls Datei: Dieser Pfad wird zum Handler 'workFile()' geschickt. In diesem werden die Infos ausgezogen und die Textkette wird zusammengesetzt.

Schliesslich wird durch den "Finder"-Einzeiler-Befehl die Datei umbenannt.

Aus Performance-Gründen ist es ratsam, den "Finder" nur für Befehle aufzubieten, welche er beherrscht. Sonst resultiert ein interner Fehler und der Befehl muss erneut durch die richtige App ausgeführt werden. Das geschieht so häufig, dass Apple diese "Umleitung" offiziell ermöglicht hat.

Es ist auch besser, die "Finder"-Befehle als Einzeiler zu schreiben. Und nicht den ganzen Ablauf in einen "Finder"-Block zu packen.

Falls noch Fragen: nur fragen! :-)

Gruss, Hans


als Antwort auf: [#570675]

Datum und Zeit an Dateinamen anhängen

-Peter-
Beiträge gesamt: 7

13. Jun 2019, 08:24
Beitrag # 6 von 17
Beitrag ID: #570684
Bewertung:
(14429 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die ergänzenden und erhellenden Erklärungen, sie helfen mir wirklich weiter. Es gibt zwar eine ansehnliche Menge Literatur über AppleScript in englischer Sprache, aber wenn's einem deutsch und deutlich gesagt wird, wird es doch klarer. :-)

Mir ist auch aufgefallen, wie schnell das Script arbeitet.

Gruss, Peter


als Antwort auf: [#570680]

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2019, 19:49
Beitrag # 7 von 17
Beitrag ID: #570697
Bewertung:
(14386 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

bitte sehr.

Eine Frage: Kommt es vor, dass das eingefügte Datum wieder entfernt werden muss?

Wie dem auch sei: Folgende Variante des Droplets ermöglicht, den Originalnamen wiederherzustellen.
Das Droplet "Datum_weg" ist unten angehängt.

Code
(* 
Datum_weg_01d.app
© 13.06.2019 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# die Zählervariable als 'global' bezeichnen, damit sie in beiden Handlern greifbar ist
global ctr

# der 'Run Handler' warnt, wenn die Ausführung mit einem Doppelklick gestartet wurde
on run
activate me
display dialog "Dateien (oder Ordner) auf das Script-Icon ziehen." buttons "OK" default button 1 with icon 0
end run

# der 'Open Handler' reagiert, wenn Objekte auf das Icon des Scripts gedroppt werden
on open allObjects
# die Zählervariable initialisieren
set ctr to 0
# den Trenner vorbereiten
set AppleScript's text item delimiters to "___"
# Wiederholschleife, welche die gedroppten Objekte zum Handler 'processObject' schickt
repeat with aObject in allObjects
processObject(aObject)
end repeat
# den Trenner zurücksetzen
set AppleScript's text item delimiters to {""}
# den Anwender informieren
activate me
if ctr is 0 then
display dialog "Keine Datei umbenannt." buttons "OK" default button 1 with icon 2 giving up after 2
else if ctr is 1 then
display dialog "Eine Datei umbenannt." buttons "OK" default button 1 with icon 1 giving up after 2
else
display dialog "" & ctr & " Dateien umbenannt." buttons "OK" default button 1 with icon 1 giving up after 2
end if
end open

# im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist;
# der Inhalt des Hauptordners wird aufgelistet; Dateien werden zum Handler 'processFile' gesandt.
on processObject(aObject)
# wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner oder eine App ...
set curObject to aObject as string
if curObject ends with ":" then
# wenn das Objekt keine App-Datei ist ...
if not (curObject ends with ".app:") then
set contentsList to list folder curObject without invisibles
# die Wiederholschleife schickt die Dateien zum eigenen Handler
repeat with curItem in contentsList
set objPath to curObject & curItem
processObject(objPath as alias)
end repeat
end if
else
# die Datei zum Handler 'workFile()' schicken
workFile(curObject)
end if
end processObject

# der Handler, das Datum einsetzt
on workFile(curObject)
set fileInfo to info for of file curObject
set fileName to name of fileInfo
if fileName contains "___" then
set nExt to name extension of fileInfo
set origName to text item 1 of fileName
set oldName to origName & "." & nExt
tell application "Finder" to set name of file curObject to oldName
set ctr to ctr + 1
end if
end workFile

Kurz erklärt: Zu Beginn wird den AppleScript's text item delimiters die Zeichenfolge "___" zugewiesen.
Das Script muss bei jedem Dateinamen prüfen, ob dieser "___" enthält. Falls ja, wird der Variablen 'origName' das erste Text-Element des Dateinamens zugewiesen. Das heisst alle Zeichen vom Beginn des alten Dateinamens bis vor den ersten "___"-Trenner.
Dann wird der neue (alte) Name zusammengesetzt und die Datei wird umbenannt.
Am Schluss werden die AppleScript's text item delimiters zurückgesetzt auf eine leere Textkette.

Ohne die Prüfung auf "___" würde bei einem Dateinamen ohne Datum das erste Text-Element den ganzen Namen inklusive Endung umfassen. Und daran würde die Endung gehängt: "test_01.txt.txt"

Gruss, Hans


als Antwort auf: [#570684]
Anhang:
Datum_weg_01d.zip (58.3 KB)

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2019, 19:51
Beitrag # 8 von 17
Beitrag ID: #570698
Bewertung:
(14384 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

beim Testen des "Datum_weg"-Droplets wurde mir bewusst, dass auch im "Datum"-Droplet geprüft werden sollte, ob im aktuellen Dateinamen noch kein Datum eingefügt ist.

Dazu muss mit if not auf das Gegenteil getestet werden:

Code
if not (fileName contains "___") then 

Der ganze Handler:

Code
# der Handler, das Datum einsetzt 
on workFile(curObject)
set fileInfo to info for of file curObject
set fileName to name of fileInfo
# prüfen, ob nicht schon ein Datum eingefügt ist
if not (fileName contains "___") then
set nExt to name extension of fileInfo
set origName to (text 1 thru -((count of nExt) + 2)) of fileName
set cD to creation date of fileInfo
set the_year to year of (cD) as number
set the_month to month of (cD) as number
set the_day to day of (cD) as number
set ts to time string of cD
set c to offset of ":" in ts
set h to text -2 thru -1 of ("0" & (text 1 thru (c - 1) of ts))
set m to text (c + 1) thru (c + 2) of ts
set s to text (c + 4) thru (c + 5) of ts
set Zeit to (h & "'" & m & "'" & s)
set neuName to origName & "___" & ((the_day & "." & the_month & "." & the_year & "___" & Zeit) as string)
tell application "Finder" to set name of file curObject to neuName & "." & nExt
end if
end workFile

Die Version 02d des Droplets ist angehängt.

Gruss, Hans


als Antwort auf: [#570697]
Anhang:
Datum_02d.zip (59.3 KB)

Datum und Zeit an Dateinamen anhängen

-Peter-
Beiträge gesamt: 7

15. Jun 2019, 09:42
Beitrag # 9 von 17
Beitrag ID: #570705
Bewertung:
(14299 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans

Deine weiterführenden Überlegungen und Ergänzungen sind interessant. Zwar war es bis jetzt nicht notwendig, das Datum wieder los zu werden, aber die Möglichkeit zu haben, erweitert den Nutzen des Scripts. Und zu sehen, wie das erreicht wird, erweitert meinen Scripter-Horizont. :-)

In dem Zusammenhang spuckt ein Script in meinem Kopf herum, das Folgendes ermöglicht:
Beim Abbarten der gedropten Dateien wird in einem Dialog standardmässig der Originalname (neu + Datum) angeboten mit der Möglichkeit den Namen Datei für Datei individuell händisch zu ändern.

Wenn du dazu eine Idee hättest, wäre das großartig.
Danke, daß ich deine Kenntnisse nutzen darf.

Ein schönes Wochenende und
Gruss, Peter


als Antwort auf: [#570698]

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

15. Jun 2019, 10:20
Beitrag # 10 von 17
Beitrag ID: #570706
Bewertung:
(14292 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

Antwort auf: (...) erweitert meinen Scripter-Horizont.

Dies war mit ein Grund. :-)

Deine neue Idee sollte umsetzbar sein. Werde ich im Laufe des Tages versuchen.

Verstehe ich es richtig, dass nur der Originalname zum Ändern angeboten werden soll?
Wenn Datum und Uhrzeit unverändert eingefügt werden, wäre das am einfachsten.

Gruss, Hans


als Antwort auf: [#570705]

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

15. Jun 2019, 11:43
Beitrag # 11 von 17
Beitrag ID: #570707
Bewertung:
(14278 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

vermutlich entspricht schon die folgende Lösung Deinem Wunsch.

Man muss nur diese Zeile an der richtigen Stelle einfügen. Die ergänzte Droplet-Datei ist angehängt.

Code
set origName to text returned of (display dialog "Dateiname ändern:" default answer origName) 

Mit 'default answer' bekommt man eine Eingabe-Zeile, welche enweder leer ist (durch nachfolgendes "") oder schon Zeichen enthält (wie hier mit 'origName').

Wenn der Name nicht geändert werden soll: Auf den Button "OK" klicken.
Zum Abbrechen der Ausführung: Den Button "Abbrechen" betätigen.

Gruss, Hans


als Antwort auf: [#570706]
Anhang:
Datum_03d.zip (59.5 KB)

Datum und Zeit an Dateinamen anhängen

-Peter-
Beiträge gesamt: 7

15. Jun 2019, 16:41
Beitrag # 12 von 17
Beitrag ID: #570708
Bewertung:
(14237 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans

Zitat "nur der Originalname zum Ändern"

Angeboten werden kann der ganze Dateiname, ich würde dann nach Belieben überschreiben.
Ich dachte es mir so: Button "Speichern" sichert den neuen Namen und geht zur nächsten Datei, "OK" geht direkt zur nächsten Datei, "Abbrechen" unterbricht die ganze Aktion.

Danke für das Script. Werde es später probieren.

Gruss, Peter


als Antwort auf: [#570707]

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

15. Jun 2019, 18:07
Beitrag # 13 von 17
Beitrag ID: #570709
Bewertung:
(14212 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

bitte sehr.

Also ... es macht kein Sinn, die Ergänzung mit Datum und Uhrzeit ebenfalls zur Änderung anzubieten.

Angenommen, der ursprüngliche Dateiname lautet "test_01.txt". Mit der Ergänzung ist der neue Name "test_01___12.6.2019___09'55'22.txt".

Der Dialog zum Ändern des Dateinamens zeigt nur "test_01". Sowohl Datum als auch Uhrzeit und Endung sollten unverändert bleiben.

Sonst wäre es besser dies generell im Script zu anzupassen.

Gruss, Hans


als Antwort auf: [#570708]

Datum und Zeit an Dateinamen anhängen

-Peter-
Beiträge gesamt: 7

16. Jun 2019, 10:10
Beitrag # 14 von 17
Beitrag ID: #570711
Bewertung:
(13962 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans

Recht hast du natürlich, Datum und Zeit anzubieten, bringt in diesem Fall keinen praktischen Nutzen (ausser einem optischen, vielleicht).

"Datum_03d.app" ist sehr praktisch, hat nur einen Schönheitsfehler [:-)]: Wenn die Dateien bereits mit Datum und Zeit versehen sind, wird der Dialog zum Namen ändern übersprungen. Wenn du das noch dahingehend ändern könntest, daß das Änderungsangebot immer ersheint, wäre ich glücklich damit – muss aber nicht am Sonntag sein.

Für all deine Geduld und Mühe nochmals Danke.

Gruss, Peter


als Antwort auf: [#570709]

Datum und Zeit an Dateinamen anhängen

Hans Haesler
  
Beiträge gesamt: 5826

16. Jun 2019, 10:58
Beitrag # 15 von 17
Beitrag ID: #570712
Bewertung:
(13940 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Peter,

okay, ich verstehe.

Dazu muss (wie im Datei-weg-Script) der Trenner auf "___" gesetzt werden und nach der Schleife wieder zurück zu {""}.

Im Handler 'workFile(curObject)' wird die Prüfung 'if not (fileName contains "___") then' durch folgenden 'else'-Abschnitt ergänzt:

Code
  else 
set origName to text item 1 of fileName
set tmpString to text items 2 thru -1 of fileName as list
set dateString to "___" & item 1 of tmpString & "___" & item 2 of tmpString
set origName to text returned of (display dialog "Dateiname ändern:" default answer origName)
set neuName to origName & "___" & item 1 of tmpString & "___" & item 2 of tmpString
tell application "Finder" to set name of file curObject to neuName
end if

Das Droplet ist angehängt.

Doch, es musste am Sonntag sein. Denn morgen fliegen meine Frau und ich in den Urlaub. Nach Zakynthos. :-)

Gruss, Hans


als Antwort auf: [#570711]
Anhang:
Datum_04d.zip (60.7 KB)
X