Hallo allerseits,
Habe folgedes Problem mit einem abgewandelten Skript von Oskar u. Micha_he.
Das Skript hat folgende Funktion:
1. Eingabe eines Startpfades
2. Eingabe eines Zielverzeichnisses
3. Verschieben aller Datein ab einem bestimmten Datums (rekursiv) in das Zielverzeichnis. Löschen eines leeren Verzeichnisses im Startpfad.
Soweit so gut. Funktioniert so ziemlich alles tadellos. Es wird alles wunschgemäß in das Zielverzeichnis kopiert NUR: es erfolgt keine Rekonstruktion der Ursprungverzeichnisse. Es wird lediglich das eingegebene Zielverzeichnis erstellt und dort hinein alle Dateien verschoben.
Es handelt sich dabei um die Zeile 105 im unten angeführten Skript. Was mache ich falsch, dass beim FileMove die Verzeichnisstruktur nicht reproduziert wird?
Viele Dank für eure Hilfe.
Spoiler anzeigen
#include <Date.au3>
#include <Array.au3>
#include <File.au3>
$Server=Inputbox("Eingabe des Startverzeichnisses","Verzeichnis")
MsgBox(1,"Startverzeichnis",$Server)
global $sZiel=Inputbox("Eingabe des Zielverzeichnisses","Verzeichnis")
If StringRight($sZiel, 1) <> '\' Then $sZiel &= '\'
MsgBox(1,"Zielverzeichnis",$sZiel)
$s_MoveDatum=InputBox("Eingabe des Datums, ab dem verschoben werden soll","Datum (YYYYMMDD)")
$s_Datum=StringRegExpReplace($s_MoveDatum,'(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
$Now=StringRegExpReplace(_NowCalc(),'(\d{4})(\d{2})(\d{2})(.*)', '$3/$1/$2')
$Tage=_DateDiff('D',$s_Datum,$Now)
MsgBox(1,"",$Tage)
$Filter=("*") ; Angabe der Fileendungen ohne * davor und mit | getrennt
$Test= _FileMoveDate($Server,$Tage,True,True,True,False,$Filter)
; ==============================================================================
; Parameterangaben in der Reihenfolge ihres Auftretens
; ------------------------------------------------------------------------------
; $Server = Angabe des Verzeichnisses
; $Tage = Angebe des Filealters, nachdem gelöscht wird
; True = Auch Files mit Read-Only werden gelöscht
; True = Auch Files in Unterverzeichnissen werden gelöscht
; False = Leere Unterverzeichnisse werden nicht gelöscht
; True = Eine Log-Ausgabe über die Konsole
; $Filter = Angabe der Fileendungen, die zu löschen sind
; ==============================================================================
;=================================================================================================================================================
; Funktionsname: _FileMoveDate($sPath, $iDays[, $bForceDel][, $bRek][, $bDirDel][, $bLog], [$sFilter])
; ------------------------------------------------------------------------------------------------------------------------------------------------
; Beschreibung: löscht Dateien in einem ausgewähltem Verzeichnis (rekursiv) nach einer angegebenen Anzahl von Tagen
; Parameter(s): $sPath = Verzeichnis, aus dem die Dateien gelöscht werden sollen.
; $iDays = Dateien, die älter als $iDays (in Tagen) sind, löschen.
; $bForceDel = wenn "True" werden auch Dateien/Verzeichnisse gelöscht, die gegen löschen geschützt sind ("R"-Attribut)
; $bRek = wenn "True" wird das Verzeichnis rekursiv (inkl. Unterverzeichnisse) durchsucht.
; $bDirDel = wenn "True" wird das Unterverzeichnis gelöscht, wenn es (aufgrund der Löschaktion) leer ist.
; $bLog = wenn "True" wird das Ergebnis der Löschaktion in die Console geschrieben.
; $sFilter = hier können Dateierweiterungen (mit | getrennt) gegeben werden für welche die Löschaktion gilt *=alle
; #include <Date.au3>
; Rückgabewerte: bei Erfolg Rückgabe = 1
; Verzeichnis existiert nicht Rückgabe = 2
; Verzeichnis ist leer Rückgabe = 3
; bei Löschfehlern Rückgabe = 0
; und @error:
; 1 = $iDays ist keine oder eine negative Zahl
; Autoren: Oscar (http://www.autoit.de)
; Micha_he (http://www.autoit.de)
; Angepasst: autoBert um $sFilter erweitert
; Stefan Krismer erweitert um Verzeichnisprüfung - 04.04.2013
; Beispiel: _FileMoveDate('Verzeichnis', Tage, True, True, False, True, Filter (txt|bak|usw - immer getrennt durch | und ohne " ")
;==================================================================================================================================================
Func _FileMoveDate($sPath, $iDays, $bForceDel = False, $bRek = True, $bDirDel = False, $bLog = True, $sFilter = "*")
Local $hSearchm, $hEmpty, $sFile, $sDate, $iRet,$Return
Local $aFilter = StringSplit($sFilter, "|")
If @error Then
$aFilter[0] = $sFilter
_ArrayDelete($aFilter,1)
Else
_ArrayDelete($aFilter,0)
EndIf
If (Not IsNumber($iDays)) Or ($iDays < 0) Then Return SetError(1, 0, 0) ; Prüfung, ob $iDays eine Zahl die >0 ist
If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
$hSearch = FileFindFirstFile($sPath & '*.*')
$iLeer = DirGetSize($sPath) ; Prüfung, ob Verzeichnis leer ist
if $iLeer = 0 Then
Return 3
endif
If $hSearch=-1 Then ; Prüfung, ob das Verzeichnis existiert
Return 2
EndIf
If @error Then Return SetError(2, 0, 0)
While 1
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If @extended Then
If $bRek Then
_FileMoveDate($sPath & $sFile, $iDays, $bForceDel, $bRek, $bDirDel, $bLog, $sFilter)
If $bDirDel Then
$hEmpty = FileFindFirstFile($sPath & $sFile & '\*.*')
If @error Then
If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
$iRet = DirRemove($sPath & $sFile)
If $bLog Then ConsoleWrite('Delete Folder "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
EndIf
FileClose($hEmpty)
EndIf
EndIf
Else
$sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 0, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
If _DateDiff('D', $sDate, _NowCalc()) >= $iDays Then
$aExt = StringSplit($sPath & $sFile, ".")
If $aFilter[0] = "*" Then
$bDel=True
Else
$bDel = False
For $i = 0 To UBound($aFilter) - 1
If $aExt[$aExt[0]] = $aFilter[$i] Then
$bDel = True
ExitLoop
EndIf
Next
EndIf
If $bDel Then
If $bForceDel Then FileSetAttrib($sPath & $sFile, '-R')
$iRet = FileMove($sPath & $sFile,$sZiel,9)
If $bLog Then ConsoleWrite('Move File "' & $sPath & $sFile & '" = ' & StringMid('No Yes', $iRet * 3 + 1, 3) & @CR)
EndIf
EndIf
EndIf
WEnd
FileClose($hSearch)
Return 1
EndFunc