xenesis
Goto Top

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!!

Content-ID: 82223

Url: https://administrator.de/forum/automatisiertes-verteilen-von-dateien-in-ordnern-anhand-von-dateiinfos-82223.html

Ausgedruckt am: 22.12.2024 um 16:12 Uhr

bastla
bastla 03.03.2008 um 22:34:08 Uhr
Goto Top
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:
@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
Xenesis
Xenesis 04.03.2008 um 09:32:48 Uhr
Goto Top
Hey danke für die schnelle Antwort,

ich muss zugeben, dass ich von dem Script allerdings kaum was verstehe ^^ (Ordnerangaben und move natürlich, aber die Begriffe in den Schleifen werde ich gleich mal nachschlagen ;))

das ist auf jeden fall schon mal mehr als ich zustande bringen konnte, aber eine Frage hab ich noch:
verteilt das script die Dateine nach dem Speicherdatum auf dem Rechner, oder nach dem Speicherdatum auf der Kamera(=Aufnahmedatum)?
Bei den Dateien der Kamera ist nämlich in den Dateiinfos ein spezieller Punkt "Aufnahmedatum", nach dem man bei Windows auch sortieren kann. Es wär eben absolut klasse, wenn die verteilung auf Basis dieser Info erfolgen könnte.
Das Speicherdatum wäre nämlich auch bei Dateien von verschiedenen Tagen (die aber zur gleichen Zeit auf den PC übertragen werden) gleich.
(Da ich lange Zeit Bilder nur auf der SD karte haben werde und nur alle paar Tage an einen Rechner komme, würden halt viele Bilder verschiedener Tage mit dem gleichen Speicherdatum erstellt werden.

Wenn du das noch umbauen könntest oder mir eine Hilfe geben könntest, wie man das einbaut, dann wär ich dir sehr dankbar.

Mfg
bastla
bastla 04.03.2008 um 18:04:20 Uhr
Goto Top
Hallo Xenesis!

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\"  
		)
	)
)
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 ... face-wink

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
Xenesis
Xenesis 04.03.2008 um 20:09:43 Uhr
Goto Top
hm...bei mir klappt das leider noch nicht. ich hab das Script jetzt unter mehreren Editoren (z.B. SmartEdit) als .bat datei abgespeichert.
Aber immer, wenn ich den Ordner auf die Datei ziehe bzw.sie im entsprechenden Ordner ausführe, öffnet sich nur kurz ein Konsolenfenster (und schließt sich), aber es werden keine Dateien verschoben face-sad.

Ich benutze WinXP Home....dürfte also laut der Tabelle nicht anders sein (=25).
Die Dateien sind in "normalem" Format: z.B. CIMG0003.JPG (also ohne irgendwelche besonderen Sonderzeichen)
Es ist jetzt so, dass das Aufnahmedatum im Format z.b. "01.03.2008 15:49" gespeichert ist...aber soweit ich das script verstehe nimmst du ja mit "Left(Fld.GetDetailsOf(F,25),10)" nur die ersten 10 zeichen oder?!

aber ansonsten machen mir diese beiden zeilen am meisten zu schaffen ^^(vor allem die obere Zeile)
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%  

Soweit ich das verstehe, wird in der zweiten Zeile eben der Ausdruck (Dateiname$Aufnahmedatum" erstellt (für jede Datei) was allerdings "Fld.Items:WScript.Echo" bzw. ":Next>>%G%" genau machen verstehe ich nicht, kann also leider nicht selber den Fehler finden face-sad

Irgendeine Idee, woran das liegen könnte, dass das bei mir nicht funktioniert?

MfG
bastla
bastla 04.03.2008 um 21:46:22 Uhr
Goto Top
Hallo Xenesis!

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
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
cd /d "D:\Dein Bilderordner"  
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
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  
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
Biber
Biber 04.03.2008 um 22:32:52 Uhr
Goto Top
@bastla

...kannst Du natürlich gern den relevanten Teil (den ersten Schleifendurchlauf) posten.
Ich habe sicherheitshalber schon mal 532 Zentimeter Platz unterhalb meines Kommentars vorgesehen... face-wink
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]
bastla
bastla 04.03.2008 um 22:53:05 Uhr
Goto Top
@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 ... face-wink [/Edit]
Xenesis
Xenesis 07.03.2008 um 20:14:35 Uhr
Goto Top
Hallo,

tut mir leid, dass ich erst jetzt dazu komme, mich wieder zu melden.

Ich hab das ganze jetzt mal mit @echo on und "> log.txt" laufen lassen.

Meiner Meinung nach die entscheidende Ausgabe: "CScript-Fehler: Der Zugriff auf Windows Script Host wurde fr diesem Computer deaktiviert. Wenden Sie sich an Ihren Administrator, um weitere Details in Erfahrung zu bringen."

Gut, jetzt bin ich ja der Administrator Ich hab mich dann mal an mich gewandt und gemerkt, dass mein Administrator keinen Schimmer von dem hat, was hier abgeht ;)

Bisher hab ich durch suchen nur ne Möglichkeit gefunden diesen Fehler durch verändern der Registry zu beheben.....nur würde ich das ungerne machen, wenn es sich auch anders beheben ließe.

hoffe, dass ihr mir hier weiterhelfen könnt

Mfg


EDIT: Paranoia rächt sich
durch XP-Anti Spy wurde der Windows Script Host deaktiviert.....hab den wieder zurückgestellt und jetzt funktioniert alles!!!
Herzlichen Dank an dich Bastla! Du hast mir die Arbeit mit meinen Bildern ein ganzes Stück einfacher gemacht *thumbsup*