manolax
Goto Top

Alte Dateien löschen, aber nicht die 1. Ebene der Unterverzeichnisse

Hallo zusammen

Ich weiß, dass es hierzu schon einige Threads gibt, diese habe ich mir auch schon durchgelesen.
Leider passt da aber nicht so wirklich zu meinem Problem.

Und zwar habe ich vor, in einem Verzeichnis alle Dateien, die älter als x Tage sind automatisch zu löschen.
Ausnahme: Die 1. Ebene sollte da bleiben.

Beispiel:
C:\Ordner\OrdnerA
         \OrdnerB
         \OrdnerC
Ich gebe C:\Ordner als Initialpfad an, Ordner A,B,C sollen aber da bleiben, auch wenn sie leer sind. -> Drunter alles weg (was x Tage älter ist)

Ich habe mich daran schon versucht, hänge jetzt aber an einer Stelle.

@echo off
set dir=%~dpnx1
set age=%2
delage32.exe %dir%\*.* %age% /recurse /created /modified
for /R %dir% %%i in (.) DO  @echo %%~dpnxi >>temp.txt
for /f "delims=\ tokens=1-10*" %%i in (temp.txt) DO @echo %%i %%j %%k %%l %%m %%n %%o %%p %%q %%r  
del temp.txt

Ich dachte mir, den Pfad in Variablen zu schreiben um dann die Pfade mit nur dem Initialpfad + eine Ebene (C.\Ordner\OrdnerA) auszusortieren.
Könnte dann delage32 nochmal mit der Option /rd drüberlaufen lassen, da er ja dann leere Verzeichnisse löscht.
Leider weiß ich nicht wie ich da weiter vorgehen soll, oder ob ich da auch völlig verkorkst denke.
Vielleicht geht das ja um einiges einfacher.

Vielleicht hat jemand von euch eine Idee wie ich das realisieren kann.
Wollte dann evtl noch einbauen, das man angeben kann wieviele Ebenen er stehen lässt, da bei manchen Verzeichnisse auch die 2. bleiben soll.

Besten Dank schon mal im Vorraus für eure Hilfe.

Content-ID: 103345

Url: https://administrator.de/contentid/103345

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

miniversum
miniversum 04.12.2008 um 18:00:02 Uhr
Goto Top
Meine ungetestete Idee dazu:
@echo off
set dir=%~dpnx1
set age=%2
set deep=5

for /f "delims=" %%i in ('dir /b /ad "%dir%"') do (  
rem Wechsle in das Verzeichnis "%%~i"  
pushd "%dir%\%%~i"  
rem rufe löschunterprozedur auf
call:killthem
rem Wechsle ein verzeichnis zurück
popd
)
goto:eof

:killthem
rem zähle die ebenen die stehn bleiben sollen runter.
set /a deep=%deep%-1
if %deep% gtr 0 (
rem wenn in einer ebene angekommen inder kene verzeichnisse gelöscht werden dürfen liste alle verzeichnisse auf und wechsle in diese
for /f "delims=" %%j in ('dir /b /ad') do (  
pushd "%%~j"  
rem rufe löschunterprozedur auf
call:killthem
rem Wechsle ein verzeichnis zurück
popd
)
) else (
rem ab einer ebene in der auch Verzeichnisse gelöscht werden dürfen löche alle verzeichnisse die zu alt sind
ECHO delage32.exe %age% /recurse /created /modified /rd
)
rem lösche alle Dateien die zu alt sind. Dies geschieht in allen unterverzeichnissen
ECHO delage32.exe %age% /recurse /created /modified
goto:eof
Wenns tut wie es soll dann die ECHOs entfernen.

Es wird, vom grundverzeichnis ausgehend, alle unterverezeichnisse gesucht und nahc einander in diese gewechselt (mit pushd). Danach wird die Unterprozedur killthem aufgerufen die im aktuellen verzeichnis Dateien löscht die zu alt sind. außerdem prüft sie welche rekorsionstiefe sie zum grundverzeichnis hat und sollte diese teife erreicht sein (rückwärts zählen bis 0) werden auch verzeichnisse gelöcht die zu alt sind.
Nach jedem unterprozeduraufruf wird ins letzte (höhere) verzeichnis zurück gewechselt (mit popd)
Manolax
Manolax 04.12.2008 um 18:04:14 Uhr
Goto Top
Erst mal besten Dank für deine Hilfe und schnelle Antwort.
Kannst du mir aber vielleicht noch nen Gefallen tun und das bisl kommentieren.
Is für mich so bisl schwer nach zu vollziehen, was du da machst *g*
miniversum
miniversum 04.12.2008 um 18:12:39 Uhr
Goto Top
Ich werd die Kommentare oben reinediieren.
Manolax
Manolax 04.12.2008 um 18:33:25 Uhr
Goto Top
Danke für die comments
Aber was genau bewirkt denn ('dir /b /ad "%dir%"') in der for schleife???
Hab das gerade schon mal getestet, das ist der Ouput:
C:\>deltest.cmd C:\Folder 30

Das System kann den angegebenen Pfad nicht finden.
delage32.exe C:\Folder\*.* 30 /recurse /created /modified /preview
Das System kann den angegebenen Pfad nicht finden.
delage32.exe C:\Folder\*.* 30 /recurse /created /modified /preview
Das System kann den angegebenen Pfad nicht finden.
delage32.exe C:\Folder\*.* 30 /recurse /created /modified /preview
Das System kann den angegebenen Pfad nicht finden.
delage32.exe C:\Folder\*.* 30 /recurse /created /modified /preview

In dem Ordner sind nur paar Testdateien drin, denen ich per hand ein altes Datum eingetragen habe und ein paar mit heutigem Datum...
Werde das dann morgen nochmal testen, geh jetzt erst mal heim...

Aber trotzdem schon mal THX
miniversum
miniversum 04.12.2008 um 19:19:50 Uhr
Goto Top
dir /b /ad "%dir%"
Sollte dir die Verzeichnisse anzeigen die in %dir% sind.

Ich sehe grade: In zeile 22 ist ein fehler. Das muss natürlichnciht
pushd "%%~i"
sondern
pushd "%%~j"
lauten (ich korrigiere es mal oben)
Manolax
Manolax 05.12.2008 um 10:16:49 Uhr
Goto Top
Hmm...
Die Ausgabe bleibt die gleiche, wie ich schon gepostet habe...
Mal schauen ob ich den Fehler finde^^
Manolax
Manolax 05.12.2008 um 13:44:55 Uhr
Goto Top
Bei Zeile 8 muss es
pushd "%dir%%%~i"

anstatt
pushd "%%~i"

heißen
miniversum
miniversum 05.12.2008 um 17:41:35 Uhr
Goto Top
Achja stimmt. Ich werds oben noch ändern.
Funktioniert den dann alles wie es soll?