Batch X ältesten Ordner löschen - folgendes Script funktioniert nicht

CED999

Lieutenant
Registriert
Juni 2011
Beiträge
963
Hallo,

in einem BackupOrdner liegen mit Robocopy erstellte Backups. Die Backups sind Ordner wie 15.06.2015, 14.6.2015, 13.6.2015 die dann die eigenltichen Sicherungsdateien für den Tag enthalten.

Ich möchte nun ein Script haben, das sobald mehr als 40 Ordner in der Backupdestination sind die X ältesten Ordner löscht, damit ich wieder 40 in dem Ordner habe.

Aus dem Web hatte ich folgendes erfahren:

Code:
set Pf_ZielBackup=H:\test


echo off
Setlocal EnableDelayedExpansion
set "_count=0"
rem count the files
for /f "tokens=*" %%a in ('dir %Pf_ZielBackup% /a:d /b /o:d') do @(set /a _count+=1 >nul) 

echo !_count! directories found
rem delete _count-30 files
for /f "tokens=*" %%a in ('dir %Pf_ZielBackup% /a:d /b /o:d') do (
    set /a _count-=1
    echo directory !_count! is %Pf_ZielBackup%\%%a
    rd/s /q %Pf_ZielBackup%\%%a


    if "!_count!"=="30" (
      goto :done
    )
  )
:done
pause

was aber nicht funktioniert - das Script hat jeden Ordner (Zum Glück im Testordner) gelöscht....
 
Dein Script funktioniert schon, aber nur, wenn mindestens ein Ordner mehr existiert als am Ende bleiben sollen.

Du prüfst erst am Ende der Schleife, wenn schon ein Ordner gelöscht wurde, ob Dein Zähler (Anzahl der Ordner) auf genau 30 steht.
Wenn nun 30 oder weniger Ordner vorhanden sind, wird die Abbruchbedingung nie wahr und alle Ordner werden gelöscht.

Also besser prüfen ob kleiner/gleich 30 und die Prüfung als erstes in der Schleife durchführen.


Oder schau Dir diese Alternative an:

Code:
set Pf_ZielBackup=H:\test


echo off
Setlocal EnableDelayedExpansion
set "_count=0"
set "foldersToKeep=40"

rem count the files
for /f "tokens=*" %%a in ('dir %Pf_ZielBackup% /a:d /b /o:d') do @(set /a _count+=1 >nul)
 
echo !_count! directories found

rem keep x folders, delete the rest
rem with x as the variable "foldersToKeep"
for /f "skip=%foldersToKeep%" %%b in ('dir %Pf_ZielBackup% /a:d /b /o:-d') do (
    echo directory !_count! is %Pf_ZielBackup%\%%b
    set /a _count-=1
    rd /s /q %Pf_ZielBackup%\%%b
)

pause


Das skip sorgt dafür das die ersten x Schleifendurchläufe übersprungen werden, daher ist die Sortierreihenfolge des dir-Befehls für diese Schleife umgekehrt (zuerst die neuen Ordner, die nicht gelöscht werden sollen).
 
Hi HDScratcher,
Ich danke Dir - Du hast das völlig gerockt!! Mit Dir haben sich drei Leut daran probiert nur Deine Lösung funzt zuverlässig.

Nur eine Frage dein Code wird in einer längeren .cmd eingesetzt, ist das "DelayedExpansion" dabei gefährlich und sollte das wieder ausgeschaltet werden, oder ist das unproblematisch? Habe davon nicht wirklich Plan..

Grüße!
 
Bisher wüsste ich nicht, dass es gefährlich wäre, insbesondere, da die Variablen auch noch mit ! statt % genutzt werden müssen, damit EnableDelayedExpansion auf sie einen Effekt hat.
 
O.K. super Danke Dir again!
 
Die "verzögerte Variablenerweiterung" ist nur zum Anzeigen des Zählers in der Schleife nötig. Das könnte auch anders gelöst werden.
 
Zurück
Oben