Dateien nach Alter löschen

    • Offizieller Beitrag

    Hallo,

    brauche mal eure Hilfe. Ich muss auf einem Server einmal täglich alte Dateien (älter als 7 Tage) löschen, da die sonst die Platte zu müllen.
    Dazu habe ich mir folgendes Skript geschrieben:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.0.0
    Autor: Gun-Food
    Datum: 18.02.2009

    [/autoit] [autoit][/autoit] [autoit]

    Skriptfunktion:
    Berreinigt das TEMP Verzeichnis
    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Skript Start
    FileChangeDir("c:\Temp")
    $suche = FileFindFirstFile("c:\Temp\*")
    While 1
    $datei = FileFindNextFile($suche)
    $datum = FileGetTime("c:\temp\" & $datei, 1)
    $yyyymd = $datum[0] & "/" & $datum[1] & "/" & $datum[2]

    if @MDAY >= 8 Then
    $tag = @MDAY - 7
    $monat = @MON
    $jahr = @YEAR
    Else
    $monat = @MON - 1
    if $monat = 0 Then
    $monat = 12
    EndIf
    $jahr = @YEAR
    if @MON = 2 Then
    $tag = 27 - (8 - @MDAY)
    Else
    $tag = 30 - (8 - @MDAY)
    EndIf
    EndIf

    $ref_datum = $jahr & "/" & $monat & "/" & $tag

    if $yyyymd <= $ref_datum Then
    MsgBox(0, "Datei gefunden", "Datei " & $datei & " koennte gelöscht werden")
    ;FileDelete("c:\Temp" & $datei)
    Else
    MsgBox(0, "Datei nicht gefunden","Datum aus Datei " & $yyyymd & " zu " & $ref_datum)
    EndIf
    WEnd
    FileClose($suche)

    ; Skript Ende

    [/autoit]

    Scheinbar findet das Skript auch die richtigen Dateien, bis ich auf einmal die Fehlermeldung:

    "AutoIt Error

    Line -1:
    Error: Subscript used with non-Array variable."

    erhalte.
    Hat da jemand eine Idee? Ich denke es wird an der Unterscheidung liegen, ob das Jahr gerade erst begonnen hat (vor dem 08.01.), da ich dann ja in das Jahr davor zurück muss und den Monat auf den Dezember setze. Aber sicher bin ich mir nicht und es scheint auch gzu zu laufen, soweit.

    Danke
    für eure Hilfe

    Gun-Food

  • Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.0.0
    Autor: Gun-Food
    Datum: 18.02.2009

    [/autoit] [autoit][/autoit] [autoit]

    Skriptfunktion:
    Berreinigt das TEMP Verzeichnis
    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Skript Start
    FileChangeDir("c:\Temp")
    $suche = FileFindFirstFile("c:\Temp\*")
    While 1
    $datei = FileFindNextFile($suche)
    If @error Then ExitLoop
    $datum = FileGetTime("c:\temp\" & $datei, 1)
    $yyyymd = $datum[0] & "/" & $datum[1] & "/" & $datum[2]

    $ref_datum = _DateAdd('d', -7, _NowCalcDate())

    if $yyyymd <= $ref_datum Then
    MsgBox(0, "Datei gefunden", "Datei " & $datei & " koennte gelöscht werden")
    ;FileDelete("c:\Temp" & $datei)
    Else
    MsgBox(0, "Datei nicht gefunden","Datum aus Datei " & $yyyymd & " zu " & $ref_datum)
    EndIf
    WEnd
    FileClose($suche)

    [/autoit]

    Hmm muss ma versuchen, ich kanns leider net testen und weiss net ob DateAdd auch abziehen kann

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    Einmal editiert, zuletzt von FireFlyer (18. Februar 2009 um 10:13)

    • Offizieller Beitrag

    Mit _DateDiff kann man das Script etwas kürzer gestalten:

    [autoit]


    #include <Date.au3>
    $sPath = 'c:\Temp\'
    $hSearch = FileFindFirstFile($sPath & '*')
    While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If Not StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    $sDate = StringRegExpReplace(FileGetTime($sPath & $sFile, 1, 1), '(\d{4})(\d{2})(\d{2})(.*)', '$1/$2/$3')
    If _DateDiff('D', $sDate, _NowCalc()) > 7 Then
    ;~ FileDelete($sPath & $sFile)
    MsgBox(0,0,$sPath & $sFile)
    EndIf
    EndIf
    WEnd
    FileClose($hSearch)

    [/autoit]
  • Hallo zusammen,

    gibt es auch eine Möglichkeit Tage von einem Datum abzuziehen, wie man es mit _DateAdd machen kann, jedoch in der Form YYYYMMDD ?

    Grüße

  • Naja das weiß ich schon, das klappt auch, aber ich wollte das nicht in der Form YYYY/MM/DD, sondern, wie oben schon erwähnt in der Form YYYYMMDD ;)