daujoe
Goto Top

Alte Backups automatisch löschen

Hallo,

ich habe folgende Situation:

- Ich möchte wöchentliche automatische Backups von normalen Dokumenten auf die selbe HD durchführen.
- Nun hätte ich noch gerne den Wunsch, dass diese Backup-Ordner immer nach dem jeweiligen Datum benannt werden.
- Nach jedem erfolgreich durchgeführtem Backup sollten alle ausser die letzten 4 Backups gelöscht werden. (ich möchte nur die Backups der letzten 4 Wochen haben, also 4 Ordner)

Gibt es dazu eine Möglichkeit, dies in eine .bat Datei zu schreiben oder kennt hier jemand ein Tool, welches derartiges bewältigen kann?

Danke für alle Antworten

Content-Key: 170048

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

Printed on: April 20, 2024 at 16:04 o'clock

Member: Friemler
Friemler Jul 19, 2011 at 20:19:39 (UTC)
Goto Top
Hallo Goalgetter,

  1. Geplanten Task anlegen und mit XCOPY kopieren. Siehe xcopy /?.
  2. md "BackupVerzeichnis\Backup-%date:.=-%"
  3. Folgender Code löscht im Backupverzeichnis alle Verzeichnisse älter als 28 Tage:
@echo off & setlocal

set "VBScript=%Temp%\DeleteOlderThan4Weeks.vbs"  

> "%VBScript%" echo If WScript.Arguments.Count ^> 0 Then  
>>"%VBScript%" echo   Set objFSO = CreateObject("Scripting.FileSystemObject")  
>>"%VBScript%" echo   If objFSO.FolderExists(WScript.Arguments(0)) Then  
>>"%VBScript%" echo     For Each objFolder In objFSO.GetFolder(WScript.Arguments(0)).SubFolders  
>>"%VBScript%" echo       If DateDiff("d", objFolder.DateCreated, Now) ^> 28 Then objFolder.Delete(True)  
>>"%VBScript%" echo     Next  
>>"%VBScript%" echo     WScript.Quit 0  
>>"%VBScript%" echo   Else  
>>"%VBScript%" echo     WScript.Quit 1  
>>"%VBScript%" echo   End If  
>>"%VBScript%" echo Else  
>>"%VBScript%" echo   WScript.Quit 2  
>>"%VBScript%" echo End If  

cscript /nologo "%VBScript%" "Laufwerk:\Pfad\Backupverzeichnis"  

del "%VBScript%"  
Bei Erfolg hat ERRORLEVEL den Wert 0, wenn des übergebene Verzeichnis nicht gefunden wurde den Wert 1 und bei fehlendem Verzeichnis den Wert 2.

Weitere Möglichkeit:
@echo off & setlocal

set "BackupDir=Z:\Backups"  

for /f "skip=4 delims=" %%d in ('dir /b /a:d /t:c /o:-d "%BackupDir%"') do (  
  rd /s /q "%BackupDir%\%%d"  
)
Es werden alle Verzeichnisse bis auf die vier jüngsten gelöscht.

Gruß
Friemler
Member: DauJoe
DauJoe Jul 19, 2011 at 20:44:27 (UTC)
Goto Top
Also:

@ECHO OFF
 set quelle="QUELLENPFAD"  
 set ziel="ZIELPFAD\%date%_%time:~0,2%.%time:~3,2%"  

md %ziel%
xcopy %quelle% %ziel% /E

Wo genau muss ich nun das VBSCRIPT einbauen? oder muss das nebenher laufen, also auch einen Geplanten Task dafür anlegen?

Gruss
Member: Friemler
Friemler Jul 19, 2011 at 20:51:53 (UTC)
Goto Top
Hallo Goalgetter,

Du kannst mein Script von oben in das Backupscript einbauen. Das VBScript wird als temporäre Datei aus dem Batchscript heraus erzeugt und ausgeführt. Ob Du den Aufruf (die Zeile mit cscript /nologo) vor oder nach dem XCOPY einbaust bleibt Dir überlassen. Davor wäre geschickter, dann wird vor einem neuen Backup erstmal Platz geschaffen. Allerdings verlierst Du Backups, falls das neue Backup fehlschlägt.

BTW: XCOPY /E ist zu wenig. Setze Dich besser nochmal mit den Parametern von XCOPY auseinander.

Gruß
Friemler
Member: Friemler
Friemler Jul 19, 2011 at 21:01:42 (UTC)
Goto Top
Nachtrag:

Für den Zeitstempel hätte ich noch diese Idee:
@echo off & setlocal

set "quelle=QUELLENPFAD"  
set "ziel=ZIELPFAD"  


set "VBScript=%Temp%\GetTimeStamp.vbs"  

> "%VBScript%" echo WScript.Echo Year(Now) ^& "-" ^& Month(Now) ^& "-" ^& Day(Now) ^& " - " ^& Hour(Now) ^& "-" ^& Minute(Now) ^& "-" ^& Second(Now)  
for /f "delims=" %%t in ('cscript /nologo "%VBScript%"') do set "TimeStamp=%%t"  

del "%VBScript%"  

md "%Ziel%\%TimeStamp%"  
xcopy "%quelle%" "%ziel%\%TimeStamp%"  

Damit wird ein Zielverzeichnis erstellt, dessen Name das Format JJJJ-MM-TT - HH-MM-SS hat. Sowas lässt sich leichter sortieren.

Gruß
Friemler
Member: DauJoe
DauJoe Jul 20, 2011 at 08:46:02 (UTC)
Goto Top
Hallo,

also ich habs nun so:

 @echo OFF & setlocal 

set quelle="QUELLENPFAD"   
set ziel="ZIELPFAD"   

set "VBScript=%Temp%\GetTimeStamp.vbs"  

> "%VBScript%" echo WScript.Echo Year(Now) ^& "-" ^& Month(Now) ^& "-" ^& Day(Now) ^& " - " ^& Hour(Now) ^& "-" ^& Minute(Now)   

for /f "delims=" %%t in ('cscript /nologo "%VBScript%"') do set "TimeStamp=%%t"   
del "%VBScript%"   

md "%Ziel%\%TimeStamp%"   

xcopy "%quelle%" "%ziel%\%TimeStamp%" /E /C /I? /Y  

set "BackupDir=Z:\Backups"   

 

for /f "skip=4 delims=" %%d in ('dir /b /a:d /t:c /o:-d "%BackupDir%"') do (   

  rd /s /q "%BackupDir%\%%d"   

) 

Wäre das so korrekt? Bei dem xcopy Parameter /I bin ich mir nicht ganz sicher, ob es den benötigt...
Beim Timestamp habe ich mal die Sekunden herausgenommen, die finde ich etwas überflüssig.
Noch eine Frage: Was genau wird eigentlich in Zeile 11 gemacht?
Member: Friemler
Friemler Jul 20, 2011 at 09:23:42 (UTC)
Goto Top
Hallo Goalgetter,

Zeile 17 kannst Du Dir sparen und die FOR-Schleife ab Zeile 21 müsste dann so lauten:
for /f "skip=4 delims=" %%d in ('dir /b /a:d /t:c /o:-d "%ziel%"') do (  
  rd /s /q "%ziel%\%%d"  
)

Den Paramter /I bei XCOPY brauchst Du nur, wenn das Ziel der Kopieraktion nicht existiert. Dann wird das Ziel als Name eines Verzeichnisses interpretiert und dieses Verzeichnis auch angelegt. Du könntest Dir in dem Fall Zeile 13 (md "%Ziel%\%TimeStamp%") sparen.

Da Zeile 11 ein simpler DEL-Befehl ist, gehe ich davon aus, dass Du Zeile 10 meintest. Hier wird mit cscript /nologo "%VBScript%" das temporäre VBScript gestartet, das in Zeile 8 erstellt wurde. Die Ausgabe dieses Scripts wird durch die FOR-Schleife an die Variable TimeStamp zugewiesen. Grund für dieses Vorgehen ist, das Programme/Scripts nur numerische Werte zurückliefern können, keine Zeichenketten. Ausführliche Informationen zur FOR-Schleife liefert mein Tutorial zur FOR-Schleife.

Du solltest evtl. XCOPY noch den Parameter /Z übergeben, wenn Du auf eine Netzwerkfreigabe kopieren willst. Wenn ein Fehler beim kopieren einer Datei auftritt, wird dann der Kopiervorgang für diese Datei neu gestartet.

Gruß
Friemler
Member: DauJoe
DauJoe Jul 20, 2011 at 10:30:13 (UTC)
Goto Top
Hallo Friemler,

ich meinte schon Zeile 11. Dass das ein delete-Befehl ist, war mir schon klar. Ich versteh nur nicht ganz, wieso dass VBScript gelöscht wird... Oder wird hier eben dieses temporäre Script gelöscht? Dann wäre es klar...

@echo OFF & setlocal 

set quelle="QUELLENPFAD"   
set ziel="ZIELPFAD"   
md %ziel% 
set "VBScript=%Temp%\GetTimeStamp.vbs"  

> "%VBScript%" echo WScript.Echo Year(Now) ^& "-" ^& Month(Now) ^& "-" ^& Day(Now) ^& " - " ^& Hour(Now) ^& "-" ^& Minute(Now)   

for /f "delims=" %%t in ('cscript /nologo "%VBScript%"') do set "TimeStamp=%%t"   
del "%VBScript%"   

md "%Ziel%\%TimeStamp%"   

xcopy "%quelle%" "%ziel%\%TimeStamp%" /E /C /Y /Z  


for /f "skip=4 delims=" %%d in ('dir /b /a:d /t:c /o:-d "%ziel%"') do (   

  rd /s /q "%ziel%\%%d"   

)

Zu den Parametern: Die Reihenfolge, wie ich sie angebe ist nicht relevant, oder?

Gruss
Member: Friemler
Friemler Jul 20, 2011 at 10:39:49 (UTC)
Goto Top
Hallo Goalgetter,

ja, in Zeile 11 wird das temporäre Script gelöscht. Es hat ja in Zeile 10 seinen Zweck erfüllt, warum sollte man es als Datenschrott auf der Platte lassen?

Die Reihenfolge der Parameter für XCOPY ist egal, Du kannst sie sogar zu /ecyz zusammenfassen.

Gruß
Friemler
Member: DauJoe
DauJoe Jul 20, 2011 at 14:43:06 (UTC)
Goto Top
Hallo Friemler,

ich habe das Script nun mal getestet:

@echo OFF & setlocal 

set quelle="C:\test1"   
set ziel="C:\Backup\???"   
md %ziel% 
set "VBScript=%Temp%\GetTimeStamp.vbs"  

> "%VBScript%" echo WScript.Echo Year(Now) ^& "-" ^& Month(Now) ^& "-" ^& Day(Now) ^& " - " ^& Hour(Now) ^& "-" ^& Minute(Now)   

for /f "delims=" %%t in ('cscript /nologo "%VBScript%"') do set "TimeStamp=%%t"   
del "%VBScript%"   

xcopy "%quelle%" "%ziel%\%TimeStamp%" /E /C /Y /Z  


for /f "skip=4 delims=" %%d in ('dir /b /a:d /t:c /o:-d "%ziel%"') do (   

  rd /s /q "%ziel%\%%d"   

)

In Zeile 4, wie füge ich nun da das VBSCRIPT ein, damit Windows weiss, wie er den Ordner benennen soll? Mit %TimeStamp% funktioniert das nämlich nicht...

Wenn ich die.bat Datei dann ausführe, erscheint immer folgendes: http://puu.sh/3vw0 Egal was ich dann drücke, die Daten werden nicht kopiert, bzw der Ordner mit Zeitangaben wird nicht erstellt.
Member: Friemler
Friemler Jul 20, 2011 at 14:52:08 (UTC)
Goto Top
Hallo Goalgetter,

Du brauchst in Zeile 4 nichts einzufügen. %TimeStamp% kann hier auch nicht funktionieren, da die Variable zum Anfang des Scripts noch garnicht definiert ist. Das passiert ja erst in Zeile 10. Schreibe in Zeile 4 einfach set "ziel=C:\Backup", lass' Zeile 5 weg und füge zum XCOPY-Befehl noch den Parameter /I hinzu, dann sollte es funktionieren.

Halt, nicht ganz: Ändere zusätzlich Zeile 3 auf set "quelle=C:\test1", sonst hast Du die Anführungszeichen als Bestandteil der Variablen, was Fehler verursacht. Deshalb auch meine kleine Änderung für Deine Zeile 4.

Als Backupziel das C:-Laufwerk zu nehmen ist eine schlechte Idee.

Gruß
Friemler


[EDIT]
Betr. Screenshot: Der Fehler verschwindet durch den Parameter /I von XCOPY.

Und um sämtliche Unklarheiten zu beseitigen:
@echo off & setlocal 

set "quelle=C:\test1"   
set "ziel=D:\Backup"   

set "VBScript=%Temp%\GetTimeStamp.vbs"  

> "%VBScript%" echo WScript.Echo Year(Now) ^& "-" ^& Month(Now) ^& "-" ^& Day(Now) ^& " - " ^& Hour(Now) ^& "-" ^& Minute(Now)   
for /f "delims=" %%t in ('cscript /nologo "%VBScript%"') do set "TimeStamp=%%t"   
del "%VBScript%"   

xcopy /ecyzi "%quelle%" "%ziel%\%TimeStamp%"  

for /f "skip=4 delims=" %%d in ('dir /b /a:d /t:c /o:-d "%ziel%"') do (   
  rd /s /q "%ziel%\%%d"   
)
[/EDIT]
Member: DauJoe
DauJoe Jul 20, 2011 at 19:01:47 (UTC)
Goto Top
Hallo Friemler,

aah jetzt funktioniert es! Danke dir.

Ist es eigentlich auch möglich, mehrere "quellen" zu kopieren? Also z.B C:\test1 und C:\test2 in den Ordner C:\Backup kopieren.

Oder wäre es einfacher, einfach 2 Scripte laufen zu lassen?

Gruss
Goalgetter
Member: Friemler
Friemler Jul 20, 2011 at 20:06:31 (UTC)
Goto Top
Hallo Goalgetter,

klar ist das möglich:
@echo off & setlocal

set "Quellen=C:\Test1 "C:\Anderes Verzeichnis""  
set "Ziel=D:\Backup"  
set "Aufheben=4"  


set "VBScript=%Temp%\GetTimeStamp.vbs"  

> "%VBScript%" echo WScript.Echo Year(Now) ^& "-" ^& Right("0" ^& Month(Now), 2) ^& "-" ^& Right("0" ^& Day(Now), 2) ^& " - " ^& Right("0" ^& Hour(Now), 2) ^& "-" ^& Right("0" ^& Minute(Now), 2)  
for /f "delims=" %%t in ('cscript /nologo "%VBScript%"') do set "TimeStamp=%%t"  
del "%VBScript%"  


for /d %%q in (%Quellen%) do (
  xcopy /ecyzi "%%~q" "%Ziel%\%TimeStamp%\%%~nxq"  
)


for /f "skip=%Aufheben% delims=" %%d in ('dir /b /a:d /t:c /o:-d "%Ziel%"') do (  
  rd /s /q "%Ziel%\%%d"  
)

Du musst die Quellen in Zeile 3 angeben, immer durch ein Leerzeichen getrennt. Wenn der Pfad einer Quelle selbst Leerzeichen enthält, muss der Pfad, so wie im Beispiel das Verzeichnis C:\Anderes Verzeichnis, in Anführungszeichen gesetzt werden. Du kannst auch Wildcards (* bzw. ?) verwenden, um mehrere Verzeichnisse anzugeben, z.B. C:\Fotos*.

Wenn das Backup z.B. heute um 22:00 Uhr gestartet würde, würde folgende Verzeichnisstruktur entstehen:
D:\Backup\2011-07-20 - 22-00\Test1
D:\Backup\2011-07-20 - 22-00\Anderes Verzeichnis

Damit Monat, Tag, Stunde und Minuten immer 2-stellig angegeben werden, die kleinen Änderungen im VBScript.

Gruß
Friemler
Member: DauJoe
DauJoe Jul 20, 2011 at 21:04:48 (UTC)
Goto Top
Hallo Friemler,

nun klappt alles so wie ich es mir vorgestellt habe, danke Dir nochmals!

Gruss und vielen Dank
Goalgetter
Member: Friemler
Friemler Jul 20, 2011 at 21:11:27 (UTC)
Goto Top
Hallo Goalgetter,

gern geschehen. Markiere doch bitte noch den Beitrag als gelöst.

Gruß
Friemler