boulder
Goto Top

Ältestes Verzeichnis per Batch finden

Vorweg:

Ich habe ein Script geschrieben, welches eine Backupdatei in ein Unterverzeichnis verschiebt. Jetzt prüfe ich, wie groß die verschobeneSicherung war, rechne eine Sicherheit von 50% oben drauf und vergleiche das mit dem aktuell freien Speicher auf dem Laufwerk. Wenn der restliche Speicherplatz kleiner ist als die errechnete Sicherheit, dann komme ich zu dem unten abgebildeten Teil. Hier soll später einmal die älteste Sicherung gelöscht werden.

Ich habe Verzeichnisse im Format \Backup_JJJJMMTT erstellt.

:VOLL
echo Zu wenig freier Speicher, loesche aelteste Tagessicherung
set vergleich=9999999999999

FOR /F "tokens=2 delims=_" %%i in ('dir %LW% /-c') do IF "%%i" lss "%vergleich%" (  

echo %%i ist lss #kleiner als# %vergleich% 

set vergleich=%%i 

echo Habe Vergleich auf %vergleich% gesetzt #Sollte %%i sein#)

echo Ich wuerde %vergleich% loeschen.

pause

GOTO :SPACE

Mein Problem ist jetzt, das er das set vergleich=%%i nur am ende des FOR wirklich ausführt.
Die Ausgabe des Script ist folgende:

Zu wenig freier Speicher, loesche aelteste Tagessicherung
20090303 ist lss #kleiner als# 9999999999999
Habe Vergleich auf 9999999999999 gesetzt #Sollte 20090303 sein#
20090304 ist lss #kleiner als# 9999999999999
Habe Vergleich auf 9999999999999 gesetzt #Sollte 20090304 sein#
20090305 ist lss #kleiner als# 9999999999999
Habe Vergleich auf 9999999999999 gesetzt #Sollte 20090305 sein#
Ich wuerde 20090305 loeschen.
Press any key to continue . . .

Bei folgender Verzeichnisstruktur....

03.03.2009 11:53 <DIR> Backup_20090303
03.03.2009 11:41 <DIR> Backup_20090304
03.03.2009 11:41 <DIR> Backup_20090305


Bitte um kundige Hilfe, ich werde hier wahnsinnig....

Content-Key: 110425

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

Ausgedruckt am: 29.03.2024 um 11:03 Uhr

Mitglied: bastla
bastla 03.03.2009 um 18:38:10 Uhr
Goto Top
Hallo Boulder und willkommen im Forum!

Da Du eine durchgängige Namenskonvention hast, ist ein Zerlegen und Vergleichen gar nicht nötig - einfach nach Namen (absteigend) sortieren und den letzten Verzeichnisnamen verwenden:
for /f %%i in ('dir D:\Backup_* /b /o-n /ad') do set "Aeltestes=%%i"
Grüße
bastla
Mitglied: Boulder
Boulder 05.03.2009 um 13:13:10 Uhr
Goto Top
Danke schön. Funktioniert genau wie's sein soll.

Hier nochmal das komplette Script, falls jemand ein ähnliches Problem hat.

Das Script verschiebt eine Acronissicherung in ein Unterverzeichnis mit entsprechendem Datum
und löscht die ältesten Sichrungen wenn der Speicher knapp wird. Verbesserungen sind natürlich
immer Willkommen, laufen tut das Ganze aber bei mir fürs erste.

@echo off
echo ====================Backup Batchscript=====================
echo ========================Version 1.0=======================
echo ==========================stable=========================
echo.
echo. 
echo. 
echo.

set LW=F:
rem Datum ins Format JJJJ-MM-TT bringen
FOR /F "tokens=1,2,3 delims=. " %%a in ('date/T') do set CDATE=%%c%%b%%a  

rem Backup Verzeichnis anlegen und Tagesbackup in das Verzeichnis verschieben
IF EXIST F:\Backup.tib (GOTO :MOVE ) ELSE (GOTO :END )

:MOVE
IF NOT EXIST F:\Backup_%CDATE% mkdir F:\Backup_%CDATE%
move F:\Backup.tib F:\Backup_%CDATE%
GOTO :SPACE

:SPACE
rem Freien Speicher auf dem Laufwerk rausfinden
FOR /F "tokens=3 delims= " %%i in ('dir %LW% /-c') do set frei=%%i  

set Zahl1=%frei%
set Zahl2=1048576
set Stellen=0

set R=Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1),,,0)>%R%
for /f %%i in ('cscript //nologo %R% "%Zahl1%/%Zahl2%" %Stellen%') do set Ergebnis=%%i  
set frei=%Ergebnis%
del Rechne.vbs

echo Freier Speicher auf %LW%          %frei% MB
echo.

rem Groesse des letzten Backups rausfinden
FOR /F "tokens=2,3 delims= " %%h in ('dir %LW%\Backup_%CDATE% /-c') do IF "%%h" equ "File(s)" set belegt=%%i  

set Zahl1=%belegt%
set Zahl2=1048576
set Stellen=0

set R=Rechne.vbs
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1),,,0)>%R%
for /f %%i in ('cscript //nologo %R% "%Zahl1%/%Zahl2%" %Stellen%') do set Ergebnis=%%i  
set belegt=%Ergebnis%
del Rechne.vbs

set /a sicherheit=(%belegt%/2)*3

echo Aktuelle Sicherung belegte:     %belegt% MB
echo.
echo Als Puffer fuer naechste 
echo Sicherung erforderlich:         %sicherheit% MB
echo.
echo.
echo.
set frei=11
echo Frei gesetzt auf %frei%
if %frei% lss %sicherheit% (GOTO :VOLL) ELSE (GOTO :FREI)

:VOLL
echo Zu wenig freier Speicher, loesche aelteste Tagessicherung

for /f %%i in ('dir %LW%\Backup_* /b /o-n /ad') do set "Aeltestes=%%i"  
echo Ich werde %aeltestes% loeschen.
pause
rd %LW%\%aeltestes% /s/q
GOTO :SPACE

:FREI
echo Genuegend freier Speicher vorhanden
GOTO :END

:ERROR
echo Fehler bei der Ausfuehrung des Backupscripts
GOTO :TERMINATE

:END
echo Script fehlerfrei abgelaufen

:TERMINATE

Einschränkungen:

Für englischsprachiges Windows geschrieben, in anderen Sprachvarianten muss
FOR /F "tokens=2,3 delims= " %%h in ('dir %LW%\Backup_%CDATE% /-c') do IF "%%h" equ "File(s)" set belegt=%%i  

geändert werden, z.B. in Datei(en)

Bei einer größenänderung von über 50% im Vergleich zum vorherigen Backup kann der Speicher trotzdem
volllaufen, da nur mit einer Sicherheit von 50% gerechnet wird.