cadiarn
Goto Top

Löschen der ältesten Datei im Unterverzeichnis.

Moin Leutz hätte da ein kleines Prob. mit einem Batch file

Ich soll zur Zeit eine Batch Datei schreiben, die es ermöglicht die ältesten Dateien in einem angegebenen Dateipfad zu löschen unter den Bedingungen das:

a -die Festplatte nur noch wehnig speicherplatz enthält. (z.b. 1 GB)

b -Das Batch nur eine Geringe Priorität besitzt um nicht das System auszubremsen.

c -Nur in den angegebenen Pfad ausgewälte Dateien gelöscht werden. (z.b. nur JPG im Ordner D:\fd)

d -Dabei sollen alle Ordnerinhalte (auch Unterordner) mit dem Änderungsdatum vergleichen werden und die älteste Datei gelöscht.

Das ganze soll rellativ schnell unter der Bedingung "a" wiederholt werden.

bisher schaut mein Programm so aus:
::-----------------------------------------------------------------
@echo off & setlocal
if "%1"=="" (
start /WAIT /LOW /B cmd.exe /V /C %~s0 weiter_machen
goto:eof
)

:start
set LW=C:
FOR /F "tokens=3 delims= " %%i in ('dir %LW% /-c') do set Frei=%%i
if %frei% gtr 1000000000 goto vok

set "Ordner=D:\db"
for /f "delims=" %%i in ('dir /b /o-d "%Ordner%"') do set "Alt=%Ordner%\%%i"
del "%Alt%" /s /q
pause

:vok
sleep 60
goto start
pause
::----------------------------------------------------------------

Ich bekomme es nur nicht hin das der "dir" Befehl unterordner mit einbezieht b.z.w. die änderungsdaten vergleicht.

Hoffe jemand kann mir helfen.
LG kai

Content-Key: 176080

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

Printed on: April 19, 2024 at 18:04 o'clock

Mitglied: 60730
60730 Nov 10, 2011 updated at 15:56:09 (UTC)
Goto Top
joMän

Moin Leutz hätte da ein kleines Prob. mit einem Batch file
bisher schaut mein Programm so aus:
::-----------------------------------------------------------------
@echo off & setlocal

Dort, wo du das gefunden hast, stand sicherlich auch wie und für was es genutzt wird.
Ich bekomme es nur nicht hin das der "dir" Befehl unterordner mit einbezieht b.z.w. die änderungsdaten vergleicht.
Grass - da hat der Biber? auch voll daneben gedenkt, denn die freien Beits auf einer Bladde sind ja in jedem Unterordner annerst.

Was macht ?
dir /b /o-d

Was sagt dir /?
/scheibenkleister
Member: bastla
bastla Nov 10, 2011 updated at 15:56:19 (UTC)
Goto Top
Hallo Cadiarn und willkommen im Forum!

Das könnte so gehen (mit Betonung auf "gehen" face-wink):
@echo off & setlocal
@set #=||(set #=1&start "%~dpnx0" /min cmd /c %0 %*&set #=&goto :eof)  
if "%1"=="" (  
start /WAIT /LOW /B cmd.exe /V /C %~s0 weiter_machen
goto:eof
)

:start
set LW=C:
FOR /F "tokens=3 delims= " %%i in ('dir %LW% /-c') do set Frei=%%i  
if %frei% gtr 1000000000 goto vok

set "Ordner=D:\db"  
set "AltDat=999999999999" & set "Alt="  
for /f "delims=" %%i in ('dir /s /b /a-d "%Ordner%"') do for /f "tokens=1-5 delims=.: " %%a in ("%%~ti") do call :ProcessFile "%%c%%b%%a%%d%%e" "%%i"  
if defined Alt echo del "%Alt%" /s /q  

:vok
sleep 60
goto start

:ProcessFile
if %1 geq "%AltDat%" goto :eof  
set "AltDat=%~1"  
set "Alt=%~2"  
goto :eof
Das Testen habe ich übrigens Dir überlassen - deswegen das "echo" vor dem "del ...

Grüße
bastla

P.S.: Mit der passenden (lässt sich auch noch nachholen face-wink) liest sich geposteter Code leichter ...
Member: Cadiarn
Cadiarn Nov 10, 2011 at 15:02:38 (UTC)
Goto Top
@timobeil

Manchmal sieht man den Wald vor lauter Bäumen nicht.
Der Tipp hat mich auf die Lösung gebracht geht super.

Danke.
Member: Cadiarn
Cadiarn Nov 10, 2011 at 15:04:42 (UTC)
Goto Top
Danke bastla werde das auch noch später testen.

LG Cadiarn
Member: bastla
bastla Nov 10, 2011 at 15:09:17 (UTC)
Goto Top
Hallo Cadiarn!

Ich fürchte nur, ein
dir /s /b /o-d
wird Dir nicht (weit genug) helfen, da die Ausgabe immer noch je Unterordner zusammengefasst erfolgt ...

@t-mo
... deswegen für mich eine nicht "nicht anspruchsvolle" Frage ... face-wink

Grüße
bastla
Member: Cadiarn
Cadiarn Nov 10, 2011 at 15:35:03 (UTC)
Goto Top
@bastla

Ja ich seh schon, hab deine Idee mal umgesetzt schaut nicht schlecht aus.

Jetzt muss ich nur noch ändern das es leere Ordner mit löscht und g.g.f. schauen das nur jpg und index.html's gelöscht werden an Dateien.

Dank dir

LG Cadiarn
Member: bastla
bastla Nov 10, 2011 at 15:59:40 (UTC)
Goto Top
Hallo Cadiarn!
schauen das nur jpg und index.html's gelöscht werden an Dateien.
Wenn beide gemeinsam einbezogen werden sollten (also die älteste Datei, die entweder vom Typ "jpg" ist oder "index.html" heißt), könntest Du versuchsweise die Zeile 15 auf
for /f "delims=" %%i in ('dir /s /b /a-d "%Ordner%\*.jpg" "%Ordner%\index.html"') do for /f "tokens=1-5 delims=.: " %%a in ("%%~ti") do call :ProcessFile "%%c%%b%%a%%d%%e" "%%i"
ändern ...
Zum Löschen aller leeren Unterordner von %Ordner%:
for /f "delims=" %%i in ('dir /s /b /ad "%Ordner%"^|sort /r') do rd "%%i" 2>nul
Anmerkung: Durch die Sortierung werden die längeren Pfade (= Unterordner) vorweg behandelt - damit kann die Struktur "von unten nach oben" aufgerollt werden, und ein "rd" ohne weitere Schalter entfernt nur leere Ordner. Das Unterdrücken der Fehlermeldung "Das Verzeichnis ist nicht leer." durch die Umleitung des Kanals 2 (STDERR) nach "nul" ist dann nur noch Kosmetik ...

Grüße
bastla