haegar75
Goto Top

Mit DIR nach Bild aufgenommen am sortieren

Hallo Leute,
ich hoffe ihr könnt mir helfen. Im Windows-Explorer kann man sich anzeigen lassen wann ein Bild aufgenommen wurde. Mit DIR kann man laut Beschreibung aber nur nach dem Datum der letzten Änderung sortieren was ja schon evtl durch kopieren bzw brennen verändert wird. Kann man die Windows-Funktion irgendwie in einer Batch nachbauen? Ich möchte Bilder anhand dieses Kriteriums sortieren und kopieren.. Welche andere Programmiersprache wäre dazu geeignet?

Content-Key: 97954

Url: https://administrator.de/contentid/97954

Printed on: April 18, 2024 at 04:04 o'clock

Member: mgoelike
mgoelike Sep 26, 2008 at 18:21:22 (UTC)
Goto Top
Hallo,

brauchst Du gar nicht. Im Windows-Explorer die Ansicht auf Details stellen. Anschließend per Rechtsklick auf Sortierleiste (wo Name usw. steht) klicken. Schon erscheint eine Liste mit zusätlich einblendbaren Informationen. Ganz unten auf Weitere klicken und schon kann man viele zusätzliche Informationen immer anzeigen lassen. Unter anderem sogar Bild aufgenommen an usw.

mfg
Member: Haegar75
Haegar75 Sep 26, 2008, updated at Oct 18, 2012 at 16:36:18 (UTC)
Goto Top
Ja, das ist mir schon klar dass das im Windows-Explorer geht. Wollte aber sowas machen Bilder automatisch sortieren per Batch
und dafür die genaue Information der Bildaufnahme nutzen. Aber DIR war nun mal schon lange vor den Digitalkameras da.. face-wink
Member: bastla
bastla Sep 26, 2008 at 20:53:21 (UTC)
Goto Top
Hallo Haegar75!

Aber DIR war nun mal schon lange vor den Digitalkameras da.. face-wink
... was sich aber durch ein wenig VBScript ausgleichen lassen sollte face-wink:
@echo off & setlocal

set "QuellDir=D:\Fotos\ungeordnet"  
set "Typ=jpg"  
set "ZielDirRoot=D:\Fotos\sortiert"  

set G=%temp%\GetDatePictureTaken.vbs
> %G% echo Set Fld=CreateObject("Shell.Application").Namespace(WScript.Arguments(0))  
>>%G% echo For Each F In Fld.Items: WScript.Echo """"^&F.Path^&""" " ^& Fld.GetDetailsOf(F,25):Next  

for /f "tokens=1-2" %%a in ('cscript //nologo %G% "%QuellDir%"^|findstr /i ".%Typ%"') do (  
    if not exist "%ZielDirRoot%\%%b" md "%ZielDirRoot%\%%b"  
    echo move %%a "%ZielDirRoot%\%%b"	  
)
Falls Du die Datumsschreibweise "JJJJ-MM-TT" bevorzugst, verwende folgende Zeile als Ersatz für die obige Zeile 9:
>>%G% echo For Each F In Fld.Items: D=Fld.GetDetailsOf(F,25): WScript.Echo """"^&F.Path^&""" " ^& Mid(D,7,4)^&"-"^&Mid(D,4,2)^&"-"^&Left(D,2):Next  
Ähnlich wie in dem von Dir verlinkten Beitrag wird auch in diesem Batch zur Vorsicht der Verschiebebefehl durch das vorangestellte "echo" entschärft (der Befehl wird nur angezeigt, aber nicht ausgeführt) - das Erstellen der Ordner im Zielpfad sollte aber eigentlich keine Probleme bewirken und erfolgt daher tatsächlich.

Das im Batch enthaltene VBScript setzt XP voraus - unter Vista habe ich nicht getestet, es könnte aber in der Zeile 8 der Wert 12 anstelle von 25 erforderlich sein (siehe Auflistung hier) ...

Grüße
bastla
Member: Haegar75
Haegar75 Sep 27, 2008 at 09:52:08 (UTC)
Goto Top
Hi!Danke! Funktionierte auf Anhieb!Das VBScript wird mir immer symphatischer!Ist ja der Hass was für Attribute es bei Vista alle gibt.
Wie kann ich die Zeile 11 ändern, dass evtl. auch Unterordner mit durchforstet werden?
Ich würde noch gerne optional die Dateien nach der "Stunde" sortiert in Verzeichnissen unterhalb des Tages ablegen. Evtl. mit MsgBox Typ 4 abfragen.. Hintergrund: Fotos von z.B Familienfesten die mit mehreren Kameras gemacht wurden in einen zeitlichen Verlauf zu bekommen. (das nutzt natürlich nix wenn so ein Hämpel das Datum nicht eingestellt hat an der Kamera. face-wink
Member: bastla
bastla Sep 27, 2008 at 10:38:46 (UTC)
Goto Top
Hallo Haegar75!

Wie kann ich die Zeile 11 ändern, dass evtl. auch Unterordner mit durchforstet werden?
Das Einfachste wäre es, eine "for"-Schleife "herumzuwickeln" - etwa:
for /f "delims=" %%i in ('dir /s /b /ad "%QuellDir%"') do (  
    for /f "tokens=1-2" %%a in ('cscript //nologo %G% "%%i"^|findstr /i ".%Typ%"') do (  
        if not exist "%ZielDirRoot%\%%b" md "%ZielDirRoot%\%%b"  
        echo move %%a "%ZielDirRoot%\%%b"  
    )
)
Ich würde noch gerne optional die Dateien nach der "Stunde" sortiert in Verzeichnissen unterhalb des Tages ablegen.
Dazu muss die Rückgabe des VBScripts etwas angepasst werden - die Zeile 9 müüste dann etwa so ausssehen:
>>%G% echo For Each F In Fld.Items: WScript.Echo """"^&F.Path^&""" " ^& Replace(Fld.GetDetailsOf(F,25),":"," "):Next  
Wenn Du die andere Datumsschreibweise bevorzugst (ist mir schon wegen der besseren Sortierbarkeit sympathischer), dann so:
>>%G% echo For Each F In Fld.Items: D=Fld.GetDetailsOf(F,25): WScript.Echo """"^&F.Path^&""" " ^&Mid(D,7,4)^&"-"^&Mid(D,4,2)^&"-"^&Left(D,2)^&Replace(Mid(D,11),":"," "):Next  
In beiden Fällen ist die "for"-Schleife auch noch anzupassen, damit die Stunde als %%c und die Minute als %%d verwendet werden können:
for /f "tokens=1-4" %%a in ('cscript //nologo %G% "%QuellDir%"^|findstr /i ".%Typ%"') do (  
In der Version mit Berücksichtigung der Unterordner wäre dann auch noch (wie oben gezeigt) "%QuellDir%" durch "%%i" zu ersetzen.

Bei Unterteilung auch nach Stunden wäre das Ziel (für "md" und "move") jeweils
"%ZielDirRoot%\%%b\%%c"  

Grüße
bastla