Ich möchte das Filesystem-Erstellungsdatum einer (Bild)Datei auf das EXIF CreateDate setzen per BATCH oder VBS (und ExifTool)
Ich habe nur ridimentäre Kenntnisse im Scripting und komme manchmal alleine nicht weiter. Hier brauche ich Hilfe für Exiftool.
Da Picasa (und andere Kataloge wohl auch) diese Bilder "gerne nach Datum sortiert" anzeigt, ist dieses Kopierdatum unbrauchbar und nachteilig. Darum möchte ich das gern auf das tatsächliche Erstellungsdatum des Dokumentes setzen. In manchen Digitalfotos ist das direkt in die Pixel geschrieben und man kann es von dort ablesen, andere haben das noch in den EXIF oder IPTC drin stehen.
Das Dateidatum läßt sich recht gut mit FileTouch.exe auf den gewünschten Wert setzen. Für den Zweck habe ich mir auch schon eine funktionierende Batch-Datei geschrieben, die ich nun bequem über Rechtsklick "öffnen mit ..." auswählen kann. Aber die Angabe des Datums (und der Zeit) muß ich derzeit noch manuell in das DOS-Fenser eingeben, was dann erscheint.
Daher würde ich gerne mit ExifTool das CreateDate (bzw alternativ auch noch DateTimeOriginal wenn CreateDate leer ist) auslesen und in eine Variable schreiben, welche dann FileTouch übernimmt.
Nur leider ist die Dokumentation zu ExifTool so grrottig, das ich fast nichts verstehe.
Immerhin konnte ich schon mal Rückgaben erhalten, doch so nicht weiterverwenden. Mit
wird Bspw.: "E:\Dokumente und Einstellungen\Ronald\Eigene Dateien\Eigene Bilder\org01.jpg" wird als ganze Zeilen zurück gegeben. Das sind aber jeweils zwei Zeilen und mehr, als ich brauche.
Diese müßte ich nun zerlegen und umbauen, damit etwas rauskommt, das FileTouch.exe verarbeiten kann.
Die Zeitangabe kann man unverändert übernehmen, doch das Datum muß umgebaut werden zu MM-DD-YYYY, also obiges zu 09-08-2004.
(FileTouch.bat und FileTouch.exe befinden sich dabei nebeneinander im gleichen Ordner! und der ist nicht der aktuelle vom Kontextmenü. Daher %Pfad% aus Parameter %0 geholt.)
Und dieses Script soll nun um die Abfrage von ExifTool erweitert werden. Wenn ExifTool kein Datum findet, soll die manuelle Abfrage erfolgen/bleiben, sonst übersprungen werden.
Wenn das geschafft ist, würde ich auch gerne noch wissen, wie man in dem Zusammenhang auch den IPTC-Tag "Create Date" abfragen, und wenn leer gleich mit neu setzen kann.
(noch weiter ginge dann, wenn EXIF leer ist, aber IPTC ein CreateDate hat (das ich irgendwan rein schrieb), dieses zu nehmen und an FileTouch.exe zu übergeben, und in ExIf neu zu setzen. )
Problem:
wenn Dateien auf einen anderen Datenträger kopiert werden, bekommen sie dort ein neues Erstellungsdatum. (Das Datum der letzten Änderung ist manchmal Jahre früher.)Da Picasa (und andere Kataloge wohl auch) diese Bilder "gerne nach Datum sortiert" anzeigt, ist dieses Kopierdatum unbrauchbar und nachteilig. Darum möchte ich das gern auf das tatsächliche Erstellungsdatum des Dokumentes setzen. In manchen Digitalfotos ist das direkt in die Pixel geschrieben und man kann es von dort ablesen, andere haben das noch in den EXIF oder IPTC drin stehen.
Das Dateidatum läßt sich recht gut mit FileTouch.exe auf den gewünschten Wert setzen. Für den Zweck habe ich mir auch schon eine funktionierende Batch-Datei geschrieben, die ich nun bequem über Rechtsklick "öffnen mit ..." auswählen kann. Aber die Angabe des Datums (und der Zeit) muß ich derzeit noch manuell in das DOS-Fenser eingeben, was dann erscheint.
Daher würde ich gerne mit ExifTool das CreateDate (bzw alternativ auch noch DateTimeOriginal wenn CreateDate leer ist) auslesen und in eine Variable schreiben, welche dann FileTouch übernimmt.
Nur leider ist die Dokumentation zu ExifTool so grrottig, das ich fast nichts verstehe.
Immerhin konnte ich schon mal Rückgaben erhalten, doch so nicht weiterverwenden. Mit
E:\xyz\GeoSetter\tools>exiftool -d '%r %a, %B %e, %Y' -creationdate -S -s "E:\Dokumente und Einstellungen\Ronald\Eigene Dateien\Eigene Bilder\org*.jpg"
Create Date : 2004:09:08 16:55:32
Diese müßte ich nun zerlegen und umbauen, damit etwas rauskommt, das FileTouch.exe verarbeiten kann.
Die Zeitangabe kann man unverändert übernehmen, doch das Datum muß umgebaut werden zu MM-DD-YYYY, also obiges zu 09-08-2004.
Hier nun das Script mit manueller Datumseingabe:
FileTouch.bat
@echo off
echo "Erstellungsdatum einer Datei neu setzen. MM-DD-YYYY."
:enterdate
set /p newdate=Bitte Datum im Format mm-tt-jjjj eingeben:
set /p newtime=Bitte Zeit im Format HH:MM:SS eingeben (notfalls :00 fuer :SS):
if %newdate%=="" goto enterdate
if %1.==. goto end
if not exist %1 goto end
for %%a in (%0) do set pfad=%%~dpa
"%pfad%FileTouch.exe" /W /C /D %newdate% /T %newtime% %1
echo %1 touched to %newdate%!
:end
Und dieses Script soll nun um die Abfrage von ExifTool erweitert werden. Wenn ExifTool kein Datum findet, soll die manuelle Abfrage erfolgen/bleiben, sonst übersprungen werden.
Wenn das geschafft ist, würde ich auch gerne noch wissen, wie man in dem Zusammenhang auch den IPTC-Tag "Create Date" abfragen, und wenn leer gleich mit neu setzen kann.
(noch weiter ginge dann, wenn EXIF leer ist, aber IPTC ein CreateDate hat (das ich irgendwan rein schrieb), dieses zu nehmen und an FileTouch.exe zu übergeben, und in ExIf neu zu setzen. )
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 182156
Url: https://administrator.de/contentid/182156
Ausgedruckt am: 23.11.2024 um 08:11 Uhr
26 Kommentare
Neuester Kommentar
Guten Tag, Roschka,
ich hoffe, das bisherige Schweigen des Forums hat etwas mit sonntäglicher Ruhe zu tun. Andernfalls wäre die Ursache durch Nachlesen der Forenregeln (Stichwort Beginn und Ende eines Beitrages) zu finden.
Zu Deinem Problem: Um das Datumsformat, wie es von <exiftool.exe> geliefert wird, zu nationalisieren und damit verdaulicher zu machen, genügt ein Blick in die Hilfe des Tools:
.
Das Filtern der Ausgabe erfolgt beispielsweise so:
.
Da das Datum noch separiert werden muss, kommt das ganze in eine for-Schleife:
Für Deine Batch soll das Ganze in einer Variable landen, also etwa so:
Der Rest dann adäquat (Zeit -> %exiftime%). Viel Erfolg!
Die Codebeispiele sind für die Kommandozeile, für Batchbetrieb sind die Variablen anzupassen (%%i).
Freundliche Grüße von der Insel und einen angenehmen Sonntag - Mario
ich hoffe, das bisherige Schweigen des Forums hat etwas mit sonntäglicher Ruhe zu tun. Andernfalls wäre die Ursache durch Nachlesen der Forenregeln (Stichwort Beginn und Ende eines Beitrages) zu finden.
Zu Deinem Problem: Um das Datumsformat, wie es von <exiftool.exe> geliefert wird, zu nationalisieren und damit verdaulicher zu machen, genügt ein Blick in die Hilfe des Tools:
exiftool.exe -d "%d-%m-%Y" Bilddatei
Das Filtern der Ausgabe erfolgt beispielsweise so:
exiftool.exe -d "%d-%m-%Y" Bilddatei | findstr /i "modification"
Da das Datum noch separiert werden muss, kommt das ganze in eine for-Schleife:
for /f "delims=: tokens=2" %i in ('exiftool.exe -d "%d-%m-%Y" "bild 1.tif" ^| findstr /i "modification"') do echo %i
for /f "delims=: tokens=2" %i in ('exiftool.exe -d "%d-%m-%Y" "bild 1.tif" ^| findstr /i "modification"') do set %i=exifdate
Die Codebeispiele sind für die Kommandozeile, für Batchbetrieb sind die Variablen anzupassen (%%i).
Freundliche Grüße von der Insel und einen angenehmen Sonntag - Mario
... wobei die umgekehrte Reihenfolge erfolgversprechender sein dürfte :
Soferne die Ausgabe tatsächlich (wie oben beschrieben) so
aussehen sollte, dürfte
besser passen (beides - und vor allem Letzteres - allerdings ungetestet) ...
Grüße
bastla
for /f "delims=: tokens=2" %i in ('exiftool.exe -d "%d-%m-%Y" "bild 1.tif" ^| findstr /i "modification"') do set exifdate=%i
Create Date : 2004:09:08 16:55:32
for /f "tokens=2-4* delims=: " %i in ('exiftool.exe -d '%r %a, %B %e, %Y' -creationdate -S -s "E:\Dokumente und Einstellungen\Ronald\Eigene Dateien\Eigene Bilder\org1.jpg" ^|findstr /i /c:"Create Date"') do set "exifdate=%j-%k-%i" & set "exiftime=%l"
Grüße
bastla
Moin Roschka,
es ist sicherlich für Dich frustrierend, wenn die Antworten auf Dein Hilfegesuch so (fast) gar nichts mit dem Anliegen zu tun haben scheinen - da kann man schon mal verbal in den Fäkalbereich ausrutschen.
Es is aber ebenso frustrierend für die Helfenden, wenn offensichtlich kaum etwas von dem gelesen wird, was an Hilfestellungen gegeben wurde.
So war die Zeilen
"Um das Datumsformat, wie es von <exiftool.exe> geliefert wird, zu nationalisieren und damit verdaulicher zu machen, genügt ein Blick in die Hilfe des Tools:"
ein Hinweis darauf, wie man bereits das Programm dazu bringen kann, z.B. das Datumsformat in gewünschter Form zu erzeugen, um Stringmanipulation in der Weiterverarbeitung zu vermeiden.
Die Zeile:
(die Korrektur von bastla am Ende und die Datumsschreibweise beachten!) macht genau das, was Du wolltest: Es wird nur das Datum der letzten Bildmanipulation (Zeile 7 Deines Posts) in der Kamera zurückgegeben - und das nicht ohne Grund: Wenn Du nicht über das RAW-Image zusätzlich in der Kamera verfügst, ist dieses Datum das Bilderstellungsdatum - hat keine Manipulation (Nachbearbeitung) in der Kamera stattgefunden - dann ist 'Creation Date' = 'Modification Date'.
Dein Part wäre es also, das Suchwort für 'findstr' in 'Create Date' zu ändern.
Um eine Befehlszeile in einer Batch-Datei zu nutzen, ist die Schreibweise einiger Variablen anzupassen: %i wird %%i. Sorry, das hatte ich als bekannt vorausgesetzt.
Die vorgeschlagene Variable '%exiftime%' wird adäquat befüllt:
Mit diesen Beispielen hast Du also (bis auf die Variablenschreibweise) bereits zwei fertige Zeilen für eine Batch, die genau das gewünschte liefern.
Wie Du eine Liste der Dateien erzeugst oder ein Logbuch führst, wirst Du wissen.
Bastla hat übrigens ein Beispiel gepostet, das schon mit 'Create Date' arbeitet, außerdem übernimmt es Datum und Uhrzeit als Gesamtstring und zerlegt diesen. Etwas schwerer zu lesen - aber effizienter als 2 Einzeiler (weil <exiftool.exe> nur 1x gerufen wird).
Freundliche Grüße von der Insel - Mario
es ist sicherlich für Dich frustrierend, wenn die Antworten auf Dein Hilfegesuch so (fast) gar nichts mit dem Anliegen zu tun haben scheinen - da kann man schon mal verbal in den Fäkalbereich ausrutschen.
Es is aber ebenso frustrierend für die Helfenden, wenn offensichtlich kaum etwas von dem gelesen wird, was an Hilfestellungen gegeben wurde.
So war die Zeilen
"Um das Datumsformat, wie es von <exiftool.exe> geliefert wird, zu nationalisieren und damit verdaulicher zu machen, genügt ein Blick in die Hilfe des Tools:"
exiftool.exe -d "%d-%m-%Y" Bilddatei
ein Hinweis darauf, wie man bereits das Programm dazu bringen kann, z.B. das Datumsformat in gewünschter Form zu erzeugen, um Stringmanipulation in der Weiterverarbeitung zu vermeiden.
Die Zeile:
for /f "delims=: tokens=2" %i in ('exiftool.exe -d "%m-%d-%Y" "bild 1.tif" ^| findstr /i "modification"') do set exifdate=%i
(die Korrektur von bastla am Ende und die Datumsschreibweise beachten!) macht genau das, was Du wolltest: Es wird nur das Datum der letzten Bildmanipulation (Zeile 7 Deines Posts) in der Kamera zurückgegeben - und das nicht ohne Grund: Wenn Du nicht über das RAW-Image zusätzlich in der Kamera verfügst, ist dieses Datum das Bilderstellungsdatum - hat keine Manipulation (Nachbearbeitung) in der Kamera stattgefunden - dann ist 'Creation Date' = 'Modification Date'.
Dein Part wäre es also, das Suchwort für 'findstr' in 'Create Date' zu ändern.
Um eine Befehlszeile in einer Batch-Datei zu nutzen, ist die Schreibweise einiger Variablen anzupassen: %i wird %%i. Sorry, das hatte ich als bekannt vorausgesetzt.
Die vorgeschlagene Variable '%exiftime%' wird adäquat befüllt:
for /f "delims=: tokens=2" %i in ('exiftool.exe -d "%H:%M:%S" "bild 1.tif" ^| findstr /i "create date"') do set exiftime=%i
Mit diesen Beispielen hast Du also (bis auf die Variablenschreibweise) bereits zwei fertige Zeilen für eine Batch, die genau das gewünschte liefern.
Wie Du eine Liste der Dateien erzeugst oder ein Logbuch führst, wirst Du wissen.
Bastla hat übrigens ein Beispiel gepostet, das schon mit 'Create Date' arbeitet, außerdem übernimmt es Datum und Uhrzeit als Gesamtstring und zerlegt diesen. Etwas schwerer zu lesen - aber effizienter als 2 Einzeiler (weil <exiftool.exe> nur 1x gerufen wird).
Freundliche Grüße von der Insel - Mario
Moin Roschka,
zwei Vorbemerkungen:
- Dies ist ein Forum zur Hilfestellung und für Lösungsvorschläge. Die Helfer erwarten im Gegenzug zumindest, dass der Hilfesuchende genau durchliest, was er angeboten bekommt. Von Dir kommt stattdessen die Frage: 'Woher soll ich das wissen?' Warum? Weil es im vorherigen Post stand! (Variablen im Batch: z.B %i wird %%i)
- Wir sollen unsere Vorschläge erst austesten? Du kannst gern einige hier im Forum beauftragen, Dir eine Software bei exakter Pflichtenheftdefinition entgeltlich zu erstellen, die wird dann nach allen Regeln getestet und dokumentiert. Bis dahin können wir, denke ich, zumindest erwarten, dass Du z.B. einen Parameter wie 'Create Date' nicht in drei verschedenen Schreibweisen (s.o.) den geposteten Befehlszeilen überhilfst und dann noch meinst, unsere Vorschläge seien an den vermurksten Ergebnissen schuld.
Der nachfolgende Mehrzeiler ergibt eine Batch, die die beiden benötigten Tools im Pfad erwartet (der besseren Übersichtlichkeit wegen), ansonsten musst Du das ergänzen.
- Zeilen 2+3 löschen die Hilfsdateien
- Zeilen 4+6 stellen die Codepages um, damit in Zeile 5 Umlaute richtig gelesen werden
- Zeile 5 schreibt alle Bilder (*.jpg, bei Bedarf anpassen) mit Pfad in eine Datei (<flist.dat>), den Pfad bitte anpassen!
- Zeilen 7+8 rufen das <exiftool> mit je einer Zeile aus der <flist.dat>, bei dem Parameterblock wird ausgenutzt, das dieser frei konfigurierbar ist und deswegen gleich die komlette Parameterliste für <filetouch> erzeugt werden kann. Das spart etliche spätere Stringmanipulationen.
- Zeilen 9+10 ersetzen das '#' im Zeitstring durch ':' (sonst würde von der Uhrzeit die Stunde der letzte Eintrag in %%i sein; ggf. mit echo %%i anschauen)
- Zeile 11 schreibt die Datei <tlist.dat>, darin steht für jede Bilddatei die komplette Befehlszeile für <filetouch>.
- Zeile 14 setzt, wenn auskommentiert, <filetouch> für alle Einträge (Zeilen) in <tlist.dat> in Gang.
Achtung: Vor dem Ausführen der Zeile 14 solltest Du genau kontrollieren, ob die Einträge in der <tlist.dat> Deinen Vorstellungen entsprechen, da EXIF-Daten zwar nach Codierung (Position in der Bilddatei), nicht aber nach Umfang und Schlüsselwörtern von nur 2 Herstellern gleich implementiert werden. So ist z.B. der String 'Create Date' vom <exiftool> nicht bei allen gelesenen Bildern zu füllen, weil kein Pendant in der Datei vorhanden ist.
Denke bitte auch daran, wenn Du die <tlist.dat> editiert und ergänzt hast und jetzt die Zeile 14 vom 'rem' befreist, dass Du die Zeilen 3+11 auskommentieren musst, sonst wird die Datei gelöscht!
Die Lösung mit 2 Hilfsdateien wurde gewählt, um Dir die Lesbarkeit zu erleichtern und die Möglichkeit der Nachbearbeitung zu geben.
Viel Erfolg und freundliche Grüße von der Insel - Mario
zwei Vorbemerkungen:
- Dies ist ein Forum zur Hilfestellung und für Lösungsvorschläge. Die Helfer erwarten im Gegenzug zumindest, dass der Hilfesuchende genau durchliest, was er angeboten bekommt. Von Dir kommt stattdessen die Frage: 'Woher soll ich das wissen?' Warum? Weil es im vorherigen Post stand! (Variablen im Batch: z.B %i wird %%i)
- Wir sollen unsere Vorschläge erst austesten? Du kannst gern einige hier im Forum beauftragen, Dir eine Software bei exakter Pflichtenheftdefinition entgeltlich zu erstellen, die wird dann nach allen Regeln getestet und dokumentiert. Bis dahin können wir, denke ich, zumindest erwarten, dass Du z.B. einen Parameter wie 'Create Date' nicht in drei verschedenen Schreibweisen (s.o.) den geposteten Befehlszeilen überhilfst und dann noch meinst, unsere Vorschläge seien an den vermurksten Ergebnissen schuld.
Der nachfolgende Mehrzeiler ergibt eine Batch, die die beiden benötigten Tools im Pfad erwartet (der besseren Übersichtlichkeit wegen), ansonsten musst Du das ergänzen.
@echo off
del flist.dat > NUL
del tlist.dat > NUL
chcp 1252 > NUL
for /f "delims=" %%f in ('dir /s /b "Bildpfad mit Leerzeichen\*.jpg"') do echo "%%f" >> flist.dat
chcp 850 > NUL
for /f "delims=" %%f in (flist.dat) do (
for /f "delims=: tokens=2" %%i in ('exiftool.exe -d "/W /A /C /D %%m-%%d-%%Y /T %%H#%%M#%%S" %%f ^| findstr /i "date"') do (
set tp=%%i
set t=%tp:#=:%
echo %t% %%f >> tlist.dat
)
)
rem for /f "delims=" %%f in (tlist.dat) do filetouch.exe %%f
- Zeilen 2+3 löschen die Hilfsdateien
- Zeilen 4+6 stellen die Codepages um, damit in Zeile 5 Umlaute richtig gelesen werden
- Zeile 5 schreibt alle Bilder (*.jpg, bei Bedarf anpassen) mit Pfad in eine Datei (<flist.dat>), den Pfad bitte anpassen!
- Zeilen 7+8 rufen das <exiftool> mit je einer Zeile aus der <flist.dat>, bei dem Parameterblock wird ausgenutzt, das dieser frei konfigurierbar ist und deswegen gleich die komlette Parameterliste für <filetouch> erzeugt werden kann. Das spart etliche spätere Stringmanipulationen.
- Zeilen 9+10 ersetzen das '#' im Zeitstring durch ':' (sonst würde von der Uhrzeit die Stunde der letzte Eintrag in %%i sein; ggf. mit echo %%i anschauen)
- Zeile 11 schreibt die Datei <tlist.dat>, darin steht für jede Bilddatei die komplette Befehlszeile für <filetouch>.
- Zeile 14 setzt, wenn auskommentiert, <filetouch> für alle Einträge (Zeilen) in <tlist.dat> in Gang.
Achtung: Vor dem Ausführen der Zeile 14 solltest Du genau kontrollieren, ob die Einträge in der <tlist.dat> Deinen Vorstellungen entsprechen, da EXIF-Daten zwar nach Codierung (Position in der Bilddatei), nicht aber nach Umfang und Schlüsselwörtern von nur 2 Herstellern gleich implementiert werden. So ist z.B. der String 'Create Date' vom <exiftool> nicht bei allen gelesenen Bildern zu füllen, weil kein Pendant in der Datei vorhanden ist.
Denke bitte auch daran, wenn Du die <tlist.dat> editiert und ergänzt hast und jetzt die Zeile 14 vom 'rem' befreist, dass Du die Zeilen 3+11 auskommentieren musst, sonst wird die Datei gelöscht!
Die Lösung mit 2 Hilfsdateien wurde gewählt, um Dir die Lesbarkeit zu erleichtern und die Möglichkeit der Nachbearbeitung zu geben.
Viel Erfolg und freundliche Grüße von der Insel - Mario
Moin,
Ich nehme mir mal eine zeile heraus.
Wie definierst du profi?
Die riege von steve wozniak, wenn ja hast du vielleicht recht.
Ein profi, der sich hierherverirrt und anderen gratis und des problemloesueng finden wegen hilft, ist eine ganz andere liga.
Denn wir heinis haben allesamt unseren profistatus dadurch erlangt, das wir aus fremden beispielen abgekupfert und gelernt haben.
Also mehr oder weniger - nur der, dessen erstes programm kein hallo welt problem geloest hat, sondern der der die hilfe geschrieben hat fuer die befehle mit denen man hallo welt ausgeben kann - der ist so ausserirdisch, dass er noch nie anfaenger war, sondern gleich profi.
Gruss.
@ mak-xxl
Wenn ichs noch nicht geschrieben habe, willkommen im club und hochachtung vor deiner ausdauer !
Ich nehme mir mal eine zeile heraus.
(ein Profi nimmt als selbstverständlich an, was ein Anfänger nicht wissen kann
Wie definierst du profi?
Die riege von steve wozniak, wenn ja hast du vielleicht recht.
Ein profi, der sich hierherverirrt und anderen gratis und des problemloesueng finden wegen hilft, ist eine ganz andere liga.
Denn wir heinis haben allesamt unseren profistatus dadurch erlangt, das wir aus fremden beispielen abgekupfert und gelernt haben.
Also mehr oder weniger - nur der, dessen erstes programm kein hallo welt problem geloest hat, sondern der der die hilfe geschrieben hat fuer die befehle mit denen man hallo welt ausgeben kann - der ist so ausserirdisch, dass er noch nie anfaenger war, sondern gleich profi.
Gruss.
@ mak-xxl
Wenn ichs noch nicht geschrieben habe, willkommen im club und hochachtung vor deiner ausdauer !
[OT]
Hallo Roschka!
Grüße
bastla
[/OT]
Hallo Roschka!
Somit verlor ich ALLES Geschriebene, weil eine "Anmeldung erforderlich Meldung" dazwischen kam...
Daher muß ich alles vorhin geschriebene komplett neu durchdenken und schreiben.
Bei der nächsten derartigen Gelegenheit nach der Anmeldung einfach im Browser "zurückgehen" (zB mit der Taste "Backspace") und neu senden ...Daher muß ich alles vorhin geschriebene komplett neu durchdenken und schreiben.
Grüße
bastla
[/OT]
Moin Roschka,
schön, dass Du Dich zurückmeldest, wenn es auch etwas arbeitsintensiver war, aber dazu hat bastla die zukünftige Lösung gepostet.
Zunächst noch einmal Grundsätzliches:
- Du wolltest ursprünglich (und wohl immer noch) den Bilddateien auf Deinem Rechner das EXIF-Datum verpassen, wenn diese Dateien nicht dieses Datum (sichtbar) besitzen.
- das Ganze soll erstmal mittels Batch-Datei(en) gelöst werden, deren Details und/oder Aufbau noch nicht so ganz klar sind.
- Die Bedienung soll letztendlich per Drag'nDrop oder per Shell-Eintrag stattfinden.
Bis hierher alles gut und richtig.
ABER:
- wenn man an die Basis des Dateimanagements geht (Datumseinträge verändern), dann:
- müssen die Tools im Automatikbetrieb völlig fehlerfrei oder, besser, völlig fehlertolerant arbeiten (also im Zweifelsfalle nichts verändern).
- eine solide Basis an Daten (korrektes und sinnfälliges Datum/Zeit) vorfinden) - ich schrieb es schon und Du hast es herausgefunden - EXIF kann unvollständig sein.
Wenn dann noch ein unsicherer User (kein 'Batchelor') und Fernhilfe zusammenkommt ...
Und jetzt nochmal (kurz) zu meinem Vorschlag vom 20.03.2012:
Das funktioniert weder per Drag'nDrop noch per Shell - sondern die Batchdatei (nennen wir sie <exifdt.cmd> wird explizit vom Anwender gerufen und, jetzt noch ein wenig konkreter, sie steht zusammen mit den Dateien <exiftool.exe> und <filetouch.exe> z. B. im Verzeichnis 'C:\Temp'.
Der Pfad in Zeile 5 wird dann von Dir zunächst angepasst auf einen tatsächlich vorhandenen Bildpfad (i.e. 'X:\Archiv\Bilder\Canon EOS\2011\Urlaub Seychellen'), also ein Beispiel mit Leerzeichen. Von diesem gesamten Ordner sollte ein geprüftes Backup existieren!
Der erste Probelauf generiert jetzt im Arbeitsverzeichnis ( 'C:\Temp') eine Datei <flist.dat> (= filelist), in der samt Pfad alle zum Suchmuster passend gefundene Dateien aufgelistet sein sollten.
Und jetzt kommst Du: Kontrolliere die gelisteten Dateien auf: Alle?, Gewünschte?, Unerwünschte? Unterverzeichnisse? etc. pp.
Die zweite entstandene Datei <tlist.dat> (=touchlist) enthält für jede gefundene Datei den per EXIF ermittelten Datums-/Zeiteintrag - wahrscheinlich aber nicht für alle (vor allem, wenn die Dateien aus verschiedenen Quellen stammen) - hier musst Du detailliert kontrollieren.
Und genau das macht das (natürlich getestete, andernfalls wäre vermerkt 'ungetestet') Script.
Genau das und bis hierher solltest Du testen und berichten, dann kann man den nächsten Schritt in Angriff nehmen.
Freundliche Grüße von der Insel - Mario
schön, dass Du Dich zurückmeldest, wenn es auch etwas arbeitsintensiver war, aber dazu hat bastla die zukünftige Lösung gepostet.
Zunächst noch einmal Grundsätzliches:
- Du wolltest ursprünglich (und wohl immer noch) den Bilddateien auf Deinem Rechner das EXIF-Datum verpassen, wenn diese Dateien nicht dieses Datum (sichtbar) besitzen.
- das Ganze soll erstmal mittels Batch-Datei(en) gelöst werden, deren Details und/oder Aufbau noch nicht so ganz klar sind.
- Die Bedienung soll letztendlich per Drag'nDrop oder per Shell-Eintrag stattfinden.
Bis hierher alles gut und richtig.
ABER:
- wenn man an die Basis des Dateimanagements geht (Datumseinträge verändern), dann:
- müssen die Tools im Automatikbetrieb völlig fehlerfrei oder, besser, völlig fehlertolerant arbeiten (also im Zweifelsfalle nichts verändern).
- eine solide Basis an Daten (korrektes und sinnfälliges Datum/Zeit) vorfinden) - ich schrieb es schon und Du hast es herausgefunden - EXIF kann unvollständig sein.
Wenn dann noch ein unsicherer User (kein 'Batchelor') und Fernhilfe zusammenkommt ...
Und jetzt nochmal (kurz) zu meinem Vorschlag vom 20.03.2012:
@echo off
del flist.dat > NUL
del tlist.dat > NUL
chcp 1252 > NUL
for /f "delims=" %%f in ('dir /s /b "Bildpfad mit Leerzeichen\*.jpg"') do echo "%%f" >> flist.dat
chcp 850 > NUL
for /f "delims=" %%f in (flist.dat) do (
for /f "delims=: tokens=2" %%i in ('exiftool.exe -d "/W /A /C /D %%m-%%d-%%Y /T %%H#%%M#%%S" %%f ^| findstr /i "date"') do (
set tp=%%i
set t=%tp:#=:%
echo %t% %%f >> tlist.dat
)
)
rem for /f "delims=" %%f in (tlist.dat) do filetouch.exe %%f
Das funktioniert weder per Drag'nDrop noch per Shell - sondern die Batchdatei (nennen wir sie <exifdt.cmd> wird explizit vom Anwender gerufen und, jetzt noch ein wenig konkreter, sie steht zusammen mit den Dateien <exiftool.exe> und <filetouch.exe> z. B. im Verzeichnis 'C:\Temp'.
Der Pfad in Zeile 5 wird dann von Dir zunächst angepasst auf einen tatsächlich vorhandenen Bildpfad (i.e. 'X:\Archiv\Bilder\Canon EOS\2011\Urlaub Seychellen'), also ein Beispiel mit Leerzeichen. Von diesem gesamten Ordner sollte ein geprüftes Backup existieren!
Der erste Probelauf generiert jetzt im Arbeitsverzeichnis ( 'C:\Temp') eine Datei <flist.dat> (= filelist), in der samt Pfad alle zum Suchmuster passend gefundene Dateien aufgelistet sein sollten.
Und jetzt kommst Du: Kontrolliere die gelisteten Dateien auf: Alle?, Gewünschte?, Unerwünschte? Unterverzeichnisse? etc. pp.
Die zweite entstandene Datei <tlist.dat> (=touchlist) enthält für jede gefundene Datei den per EXIF ermittelten Datums-/Zeiteintrag - wahrscheinlich aber nicht für alle (vor allem, wenn die Dateien aus verschiedenen Quellen stammen) - hier musst Du detailliert kontrollieren.
Und genau das macht das (natürlich getestete, andernfalls wäre vermerkt 'ungetestet') Script.
Genau das und bis hierher solltest Du testen und berichten, dann kann man den nächsten Schritt in Angriff nehmen.
Freundliche Grüße von der Insel - Mario
Hallo Roschka!
[OT]
Beschwerst Du Dich jetzt allen Ernstes ("fand ich nach langem Herumprobieren heraus") darüber, dass Du zur Lösung Deines Problems Dich selbst mit einem Tool (von dem Du bis jetzt nur einen Namen, aber nicht etwa Hersteller, Versionsnummer, Downloadlink genannt hast) beschäftigen musstest? (Naja, im Hinblick darauf, dass schon der Threadtitel - so wie viele Deiner Sätze - mit "Ich" beginnt ...)
[/OT]
Da Du jetzt gerne Vorschläge hättest - hier ist einer: Poste Deine Erkenntnisse in vernünftiger Form, zB als Ausgabe von
und das daraus gewünschte Ergebnis, und dann schaun mer mal (oder auch nicht) ...
Grüße
bastla
[OT]
Beschwerst Du Dich jetzt allen Ernstes ("fand ich nach langem Herumprobieren heraus") darüber, dass Du zur Lösung Deines Problems Dich selbst mit einem Tool (von dem Du bis jetzt nur einen Namen, aber nicht etwa Hersteller, Versionsnummer, Downloadlink genannt hast) beschäftigen musstest? (Naja, im Hinblick darauf, dass schon der Threadtitel - so wie viele Deiner Sätze - mit "Ich" beginnt ...)
[/OT]
Da Du jetzt gerne Vorschläge hättest - hier ist einer: Poste Deine Erkenntnisse in vernünftiger Form, zB als Ausgabe von
exiftool -DateCreated -d %%H:%%M:%%S -S %1 | findstr /i "date"
Grüße
bastla
Moin Roschka,
ich hatte in meinem ersten Post meine Version so kenntlich gemacht: <exiftool> - also als Link. Den habe ich jetzt kontrolliert - leider ohne Funktion. In diesem Sinne bin ich schuldig, weil von Dir kein Widerspruch und damit für mich die Rede und Verwendung vom gleichen Tool gegeben war.
Wenn Du Dir die Mühe machen willst, mit dem von mir verwendeten Tool (muss nicht installiert werden) mal einen Versuch zu machen - gerne. Ich werde im Gegenzug mal das von Dir verwendete Tool auf Herz und Nieren prüfen (wenn ich es finde ...).
Die Probleme, die Du in dem letzten Post schilderst, sind übrigens in der von mir ursprünglich geposteten Variante bereits gelöst (siehe Hinweise zu '#=:'), nur eben mit anderem <exiftool>. Und nachdem Du herausgefunden hast, wie komplex das Thema Datum/Zeit aus EXIF-Daten ist, verstehst Du evtl. auch meine vorsichtige Gangart in Richtung Veränderung von Dateieigenschaften - ich habe mit diesem Zeugs seit vielen Jahren im medizinischen Bereich (PACS/DICOM) zu tun.
Leider kann ich aus zeitlichen Gründen erst ab heute abend dieser Sache wieder nachgehen.
Freundliche Grüße von der Insel - Mario
ich hatte in meinem ersten Post meine Version so kenntlich gemacht: <exiftool> - also als Link. Den habe ich jetzt kontrolliert - leider ohne Funktion. In diesem Sinne bin ich schuldig, weil von Dir kein Widerspruch und damit für mich die Rede und Verwendung vom gleichen Tool gegeben war.
Wenn Du Dir die Mühe machen willst, mit dem von mir verwendeten Tool (muss nicht installiert werden) mal einen Versuch zu machen - gerne. Ich werde im Gegenzug mal das von Dir verwendete Tool auf Herz und Nieren prüfen (wenn ich es finde ...).
Die Probleme, die Du in dem letzten Post schilderst, sind übrigens in der von mir ursprünglich geposteten Variante bereits gelöst (siehe Hinweise zu '#=:'), nur eben mit anderem <exiftool>. Und nachdem Du herausgefunden hast, wie komplex das Thema Datum/Zeit aus EXIF-Daten ist, verstehst Du evtl. auch meine vorsichtige Gangart in Richtung Veränderung von Dateieigenschaften - ich habe mit diesem Zeugs seit vielen Jahren im medizinischen Bereich (PACS/DICOM) zu tun.
Leider kann ich aus zeitlichen Gründen erst ab heute abend dieser Sache wieder nachgehen.
Freundliche Grüße von der Insel - Mario
Moin Roschka,
nun denn - herzlich willkommen in der Welt der Zerwirrnis, also der Rechnerwelt.
Teste also mal bitte das Tool (so wie mit Post vom 29.03.2012, 15:08:37 vorgeschlagen), am besten mit einem Bildverzeichnis mit ca. 10 Dateien und poste danach die Inhalte der erzeugten <*.dat>.
Die <exiftool(-k).exe> kannst Du in <exiftool.exe> umbenennen, den Sinn des Originalnamens 'kriejen wa später ...'.
Freundliche Grüße von der Insel - Mario
nun denn - herzlich willkommen in der Welt der Zerwirrnis, also der Rechnerwelt.
Teste also mal bitte das Tool (so wie mit Post vom 29.03.2012, 15:08:37 vorgeschlagen), am besten mit einem Bildverzeichnis mit ca. 10 Dateien und poste danach die Inhalte der erzeugten <*.dat>.
Die <exiftool(-k).exe> kannst Du in <exiftool.exe> umbenennen, den Sinn des Originalnamens 'kriejen wa später ...'.
Freundliche Grüße von der Insel - Mario
Moin Roschka,
das Detailproblem mit den überflüssigen Leerzeichen (trailing blanks) kannst du auf mehrere Arten lösen:
Grüße
Biber
das Detailproblem mit den überflüssigen Leerzeichen (trailing blanks) kannst du auf mehrere Arten lösen:
for /f "delims=: tokens=2,3,4" %%i in ('exiftool.exe -d "%%m-%%d-%%Y" -DateCreated %1 ^| findstr /i "Created"') do (
(set jahr=%%i) & (set monat=%%j) & (set tag=%%k)
)
set "newdate=%monat%-%tag%-%jahr%"
:: -- oder --
for /f "delims=: tokens=2,3,4" %%i in ('exiftool.exe -d "%%m-%%d-%%Y" -DateCreated %1 ^| findstr /i "Created"') do (
set "jahr=%%i" & set "monat=%%j" & set "tag=%%k"
)
set "newdate=%monat%-%tag%-%jahr%"
:: -- oder, das naheliegendste
for /f "delims=: tokens=2,3,4" %%i in ('exiftool.exe -d "%%m-%%d-%%Y" -DateCreated %1 ^| findstr /i "Created"') do (
set "newdate=%%j%-%%k-%%i"
)
Grüße
Biber
Hallo Roschka!
Da sich ja nach "DateCreated:" noch ein Leerzeichen befindet, dieses aber nicht als Delimiter festgelegt wurdr, muss es ja vor der Jahreszahl erhalten bleiben - daher:
Grüße
bastla
Da sich ja nach "DateCreated:" noch ein Leerzeichen befindet, dieses aber nicht als Delimiter festgelegt wurdr, muss es ja vor der Jahreszahl erhalten bleiben - daher:
for /F "tokens=2,3,4 delims=: " %%i in ('exiftool.exe -d "%m-%d-%Y" -DateCreated 872141.jpg | findstr /i "Created"') do set "newdate=%%j-%%k-%%i"
bastla
Hallo Roschka!
Hinsichtlich des Datumsvergleiches kenne ich für Batch keine sinnvolle Alternative zur angesprochenen Umwandlung in das Format "JJJJMMTT" - das lässt sich zwar auch unmittelbar in der zweiten Schleife realisieren (womit nur der erste Datumswert in eine eigene Variable gestellt werden müsste), ist aber mit 2 Datumsvariablen sicher übersichtlicher ...
Grüße
bastla
Und dann wüßte ich gern wie man herausfindet daß ein Datum leer, also nicht vorhanden ist
Wenn Du vorweg die Variable löschst, kannst Du nach der (versuchten) Zuweisung feststellen, ob sie jetzt existiert:set "newdate="
for /F "tokens=2,3,4 delims=: " %%i in ('exiftool.exe -d "%m-%d-%Y" -DateCreated 872141.jpg | findstr /i "Created"') do set "newdate=%%j-%%k-%%i"
if defined newdate echo Datum gefunden
Grüße
bastla
Hallo Roschka!
Wenn Du per
einen Sprung durchgeführt hast, erreichst Du die folgende Zeile im Batch ohnehin nur, wenn %newdate% existiert - also eigentlich kein zusätzlicher Code erforderlich ...
Soferne in beiden Fällen Aktionen durchzuführen sind, kannst Du auch "
oder auch
Grüße
bastla
P.S.:
sollte nie funktioniert haben - wenn, dann
denn es muss bei einem Vergleich auf beiden Seiten des Vergleichsoperators zumindest "irgendetwas" stehen ...
Wenn Du per
if not defined newdate goto anderswo
Soferne in beiden Fällen Aktionen durchzuführen sind, kannst Du auch "
else
" verwenden:if defined newdate (echo %newdate% erstellt) else (echo Kein Datum gefunden)
if defined newdate (
echo %newdate% erstellt
echo Eintragung wird vorgenommen
) else (
echo Kein Datum gefunden
)
bastla
P.S.:
if newdate="" echo Datum ist leer
if "%newdate%"=="" echo Datum ist leer