Ordner älter 24 h löschen

  • Hallo


    ich habe hier via Autoit ein kleines Backupscript am laufen. Pro Stunde wird hier ein Ordner erstellt, in welchen Files und Daten als Backup kopiert werden. Nun möchte ich bei jedem Daurgang zusätzlich mit den Ordner löschen welcher älter 24h ist.

  • Nun du hast folgende Teilaufgaben vor dir:

    1. Eine Liste aller Ordner erstellen: _FileListToArray würde hierfür gehen aber auch mit den zugrunde liegenden Funktion FileFindFirst/NextFile könnte man dies machen.
    2. Die Liste in einer Schleife durchlaufen
    3. Für jeden Ordner den Erstellzeitpunkt ermitteln: FileGetTime
    4. Die Differenz zu jetzt bestimmen: Entweder manuell über die einzelnen Zeitbestandteile oder mit Hilfe der Funktion _DateDiff - dort müsstest du dir aber noch den Zeitstring aus FileGetTime entsprechend formatieren.
    5. Falls die Differenz ein bestimmte Maß überschreitet - Ordner löschen.
  • Hallo, Danke


    dann wäre wahrscheinlich ein EInzeiler via cmd einfacher


    Code
    cd c:\zielverzeichnis && FORFILES /m * /D -1 /C "cmd /c IF @isdir == TRUE rd /S /Q @path"

    kann ich das in ein Autoit Script packen ?

  • $run='cd " & $packuppath & "FORFILES * /D -5 /C "cmd /c IF @isdir == TRUE echo  @path >> test.txt"'
    RunWait(@ComSpec & " "/c " & $run", "", @SW_HIDE)


    wo mache ich den Fehler `g

  • Versuche :

    Local $run='cd "' & $packuppath & '" FORFILES * /D -5 /C "cmd /c IF @isdir == TRUE echo  @path >> test.txt"'

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • habe ich probiert, funktioniert leider nicht. als CMD über die Konsole selbst funktioniert es, allerdings nicht über das entgültige Script. keine Fehlermeldung im Skript, aber auch eine Ausführung.

  • habe ich probiert, funktioniert leider nicht.

    Ein Problem bei deiner Besetzung der Variable $run bestand darin, dass die einfachen und doppelten Hochkommata schon zu Beginn falsch gesetzt waren (den Rest habe ich, offen gesagt nicht geprüft)

    Bei :

    $run='cd " & $packuppath & "FORFILES * /D -5 /C "cmd /c IF @isdir == TRUE echo  @path >> test.txt"'

    wird nicht der Wert von $packuppath eingefügt, sondern nur der Variablenname als Text. Du kannst ja mal ein ConsoleWrite($run & @CRLF) dahintersetzen.

    Diesen Teil habe ich geändert.

    Ein anderer, zugegebenermaßen etwas rustikaler Ansatz :

    Vorgabe : Du möchtest jede Stunde eine Verzeichnisstruktur in einen, von der Stunde der Ausführung abhängigen Backupordner kopieren. Backupordner die älter als 24 Stunden sind, sollen gelöscht werden.

    Das ist im Prinzip eine 24 Stunden Rotation.

    1. Prüfe im Skript das Makro @HOUR (lt. Hilfe : Stundenwert der Uhrzeit im 24-Stunden-Format. Wertebereich: 00 bis 23)
    2. Prüfe ob ein Ordner, z.B. ..\backup00 oder ..\backup23 (d.h. ..\backup & @HOUR) bereits existiert - falls nicht anlegen.
    3. Existiert der jeweilige (Stunden-)Ordner bereits und ist nicht leer, dann den Inhalt löschen und anschließend das neue Backup dort hineinkopieren.

    So kannst Du Dir das Löschen von Ordnern, die älter als 24 sind, sparen. Ein Backup zu einer betreffenden Stunde der Vortages wird durch ein aktuelles ersetzt.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • also so wie ich das sehe liegt das ganze an dem Bereich :

    "cmd /c IF @isdir == TRUE echo @path >> test.txt"

    Es mag durchaus sein, dass dieser Teil auch zu einem Problem führt.

    Trotzdem ist die Anordnung von einfachen und doppelten Hochkommata in deiner Variable $run nicht korrekt, siehe :

    Code
    Local $packuppath = 'c:\zielverzeichnis' ; *** nur zum Test, damit $packuppath einen Wert hat
    Local $run='cd " & $packuppath & "FORFILES * /D -5 /C "cmd /c IF @isdir == TRUE echo  @path >> test.txt"'
    ConsoleWrite($run & @CRLF)

    Die Ausgabe mittels ConsoleWrite ergibt :

    cd " & $packuppath & "FORFILES * /D -5 /C "cmd /c IF @isdir == TRUE echo  @path >> test.txt"

    Wie Du siehst, wird hier nicht der Wert von $packuppath eingefügt, sondern der Variablenname als Text.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Ich habe mal einen Ordnerpfad erstellt: C:\Users\AlinaPC33\Desktop\Ordner\1\2
    Der Ordner "2" ist älter "1 Tag" und wird mit nachfolgendem Script gelöscht.
    Bitte beachte die Erklärungen im Script bezüglich Pfadanpassen.

    Ist es das was Du suchst?

    Spoiler anzeigen


    #include <File.au3>
    #include <Date.au3>

    Local $sFolderToCheck = "C:\Users\AlinaPC33\Desktop\Ordner\1\2"

    ; Überprüfe, ob der Ordner existiert
    If Not FileExists($sFolderToCheck) Then
    MsgBox($MB_SYSTEMMODAL, "", "Der Ordner existiert nicht.")
    Exit
    EndIf

    ; Erhalte das Erstellungsdatum des Ordners
    Local $sFolderCreationDate = _GetFolderCreationDate($sFolderToCheck)

    ; Erstelle ein Objekt für das Erstellungsdatum
    Local $oFolderCreationDate = _DateAdd("d", 0, $sFolderCreationDate)

    ; Erstelle ein Objekt für das aktuelle Datum
    Local $oCurrentDate = _Now()

    ; Vergleiche das Erstellungsdatum mit dem aktuellen Datum
    If $oFolderCreationDate < $oCurrentDate Then
    ; Lösche den Ordner, wenn das Erstellungsdatum älter als das aktuelle Datum ist
    DirRemove($sFolderToCheck, $DIR_REMOVE)
    If @error Then
    MsgBox($MB_SYSTEMMODAL, "", "Fehler beim Löschen des Ordners.")
    Else
    MsgBox($MB_SYSTEMMODAL, "", "Der Ordner wurde erfolgreich gelöscht.")
    EndIf
    Else
    MsgBox($MB_SYSTEMMODAL, "", "Der Ordner ist nicht älter als das aktuelle Datum.")
    EndIf

    Func _GetFolderCreationDate($sFolderPath)
    Local $sOutput = ""
    Local $iPID = Run(@ComSpec & ' /c for %I in ("' & $sFolderPath & '") do @echo %~tI', "", @SW_HIDE, $STDOUT_CHILD)
    While 1
    $sOutput &= StdoutRead($iPID)
    If @error Then ExitLoop
    WEnd
    Return StringTrimLeft($sOutput, StringInStr($sOutput, " ") + 1)
    EndFunc


    Ist evtl. noch zu kürzen aber erst einmal arbeitet es bei mir zumindest einwandfrei.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    5 Mal editiert, zuletzt von Alina (25. Januar 2024 um 20:24)

  • nun das es im großen ganzen an der Schreibweise und ein paar "' liegt ist mir im ganzen auch klar.

    setze ich es so

    Run(@ComSpec & ' /c cd ' & packuppath & ' &&  echo  @path >> test1.txt', "", @SW_HIDE)

    funktioniert es. Nur sobald ich den Pfad auslesen lasse mit

    Run(@ComSpec & ' /c cd ' & packuppath  & ' && FORFILES * /D -1 /C "cmd /c IF @isdir == TRUE echo  @path >> test.txt"', "", @SW_HIDE)

    stosse ich auf die Probleme, d.h für mich entsteht das Problem bei der FORFILES Schleife

  • Also Lösung gefunden, das

    echo @PATH >> test.txt 

    habe ich ja nur für die Tests reingemacht, am Ende wenn ich das durch löschen ersetze schaut die Lösung so aus

               If  FileExists($packuppath ) Then
                   RunWait(@COMSPEC & ' /c forfiles.exe /P ' & $packuppath  & ' /M * /D -1 /C "cmd /c IF @ISDIR == TRUE rmdir /s /q @PATH"', '', @SW_Hide)
               EndIf

    Damit werden alle Ordner Älter 24h gelöscht. Extraliegende Files bleiben unberührt.

    Einmal editiert, zuletzt von schlawiner (26. Januar 2024 um 01:46)

  • Hier mal ein Autoit Script, welches ich nutze.


    Gruß gmmg

  • Alina 26. Januar 2024 um 15:11

    Hat das Label [ offen ] entfernt.