mrchaos
Goto Top

Batch zum löschen von Ordner die älter als 30 Tage sind

Hallo Ihr alle,

ich möchte eine Batch Datei erstellen die mir Ordner samt Inhalt löscht die älter als 30 Tage sind.
Die Ordner liegen alle im Format JJJJMMTT vor.
Ich habe mich im Forum jetzt schon ein wenig umgeschaut und auch schon einige Beiträge gefunden die sich mit dem Thema beschäftigen.
Leider hat mir aber noch kein Beitrag so richtig weitergeholfen. Vermutlich liegt das aber auch an meinen Eingestaubten Fähigkeiten Batch Dateien zu erstellen.

Wie kann man das am besten realisieren?
Ich danke euch schon mal für eure Hilfe.

Gruß
Thomas

Content-ID: 84517

Url: https://administrator.de/forum/batch-zum-loeschen-von-ordner-die-aelter-als-30-tage-sind-84517.html

Ausgedruckt am: 26.12.2024 um 17:12 Uhr

schregi82
schregi82 02.04.2008 um 11:33:35 Uhr
Goto Top
Mit delage32.exe einfach umzusetzen:
http://home.mnet-online.de/horst.muc/wbat32d.htm

delage32 Laufwerk:\Ordner\*.* 30 /recurse /rd

Interessant wäre was du mit älter als 30 Tage meinst.
Erstelldatum od. letzter Zugriff - den entsprechenden Schalter findest du auf der Website oben.

lg,
MrChaos
MrChaos 02.04.2008 um 12:15:56 Uhr
Goto Top
also ... älter als 30 tage

ich habe Ordner die so aussehen

20080101
20080102
20080103
20080201
20080202
20080203
20080301
20080302
20080303

Diese Ordner werden täglich erstellt.
Ich möchte jetzt relativ zum heutigen Tag die Ordner löschen lassen die weiter als 30 Tage zurückliegen.
Sprich am 01.03.2008 sollen alle Ordner gelöscht werden die vor 01.02.2008 erstellt wurden.
Gadacht ist damit der Batch einmal pro Woche oder sogar Monat durchläuft und den "alten kram" löscht.
Hoffe das erklärt besser was ich mit 30 Tagen meine face-smile wenn nicht ... <- dann nochmal fragen
Biber
Biber 02.04.2008 um 12:28:49 Uhr
Goto Top
Moin MrChaos,

DelAge32 wäre auch mein erster reflexartiger Tipp bei Deiner Anforderung.

Es sei denn, Du variierst die Strategie und definierst das Soll als "Es sollen immer die letzten 30 Sicherungsordner erhalten bleiben, alles andere kann wech."

Dazu haben wir in Batch & Shell auch ein paar Beispiele, die dann ohne externe Utilities funktionieren.

Sinngemäß so:
for /f %%i in ('dir /ad /o-d /b x:\sichverz\200????? ^|more +30') do rd /s /q "x:\sichverz\%%i"  
Bevor Du den einbaust, solltest Du es so am CMD-Prompt testen:
for /f %i in ('dir /ad /o-d /b x:\sichverz\200????? ^|more +30') do @echo rd /s /q "x:\sichverz\%i"  

Gruß
Biber
MrChaos
MrChaos 02.04.2008 um 13:56:50 Uhr
Goto Top
@Biber
im Prinzip geht das sorum auch. Hauptsache die letzten 30 Sicherungen bleiben erhalten.

irgendwie ist da bei mir noch der Wurm drin.

ich habe jetzt den Verzeichnispfad angepasst. bzw auch ganz weggelassen da die bat im selben Ordner liegt wie die Testordner

geh ich richtig in der Annahme das ^|more +30' nur die Ordner anzeigen soll die älter als 30 Tage sind?
so mag es nicht funktionieren
Biber
Biber 02.04.2008 um 14:21:57 Uhr
Goto Top
Moin MrChaos,

teste es schrittweise am CMD-Prompt:
dir /ad /o-d /b x:\sichverz\200????? 
...das sollte alle Verzeichnisse mit der Namenskonvention "200?????" anzeigen sortiert nach Datum (die ältesten zuletzt).
Bei deiner (sinnvollen) Namenkonvention ginge natürlich auch eine Sortierung nach Name (also den Parameter /o-n statt /o-d setzen).

Wenn das bei Dir klappt, dann teste als nächstes
dir /ad /o-d /b x:\sichverz\200????? |more +5
...das sollte alle Verzeichnisse wie oben bringen, aber die ersten 5 überspringen.
Wenn natürlich nur 3 oder 4 vorhanden sind, dann bleibt nichts zum Anzeigen übrig.

Diese Mimik habe ich oben in der FOR/F-Anweisung eingebaut.
Dazu muss das Pipe-Symbol "|" halt maskiert werden mit Caret "^" --->deshalb "^|".

Kommst du denn am CMD-Prompt zu den gleichen Ergebnissen wie ich?

P.S. Zur eigentlichen Frage:
nur die Ordner anzeigen soll die älter als 30 Tage sind
Nein, sondern nur die Ordner nach den ersten 30 vorhandenen Ordnern...
Strategie wäre ja jetzt: 30 Ordner will ich IMMER zur Sicherheit behalten (egal wie alt).

Grüße
Biber
MrChaos
MrChaos 02.04.2008 um 15:00:20 Uhr
Goto Top
hey,
also ja ich habe das auch am cmd schritt für schritt durchprobiert.
okay das funktioniert auch.
die Sortierung
dir /ad /o-n /b 
scheint am meisten sinn zu machen.(zumindest beim testen ;) )

kann ich das mit dem ^|more irgendwo nachlesen ?
warum muss das maskiert werden ?

fange gerade wieder an mich ein bisschen mit batch zu beschäftigen und will alles wissen in mich aufsaugen face-smile :D

Thomas
Biber
Biber 02.04.2008 um 16:26:54 Uhr
Goto Top
Moin MrChaos,

warum muss das maskiert werden ?
Im Batch/am CMD-Prompt müssen wie in jeder anderen Skript-/Makro-/Programmiersprache alle Zeichen "maskiert" werden, die als Steuerzeichen besondere Bedeutung haben.

Einfaches Beispiel: (Befehl und Ausgabe am CMD-Prompt):
>echo %windir%
C:\WINDOWS
Wenn Du aber als Ausgabe stehen haben willst:
Der Wert von %windir% ist C:\WINDOWS
...dann müsstest Du die ersten %-Zeichen maskiert eingeben.
>echo Der Wert von ^%windir^% ist %windir%

Die Maskierung der Ein-/Ausgabe bei Echo und bei Pipe/Umleitungsaktionen ist der eine Fall,
der andere Fall ist die Übergabe/Delegierung eines (Teil-)Befehls an eine andere CMD-Instanz.
Und das passiert implizit bei jedem Befehl, der innerhalb einer FOR/F-Anweisung in einfachen Klammern steht.
Dann wird nämlich eine neue Instanz der CMD.exe eröffnet, die gefälligst diesen Befehl ausführen und das Ergebnis abliefern soll.
Im Beispiel oben wird also eine neue CMD.exe beauftragt:
"Hey, mach mir den ''dir /ad /o-d /b x:\sichverz\200????? |more +30'"
Der Befehl, der ausgeführt werden soll, ist also eigentlich ein Übergabe-Parameter und genau deshalb müssen evtl. vorhandene Steuerzeichen für die Dauer des Transports maskiert/sicher verpackt werden.
Und das Pipesymbol ("|") ist in diesem fall das zu maskierende Steuerzeichen, deshalb "^|".

Nachlesen kann man/frau es sicherlich auch irgendwo.... vielleicht postet eine/r der MitleserInnen noch einen Link.

Grüße
Biber
MrChaos
MrChaos 07.04.2008 um 19:19:29 Uhr
Goto Top
Ich danke euch erstmal. das hat mir schon weitergeholfen ... bei weiteren Fragen komme ich gerne auf euch zurück face-smile

Gruß
Thomas