CMD Backupscript erstellen nach Vorgabe?
Hallo Leute,
ich bräuchte eure Hilfe, und zwar hab ich diesen Auftrag.
- einen Ordner mit Testdateien erstellen
z.B.: C:\users\Test\desktop\Test\Testordner
- das Script soll jeden Tag ausgeführt werden
- das Script soll beim Ausführen den Ordner in einen Backupordner kopieren und dort nach dem Datum und der Uhrzeit vom Backup benennen
z.B.: in "C:\users\Test\desktop\Test" soll dann ein Backupordner namens "Testordner_03.08.2022_12:30" erstellt werden
- das Script soll am Ende prüfen, wie viele Backups es gibt und wenn es mehr als 3 Backups gibt, das ÄLTESTE Backup löschen
z.B.:
Testordner_01.08.2022_12:30
Testordner_02.08.2022_12:30
Testordner_03.08.2022_12:30
Testordner_04.08.2022_12:30
und es wird der Ordner "Testordner_01.08.2022_12:30" gelöscht.
wie kann ich das am besten umsetzen ?
hat jemand zufällig ein Script wo genau das macht ?
danke Für eure Hilfe im vorraus.
2 Antworten
color a
ganz wichtig...😅 cooles grün... (aufhübschen kann man den output, wenn alles läuft😏 )
C:\Users\TimGoldschmidt\Desktop ...
was gefällt Dir nicht an "%UserProfile%\Desktop" ? Das passt immer, egal ob der Nutzer Rumpestilzchen oder Erzesel heist.
echo "%UserProfile%\Desktop"
und natürlich sollte man Pfade immer in "Gänsefüßchen" an Befehle übergeben
was muss ich noch hinzufügen, damit der Kopierte Ordner im Backup Ordner das Datum + die Zeit anzeigt?
Ich habe doch in den obigen beiden Demos erklärt, wie man eine guten Zeitstempel erstellt.
richtig:
rem Zeistempel erstellen
set "ZTime=%time: =0%"
set "TimeStamp=%date:~6,4%%date:~3,2%%date:~0,2%%ZTime:~0,2%%ZTime:~3,2%%ZTime:~6,2%
echo %Timestamp%
total falsch:
set "TimeStamp=%date%_%time%"
- %Time% beinhaltet einen Doppelpunkt(e)! Diese sind in Datei-/Ordnernamen unzulässig. (Der Doppelpunkt kennzeichnet unter Windows Laufwerkbuchstaben)
- einstellige Stunden beginnen mit einem Leerzeichen. (das ist in WindowsDateinamen zwar nicht kritisch, aber unschön
- ein deutsches Datum beginnt mit dem Tag. Wollte man solche Datatumstrings sortieren, würden alle Daten nach dem Tag sortiert erscheinen:
01.05.2022
07.02.2022
09.09.2022
10.02.2022
14.10.2021
...die sind wirklich sortiert! (inakzeptabel)
Wenn ich etwas auf ein bestimmte Art tue, hat das seine Bewandtnis. international gebräuchlich ist ein Zeitstempel im Format "yyyyMMddHHmmss" (20220914131949) das entsprich jahr:2022 monat:09 tag:14 stunde:13 minute:19 sekunde: 49
...und lässt sich perfekt sortieren:
20211031131852
20211219131852
20211224131852
20220308131852
20220523131852
wie kann ich das jetzt vorhandene Script erweitern, damit es überprüft ob dann schon 3 Backups vorhanden sind und somit beim 4ten versuch das älteste löscht damit es immer 3 Backups bleiben.
...macht Doch die 1.Demo.
for /f "skip=3 ...usw. überspringt 3 übermittelte Ergebnisse. Wenn dann nichts übrig bleibt wird der Loop-Body ( do (...) ) nicht ausgeführt. Die Routine ist logisch bereits so aufgebaut, das sie automatisch 3 Ergebnisse bewahrt, indem sie diese nicht an den Löschbefehl übergibt. was soll da noch extra überprüft werden?
du hättest nichts weiter tun müssen als die entsprechend Routine zu übernehmen und die Pfade /Wildcard-Muster anzupassen.
Die Nummer mit forFiles scheidet ohnehin aus, weil sie mehr als 3 backups innerhalb 3 Tagen zulässt...
also nochmal Demo1.cmd an Deine neuen Pfadvorgaben angepasst: lösche ggf. die gekennzeichneten Zeilen, welche die Demoumgebung kreieren.
@echo off
chcp 65001 >nul
set "Basefolder=%userprofile%\Desktop"
set "BackupBase=%userprofile%\Desktop\Backup
rem erzeuge testordner die folgenden 3 Zeilen können weg
md "%Basefolder%\Testordner" 2>nul
echo Hallo Test >"%Basefolder%\Testordner\blubb.txt"
md "%Basefolder%\Testordner\blubbFolder"
color a &rem hauptsache grün
rem Zeistempel erstellen
set "ZTime=%time: =0%"
set "TimeStamp=%date:~6,4%%date:~3,2%%date:~0,2%%ZTime:~0,2%%ZTime:~3,2%%ZTime:~6,2%
rem erstelle Backup
xcopy "%Basefolder%\Testordner\" "%BackupBase%\Testordner_%TimeStamp%\" /ehyrk
for /f "skip=3 tokens=*" %%a in ('dir /b /ad /tc /o-d "%BackupBase%\Testordner_20*"') do (
echo lösche: "%BackupBase%\%%~a"
rd /s /q "%BackupBase%\%%~a"
)
pause
Jetzt Funktioniert Alles perfekt, und ich habe was neues Gelernt vielen dank für die Hilfe :)
relativ simpel: behält nur die Neuesten 3 Backups.
demo.cmd
@echo off
chcp 65001 >nul
set "Basefolder=%userprofile%\Desktop\Test"
rem erzeuge testordner auf dem aktuellen Desktop\test
md "%Basefolder%\Testordner" 2>nul &rem fehler unterdücken, wen ordner bereits existiert.
rem erzeuge zur Demo auch noch ne Datei und eine Unterverzeichnis im Ordner
echo Hallo Test >\Testordner\blubb.txt"
md "%Basefolder%\Testordner\blubbFolder"
rem einstellige Stunden mit 0 auffüllen (einstellige Stunden hanben normal das Format " 3:48:55,35")
set "ZTime=%time: =0%"
rem Zeitstempel JahrMonatTagStundeMinuteSekunden wird sortiert angezeigt (nur so herum macht ein Timstamp im Namen Sinn) ...umordnen... (millisekunden werden nicht gebraucht)
set "TimeStamp=%date:~6,4%%date:~3,2%%date:~0,2%%ZTime:~0,2%%ZTime:~3,2%%ZTime:~6,2%
rem erstelle Backup
xcopy "%Basefolder%\Testordner\" "%Basefolder%\Testordner_%TimeStamp%\" /sehyrk
rem lösche alle Ordner außer den neuesten 3
rem (sortiere ordner nach Erstellungszeit /tc, Neueste zuerst /o-d , überspringe die ersten 3)
rem damit Du nicht auch den fast gleichnamigen Originalordner erwischst der Filter testordner_20* ,denn das hanen alle Backups gemeinsam
for /f "skip=3 tokens=*" %%a in ('dir /b /ad /tc /o-d "%Basefolder%\testordner_20*"') do (
echo lösche: "%Basefolder%\%%~a"
rd /s /q "%Basefolder%\%%~a"
)
pause
- https://docs.microsoft.com/de-de/windows-server/administration/windows-commands/dir
- https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/for
Fast das Gleiche, löscht jedoch nur Backupordner, welche älter als 3 Tage sind.:
demo2.cmd
@echo off
chcp 65001 >nul
set "Basefolder=%userprofile%\Desktop\Test"
md "%Basefolder%\Testordner" 2>nul
echo Hallo Test >\Testordner\blubb.txt"
md "%Basefolder%\Testordner\blubbFolder"
set "ZTime=%time: =0%"
set "TimeStamp=%date:~6,4%%date:~3,2%%date:~0,2%%ZTime:~0,2%%ZTime:~3,2%%ZTime:~6,2%
xcopy "%Basefolder%\Testordner\" "%Basefolder%\Testordner_%TimeStamp%\" /sehyrk
rem filter Pfade im Basefolder mit dem Muster "Testordner_20*" die älter als 3 Tage und Ordner sind, lösche diese
forfiles /p "%Basefolder%" /m "Testordner_20*" /d -3 /c "cmd /c if @isdir==TRUE echo lösche: @path & rd /s /q @path"
pause
Danke für dieses Script, ich habe jetzt Testweise auch versucht es Selbst zu schreiben und habe das bis jetzt.
@ECHO off
color a
xcopy C:\Users\TimGoldschmidt\Desktop\Testordner\* C:\Users\TimGoldschmidt\Desktop\Backup\ /E /G /H /Y
ECHO Backup abgeschlossen!
PAUSE
Der Ordner wird in den Backup Ordner kopiert.
jetzt wäre die Frage, was muss ich noch hinzufügen, damit der Kopierte Ordner im Backup Ordner das Datum + die Zeit anzeigt? und zusätzlich wie kann ich das jetzt vorhandene Script erweitern, damit es überprüft ob dann schon 3 Backups vorhanden sind und somit beim 4ten versuch das älteste löscht damit es immer 3 Backups bleiben.
LG