Hallo Kayes,
Ich schmeiße Dir einfach mal ein altes (und sicher verbesserungsfähiges) Script von mir vor die Füße, das damals unter Mithilfe mehrerer User dieses Forums entspanden ist.
Vermutlich enthält es genügend Anregungen, anhand derer Du Dein Problem selbst gelöst bekommst.
C
; Scriptname: PhotoRec-Butler
; Version: 1.01 vom 08.11.'16 (basierend auf Version 1.0 vom 26.07.'16)
; Autor: Stefan Denk (alias "Code-Jack", alias "Desi"), Fa. EDV-Dompteur
; Website: http://www.EDV-Dompteur.de
; Status: Freeware
; V E R W E N D U N G S Z W E C K :
; Dieses Script kommt zur Anwendung nach einer Datenrettung mit dem Programm "PhotoRec", aus dem Programmpaket "Testdisc",
; der ein Durchlauf des Scriptes "PhotoRec_Sorter" folgte.
; Im Anschluss an die Anwendung von PhotoRec_Sorter dürfte man einen Ordner namens "JPG" vorfinden, gefüllt mit nichts als massenhaft JPG-Dateien.
; In meinem eigenen Fall enthielt dieser Ordner über 465000 Dateien, was den Windows-Explorer völlig ausbremste. Es war kaum möglich,
; auch nur den Ordnerinhalt anzeigen zu lassen; es waren einfach gar zu viele Dateien darin vorhanden.
; Die Aufgabe des hier vorliegenden Scriptes ist es, die im JPG-Ordner vorhandenen Bilder, nach Aufnahmedatum sortiert, in automatisch angelegte
; Unterordner zu verschieben, so dass im Anschluss für jeden Tag, an dem ein Bild (bzw. mehrere) aufgenommen wurde(n), ein eigener Unterordner existiert.
;
; B E N U T Z U N G:
; Das Script soll sich NEBEN dem Ordner mit dem Namen "JPG" befinden, wenn es gestartet wird (also NICHT dort hinein kopieren!).
; Dann einfach das Script starten und abwarten. Im Anschluss findet man eine Ordnerstruktur nach folgendem Schema vor:
; ...\JPG\15-08-23
; ...\JPG\15-09-18
; ...\JPG\16-01-29
; etc.
; In jedem dieser automatisch angelegten Unterordner befinden sich nur genau jene Bilder, die an dem Tag aufgenommen wurden, der dem Ordnernamen entspricht.
;
; D A N K S A G U N G:
; Der Autor dankt folgenden Usern des großartigen Forums http://www.autoit.de für ihre Tipps, bzw. Code-Schnippsel:
; Simucal - für die Funktion _FileGetProperty, auf der dieses Script aufbaut.
; Oscar - für Codeschnippsel und präzise Hinweise.
; Xorianator - fürs Mitdenken.
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
Global $sQuellpfad = @ScriptDir & "\JPG\"
Global $hSearch
Global $sFileWithPath
; Das Handle der ersten Datei im Quellpfad ermitteln.
$hSearch = FileFindFirstFile($sQuellpfad & "*.*")
; Überprüfen, ob obige Suche erfolgreich war.
If $hSearch = -1 Then
MsgBox($MB_SYSTEMMODAL, "", "Error: No files/directories matched the search pattern.")
Return False
EndIf
; Assign a Local variable the empty string which will contain the files names found.
Global $sFileName = "", $iResult = 0
While 1
$sFileName = FileFindNextFile($hSearch) ; Der Name der jeweils nächsten Datei.
If @error Then ExitLoop ; Wenn keine weitere Datei vorhanden, dann Script beenden.
ConsoleWrite($sFileName & @CRLF) ; Dient nur der Kontrolle, ob das Script auch wirklich tätig ist und nicht etw "hängt" :-)
$sFileWithPath = $sQuellpfad & $sFileName ; Der volle Pfad der Datei, samt deren Dateiname.
$sAufnahmezeitpunkt = _FileGetProperty($sFileWithPath, "Bild aufgenommen am") ;Das Datum, an dem das Bild tatsächlich aufgenommen wurde.
;ConsoleWrite($sAufnahmezeitpunkt & @CRLF) ; Dient nur zum Debuggen, sollte auskommentiert werden.
$sJahr = StringMid($sAufnahmezeitpunkt, 7, 4)
$sMonat = StringMid($sAufnahmezeitpunkt, 4, 2)
$sTag = StringMid($sAufnahmezeitpunkt, 1, 2)
$sZielpfad = $sQuellpfad & $sJahr & "-" & $sMonat & "-" & $sTag & "\" ; Hierhin wird die Bilddatei gleich verschoben.
;ConsoleWrite($sZielpfad & @CRLF) ; Dient nur zum Debuggen, sollte auskommentiert werden.
; Quelldatei in den neuen Ordner verschieben (Ordner wird automatisch erzeugt, falls noch nicht vorhanden).
;FileMove($sFileWithPath, $sZielpfad & $sFileName, $FC_OVERWRITE + $FC_CREATEPATH)
FileMove($sFileWithPath, $sZielpfad & $sFileName, $FC_CREATEPATH)
WEnd
; Close the search handle.
FileClose($hSearch)
;===============================================================================
; Function Name.....: _FileGetProperty
; Description.......: Returns a property or all properties for a file.
; Version...........: 1.0.2
; Change Date.......: 05-16-2012
; AutoIt Version....: 3.2.12.1+
; Parameter(s)......: $S_PATH - String containing the file path to return the property from.
; $S_PROPERTY - [optional] String containing the name of the property to return. (default = "")
; Requirements(s)...: None
; Return Value(s)...: Success: Returns a string containing the property value.
; If $S_PROPERTY is empty, an two-dimensional array is returned:
; $av_array[0][0] = Number of properties.
; $av_array[1][0] = 1st property name.
; $as_array[1][1] = 1st property value.
; $av_array[n][0] = nth property name.
; $as_array[n][1] = nth property value.
; Failure: Returns 0 and sets @error to:
; 1 = The folder $S_PATH does not exist.
; 2 = The property $S_PROPERTY does not exist or the array could not be created.
; 3 = Unable to create the "Shell.Application" object $objShell.
; Author(s).........: - Simucal <Simucal@gmail.com>
; - Modified by: Sean Hart <autoit@hartmail.ca>
; - Modified by: teh_hahn <sPiTsHiT@gmx.de>
; - Modified by: BrewManNH
; URL...............: http://www.autoitscript.com/forum/topic/...property/page__view__findpost_
; Note(s)...........: Modified the script that teh_hahn posted at the above link to include the properties that
; Vista and Win 7 include that Windows XP doesn't. Also removed the ReDims for the $av_ret array and
; replaced it with a single ReDim after it has found all the properties, this should speed things up.
;===============================================================================
Func _FileGetProperty(Const $S_PATH, Const $S_PROPERTY = "")
Local Const $objShell = ObjCreate("Shell.Application")
If @error Then Return SetError(3, 0, 0)
Local $iPropertyCount = 300 ; arbitrary number used, Windows 7 only returns 289 properties, Windows XP only returns 38 (future proofing)
If StringLeft($S_PATH, 1) = '"' Then StringTrimLeft($S_PATH, 1) ; deletes any quotes around the path\filename, otherwise will cause errors
If StringRight($S_PATH, 1) = '"' Then StringTrimRight($S_PATH, 1) ; deletes any quotes around the path\filename, otherwise will cause errors
If Not FileExists($S_PATH) Then Return SetError(1, 0, 0)
Local Const $S_FILE = StringTrimLeft($S_PATH, StringInStr($S_PATH, "\", 0, -1))
Local Const $S_DIR = StringTrimRight($S_PATH, StringLen($S_FILE) + 1)
Local Const $objFolder = $objShell.NameSpace($S_DIR)
Local Const $objFolderItem = $objFolder.Parsename($S_FILE)
If $S_PROPERTY Then
For $I = 0 To $iPropertyCount
If $objFolder.GetDetailsOf($objFolder.Items, $I) = $S_PROPERTY Then Return $objFolder.GetDetailsOf($objFolderItem, $I)
Next
Return SetError(2, 0, 0)
EndIf
Local $av_ret[300][2] = [[1]]
For $I = 1 To $iPropertyCount + 1
If $objFolder.GetDetailsOf($objFolder.Items, $I) Then
$av_ret[$I][0] = $objFolder.GetDetailsOf($objFolder.Items, $I - 1)
$av_ret[$I][1] = $objFolder.GetDetailsOf($objFolderItem, $I - 1)
$av_ret[0][0] += 1
EndIf
Next
ReDim $av_ret[$av_ret[0][0] + 1][2]
If Not $av_ret[1][0] Then Return SetError(2, 0, 0)
Return $av_ret
EndFunc ;==>_FileGetProperty
Alles anzeigen