Automatisiertes -verteilen- von Dateien in Ordnern anhand von Dateiinfos
evtl. mit Batch-Skript
Hallo an alle,
ich bin während einiger Programmierprobleme immer mal wieder über diese Seite gestolpert, die mir auch schon einige male weiterhelfen konnte.
Jetzt hab ich aber ein Problem, was weder hier noch irgendwo sonst (für mich auffindbar ^^) gelöst wird.
Und zwar habe ich, wenn ich Bilddateien direkt von meiner Digitalkamera runterlade, alle Dateien in einem Ordner. Diese hätte ich gerne verteilt auf Unterordner, die das Datum des Aufnahmetages tragen (JJJJ/MM/DD) (evtl. auch noch unterteilt in Monate...das wäre aber ein Zusatz).
Ich weiß durchaus, dass es Programme gibt, die die Bilder von der Digitalkamera direkt in eine solche Ordnerstruktur bringen. Oft werden sie dabei aber mindestens umbenannt, und es finden sich weitere Ordner/Dateien, mit Miniaturansichten etc. die ich löschen müsste.
Das größte Problem daran ist aber, dass Dateien, die man bereits auf dem Rechner hat (weil man sie einfach von der Kamera direkt rüberkopiert hat) und jetzt in eines dieser Programme legt, nicht in eine passende Ordnerstruktur verschoben werden (was natürlich meistens gewünscht ist, aber es findet sich kein Programm, bei dem man sowas umstellen könnte)
Und da ich jetzt für einige Zeit mit der Kamera unterwegs sein werde (ohne eigenen Laptop) und ich die Bilder immer nur in InternetCafes von der Kamera auf ein externes Speichermedium laden werde hätte ich gerne ein Programm/Script, welches mir nach Rückkehr die Einteilung erleichtert/abnimmt.
Und zwar hatte ich mir das so vorgestellt, dass das Script aus allen Dateien in einem angegebenen Ordner das Aufnahmedatum aus den Dateiinfos liest, und sie entsprechend auf vorhanden Ordner verteilt bzw. neue Ordner erstellt.
Das Problem für mich ist jetzt nur, wie ich an den Wert aus den Dateiinfos rankomme?!
Es scheint dafür zwar Visual Basic Möglichkeiten zu geben, aber davon habe ich überhaupt keine Ahnung, wäre also über jede Hilfe äußerst dankbar.
Bei einem Batch-Script wäre es natürlich vorteilhaft, wenn man das Script einfach in den Ordner legt, in dem die Dateien liegen und dieses Script ausführt.
Ich würde mich über jede Hilfe freuen und stehe selbstverständlich auch für Rückfragen bzw. Programmtips zur Verfügung.
Im vorraus schon einmal Danke!!
Hallo an alle,
ich bin während einiger Programmierprobleme immer mal wieder über diese Seite gestolpert, die mir auch schon einige male weiterhelfen konnte.
Jetzt hab ich aber ein Problem, was weder hier noch irgendwo sonst (für mich auffindbar ^^) gelöst wird.
Und zwar habe ich, wenn ich Bilddateien direkt von meiner Digitalkamera runterlade, alle Dateien in einem Ordner. Diese hätte ich gerne verteilt auf Unterordner, die das Datum des Aufnahmetages tragen (JJJJ/MM/DD) (evtl. auch noch unterteilt in Monate...das wäre aber ein Zusatz).
Ich weiß durchaus, dass es Programme gibt, die die Bilder von der Digitalkamera direkt in eine solche Ordnerstruktur bringen. Oft werden sie dabei aber mindestens umbenannt, und es finden sich weitere Ordner/Dateien, mit Miniaturansichten etc. die ich löschen müsste.
Das größte Problem daran ist aber, dass Dateien, die man bereits auf dem Rechner hat (weil man sie einfach von der Kamera direkt rüberkopiert hat) und jetzt in eines dieser Programme legt, nicht in eine passende Ordnerstruktur verschoben werden (was natürlich meistens gewünscht ist, aber es findet sich kein Programm, bei dem man sowas umstellen könnte)
Und da ich jetzt für einige Zeit mit der Kamera unterwegs sein werde (ohne eigenen Laptop) und ich die Bilder immer nur in InternetCafes von der Kamera auf ein externes Speichermedium laden werde hätte ich gerne ein Programm/Script, welches mir nach Rückkehr die Einteilung erleichtert/abnimmt.
Und zwar hatte ich mir das so vorgestellt, dass das Script aus allen Dateien in einem angegebenen Ordner das Aufnahmedatum aus den Dateiinfos liest, und sie entsprechend auf vorhanden Ordner verteilt bzw. neue Ordner erstellt.
Das Problem für mich ist jetzt nur, wie ich an den Wert aus den Dateiinfos rankomme?!
Es scheint dafür zwar Visual Basic Möglichkeiten zu geben, aber davon habe ich überhaupt keine Ahnung, wäre also über jede Hilfe äußerst dankbar.
Bei einem Batch-Script wäre es natürlich vorteilhaft, wenn man das Script einfach in den Ordner legt, in dem die Dateien liegen und dieses Script ausführt.
Ich würde mich über jede Hilfe freuen und stehe selbstverständlich auch für Rückfragen bzw. Programmtips zur Verfügung.
Im vorraus schon einmal Danke!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 82223
Url: https://administrator.de/contentid/82223
Ausgedruckt am: 22.11.2024 um 07:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo Xenesis und willkommen im Forum!
Falls es nur darum ginge, die Bilder nach dem Speicherdatum auf Ordner zu verteilen, könntest Du es mit folgendem Batch versuchen:
Verwendet werden kann der Batch entweder, indem er im Ordner mit den zu verteilenden Bildern abgelegt und von dort aufgerufen wird, oder, indem der Ordner mit den Bildern auf die Batchdatei gezogen wird (Drag & Drop).
Anzupassen ist natürlich vorweg der Zielordner - in diesem werden die einzelnen "Tagesordner" (im Format "JJJJ-MM-TT") erstellt.
Grüße
bastla
Falls es nur darum ginge, die Bilder nach dem Speicherdatum auf Ordner zu verteilen, könntest Du es mit folgendem Batch versuchen:
@echo off & setlocal
set "Ziel=D:\Bildarchiv"
if "%~1" neq "" pushd %1
for %%i in (*.jpg) do (
for /f "tokens=1-3 delims=. " %%a in ("%%~ti") do (
if not exist "%Ziel%\%%c-%%b-%%a" md "%Ziel%\%%c-%%b-%%a"
move %%i "%Ziel%\%%c-%%b-%%a\"
)
)
if "%~1" neq "" popd
Verwendet werden kann der Batch entweder, indem er im Ordner mit den zu verteilenden Bildern abgelegt und von dort aufgerufen wird, oder, indem der Ordner mit den Bildern auf die Batchdatei gezogen wird (Drag & Drop).
Anzupassen ist natürlich vorweg der Zielordner - in diesem werden die einzelnen "Tagesordner" (im Format "JJJJ-MM-TT") erstellt.
Grüße
bastla
Hallo Xenesis!
Um aber sicher zu gehen und tatsächlich das im Explorer angezeigte Datum von "Bild aufgenommen am" zu verwenden, muss ein wenig VBS eingebunden werden - dann könnte das so aussehen:
Auch hier gilt: Ordner als Argument (am einfachsten per Drag & Drop, aber auch per Kommandozeilenaufruf möglich) an den Batch übergeben oder Batchdatei im Bildordner platzieren und von dort starten.
Verschoben werden durch diesen Batch nur (Bild-)Dateien mit einem "Aufnahmedatum" (daher also zB die Batchdatei selbst nicht).
Das (temporäre) VBScript ist übrigens eine angepasste Version des in diesem Artikel beschriebenen Scripts zum Auslesen der "erweiterten Dateieigenschaften".
Falls Du die "for"-Schleifen noch nicht entziffert hast:
Die (neue) erste Schleife ruft das VBScript mit Übergabe des zu bearbeitenden Ordners auf und erhält für jede Datei als Ergebnis "Dateiname$Aufnahmedatum", wobei das Aufnahmedatum das Format "TT.MM.JJJJ" aufweisen sollte. Anmerkung: Das Trennzeichen "$" darf im Dateinamen selbst nicht vorkommen - sollte das doch der Fall sein, kann in der Zeile "set Delim=$" ein anderes Zeichen eingetragen werden - um Problemen vorzubeugen, sollte dies mit einem Editor erfolgen, welcher ASCII (nicht ANSI, wie zB der Windows-Editor) als Codierung verwendet.
Das Ergebnis wird in die beiden Teile ("token") %%i und %%j zerlegt. Nur falls %%j nicht leer ist (also ein Aufnahmedatum ausgelesen werden konnte), wird die Datei bearbeitet, und dazu mit der zweiten Schleife anhand des Trennzeichens "." das Datum in die Bestandteile %%a (=TT), %%b (=MM) und %%c (=JJJJ) zerlegt.
Mit dem Rest kommst Du sicher alleine klar ...
Abschließend noch eine Einschränkung: Gestestet auf XP Pro, so vermutlich nicht unter Vista lauffähig (jedenfalls nicht mit "25" im Script, vielleicht mit "12" - siehe Liste hier ) ...
Grüße
bastla
verteilt das script die Dateine nach dem Speicherdatum auf dem Rechner, oder nach dem Speicherdatum auf der Kamera(=Aufnahmedatum)?
Sollte letzteres sein (= Änderungsdatum), nicht das Erstellungsdatum (= erstes Speichern am Rechner).Um aber sicher zu gehen und tatsächlich das im Explorer angezeigte Datum von "Bild aufgenommen am" zu verwenden, muss ein wenig VBS eingebunden werden - dann könnte das so aussehen:
@echo off & setlocal
set "Ziel=D:\Bildarchiv"
set "Quelle=%~f1"
if "%Quelle%"=="" set "Quelle=%~dp0"
set Delim=$
set G=%temp%\GetDatePicTaken.vbs
echo Set Fld=CreateObject("Shell.Application").Namespace(WScript.Arguments(0))>%G%
echo For Each F In Fld.Items:WScript.Echo F^&"%Delim%"^&Left(Fld.GetDetailsOf(F,25),10):Next>>%G%
for /f "tokens=1-2 delims=%Delim%" %%i in ('cscript //nologo %G% "%Quelle%"') do (
if "%%j" neq "" (
for /f "tokens=1-3 delims=. " %%a in ("%%j") do (
if not exist "%Ziel%\%%c-%%b-%%a" md "%Ziel%\%%c-%%b-%%a"
move "%Quelle%\%%i" "%Ziel%\%%c-%%b-%%a\"
)
)
)
Verschoben werden durch diesen Batch nur (Bild-)Dateien mit einem "Aufnahmedatum" (daher also zB die Batchdatei selbst nicht).
Das (temporäre) VBScript ist übrigens eine angepasste Version des in diesem Artikel beschriebenen Scripts zum Auslesen der "erweiterten Dateieigenschaften".
Falls Du die "for"-Schleifen noch nicht entziffert hast:
Die (neue) erste Schleife ruft das VBScript mit Übergabe des zu bearbeitenden Ordners auf und erhält für jede Datei als Ergebnis "Dateiname$Aufnahmedatum", wobei das Aufnahmedatum das Format "TT.MM.JJJJ" aufweisen sollte. Anmerkung: Das Trennzeichen "$" darf im Dateinamen selbst nicht vorkommen - sollte das doch der Fall sein, kann in der Zeile "set Delim=$" ein anderes Zeichen eingetragen werden - um Problemen vorzubeugen, sollte dies mit einem Editor erfolgen, welcher ASCII (nicht ANSI, wie zB der Windows-Editor) als Codierung verwendet.
Das Ergebnis wird in die beiden Teile ("token") %%i und %%j zerlegt. Nur falls %%j nicht leer ist (also ein Aufnahmedatum ausgelesen werden konnte), wird die Datei bearbeitet, und dazu mit der zweiten Schleife anhand des Trennzeichens "." das Datum in die Bestandteile %%a (=TT), %%b (=MM) und %%c (=JJJJ) zerlegt.
Mit dem Rest kommst Du sicher alleine klar ...
Abschließend noch eine Einschränkung: Gestestet auf XP Pro, so vermutlich nicht unter Vista lauffähig (jedenfalls nicht mit "25" im Script, vielleicht mit "12" - siehe Liste hier ) ...
Grüße
bastla
Hallo Xenesis!
Vorweg zur Erklärung des VBScripts - das könnte auch so aussehen:
Zeile 1 erzeugt das Objekt "Fld" (Folder) aufgrund des beim Aufruf übernommenen Arguments (nullbasiert, daher Index 0 = erstes Argument).
Danach folgt eine Schleife über alle Items von "Fld" (= über alle Dateien des Ordners) , wobei das jeweils betrachtete Item über die Objektvariable "F" (File) angesprochen wird.
"WScript.Echo" sorgt für eine Ausgabe (bei Aufruf des Scripts über "cscript.exe" über StdOut, bei Verwendung von "wscript.exe" als MsgBox) des Dateinamens, des Trennzeichens und der ersten 10 Stellen (= nur Datumsanteil) des Aufnahmedatums (soferne verfügbar, ansonsten wird ein Leerstring ausgegeben).
"Next" zeigt das Schleifenende an.
VBS wird (wie alle anderen VB-Varianten) zeilenweise interpretiert / compiliert, allerdings lassen sich durch Verwendung von ":" als Trennzeichen auch mehrere "Zeilen" zusammenfassen, was ich eben genutzt habe, um das Ganze auf nur 2 Zeilen zu komprimieren.
Zum Testen solltest Du eine Commandshell öffnen ("Start / Ausführen... / cmd") und den Batch von dort aus starten - mit
kannst Du zB vorher in den Ordner "D:\Bilder" wechseln, oder Du gibst den Ordner beim Aufruf des Batches als Argument an - Beispiel: Wenn Du den Batch etwa als "MovePics.bat" gespeichert hast, lautet die Befehlszeile
Damit Du mehr vom Ablauf erkennen kannst, ändere das "echo off" auf ein "echo on" - so wird jeder Befehl vor der Ausführung erst einmal angezeigt, und Du kannst nachvollziehen, ob zB tatsächlich die erwarteten Daten vom VBScript geliefert werden, etc.
Wenn Du beim Aufruf des Batches noch eine Umleitung der Ausgabe vornimmst, etwa
kannst Du die Bildschirmausgabe in der Datei "Log.txt" speichern.
Solltest Du selbst nicht daraus schlau werden, kannst Du natürlich gern den relevanten Teil (den ersten Schleifendurchlauf) posten.
Grüße
bastla
Vorweg zur Erklärung des VBScripts - das könnte auch so aussehen:
Set Fld = CreateObject("Shell.Application").Namespace(WScript.Arguments(0))
For Each F In Fld.Items
WScript.Echo F & "%Delim%" & Left(Fld.GetDetailsOf(F,25),10)
Next
Danach folgt eine Schleife über alle Items von "Fld" (= über alle Dateien des Ordners) , wobei das jeweils betrachtete Item über die Objektvariable "F" (File) angesprochen wird.
"WScript.Echo" sorgt für eine Ausgabe (bei Aufruf des Scripts über "cscript.exe" über StdOut, bei Verwendung von "wscript.exe" als MsgBox) des Dateinamens, des Trennzeichens und der ersten 10 Stellen (= nur Datumsanteil) des Aufnahmedatums (soferne verfügbar, ansonsten wird ein Leerstring ausgegeben).
"Next" zeigt das Schleifenende an.
VBS wird (wie alle anderen VB-Varianten) zeilenweise interpretiert / compiliert, allerdings lassen sich durch Verwendung von ":" als Trennzeichen auch mehrere "Zeilen" zusammenfassen, was ich eben genutzt habe, um das Ganze auf nur 2 Zeilen zu komprimieren.
Zum Testen solltest Du eine Commandshell öffnen ("Start / Ausführen... / cmd") und den Batch von dort aus starten - mit
cd /d "D:\Dein Bilderordner"
MovePics "D:\Dein Bilderordner"
Damit Du mehr vom Ablauf erkennen kannst, ändere das "echo off" auf ein "echo on" - so wird jeder Befehl vor der Ausführung erst einmal angezeigt, und Du kannst nachvollziehen, ob zB tatsächlich die erwarteten Daten vom VBScript geliefert werden, etc.
Wenn Du beim Aufruf des Batches noch eine Umleitung der Ausgabe vornimmst, etwa
MovePics "D:\Dein Bilderordner" > Log.txt
Solltest Du selbst nicht daraus schlau werden, kannst Du natürlich gern den relevanten Teil (den ersten Schleifendurchlauf) posten.
Grüße
bastla
@bastla
Weil es ja manchmal ausufert...
Ist Euch übrigens schon aufgefallen, dass M$ diese Extended File Attributes noch nie so richtig gepusht hat und noch nie als den Hit überhaupt auf den Titelseiten der Hochglanzprospekte zu platzieren versucht hat??
Wenn ich die (dort unkommentierte) Attribut-Mapping-Arie für W2000, XP und Vi$ta in dem KiX-Schnipsel lese, kann ich gar nicht so schnell essen, wie ich ### möchte.
Grüße
Biber
[Edit] Ach was, ich poste das mal.. vielleicht finden es andere auch aussagekräftig..
[/Edit]
...kannst Du natürlich gern den relevanten Teil (den ersten Schleifendurchlauf) posten.
Ich habe sicherheitshalber schon mal 532 Zentimeter Platz unterhalb meines Kommentars vorgesehen... Weil es ja manchmal ausufert...
Ist Euch übrigens schon aufgefallen, dass M$ diese Extended File Attributes noch nie so richtig gepusht hat und noch nie als den Hit überhaupt auf den Titelseiten der Hochglanzprospekte zu platzieren versucht hat??
Wenn ich die (dort unkommentierte) Attribut-Mapping-Arie für W2000, XP und Vi$ta in dem KiX-Schnipsel lese, kann ich gar nicht so schnell essen, wie ich ### möchte.
Grüße
Biber
[Edit] Ach was, ich poste das mal.. vielleicht finden es andere auch aussagekräftig..
;Attribute tables
;
;Windows XP
;Windows Server 2003 Windows 2000 ;Windows Vista
;------------------------------------------- ;-------------------------------------------
;0 Name Name ; 0 Name
;1 Size Size ; 1 Size
;2 Type Type ; 2 Type
;3 Date Modified Date Modified ; 3 Date modified
;4 Date Created Attributes ; 4 Date created
;5 Date Accessed Comment ; 5 Date accessed
;6 Attributes Date Created ; 6 Attributes
;7 Status Date Accessed ; 7 Offline status
;8 Owner Owner ; 8 Offline availability
;9 Author ??? ; 9 Perceived type
;10 Title Author ; 10 Owner
;11 Subject Title ; 11 Kinds
;12 Category Subject ; 12 Date taken
;13 Pages Category ; 13 Artists
;14 Comments Pages ; 14 Album
;15 Copyright Copyright ; 15 Year
;16 Artist Company Name ; 16 Genre
;17 Album Title Module Desription ; 17 Conductors
;18 Year Module Version ; 18 Tags
;19 Track Number Product Name ; 19 Rating
;20 Genre Product Version ; 20 Authors
;21 Duration Sender Name ; 21 Title
;22 Bit Rate Recipient Name ; 22 Subject
;23 Protected Recipient Number ; 23 Categories
;24 Camera Model Csid ; 24 Comments
;25 Date Picture Taken Tsid ; 25 Copyright
;26 Dimensions Transmission Time ; 26 #
;27 ??? Caller Id ; 27 Length
;28 ??? Routing ; 28 Bit rate
;29 Episode Name Audio Format ; 29 Protected
;30 Program Description Sample Rate ; 30 Camera model
;31 Description Audio Sample Size ; 31 Dimensions
;32 Audio sample size Channels ; 32 Camera maker
;33 Audio sample rate Play Length ; 33 Company
;34 Channels Frame Count ; 34 File description
;35 Company Frame Rate ; 35 Program name
;36 Description Video Sample Size ; 36 Duration
;37 File Version Video Compression ; 37 Is online
;38 Product Name ??? ; 38 Is recurring
;39 Product Version ??? ; 39 Location
;40 Keywords (XP only) ??? ; 40 Optional attendee addresses
; ; 41 Optional attendees
; 42 Organizer address
; 43 Organizer name
; 44 Reminder time
; 45 Required attendee addresses
; 46 Required attendees
; 47 Resources
; 48 Free/busy status
; 49 Total size
; 50 Account name
; 51 Computer
; 52 Anniversary
; 53 Assistant's name
....
;261 Directors
;262 Data rate
;263 Frame height
;264 Frame rate
;265 Frame width
;266 Total bitrate
[/Edit]
@Biber
Mein unmittelbarster Bezug zu den "Extended File Attributes" ist, dass sie mich im Explorer grundsätzlich stören und ich sie in viel zu vielen Ordnern aus der Detailansicht eliminieren muss ...
@Xenesis
In diesem Zusammenhang: Unterscheiden sich eigentlich die Datumswerte zwischen Datei(änderungs)datum und Aufnahmedatum bei Deiner Kamera?
Grüße
bastla
[Edit] Jetzt bleiben nur noch 506 cm ... [/Edit]
Mein unmittelbarster Bezug zu den "Extended File Attributes" ist, dass sie mich im Explorer grundsätzlich stören und ich sie in viel zu vielen Ordnern aus der Detailansicht eliminieren muss ...
@Xenesis
In diesem Zusammenhang: Unterscheiden sich eigentlich die Datumswerte zwischen Datei(änderungs)datum und Aufnahmedatum bei Deiner Kamera?
Grüße
bastla
[Edit] Jetzt bleiben nur noch 506 cm ... [/Edit]