CMD Script Wiederholen?
Hallo zusammen,
Ich möchte gerne die Startup-Config und die Running-Config eines Aruba Switches täglich sichern, mit Timestamp.
Zusätzlich sollen die Dateien für 30 Tage vorgehalten werden in einen bestimmten Pfad kopiert werden und danach wieder nacheinander überschrieben werden.
mein script sieht wie folgt aus:
__________________________________________________
@echo off
echo Starting....
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo y | "pscp.exe" -v -P 22 -scp "@192.168.1.1:cfg/running-config" "c:\TestBackup\Switches\Backup_%DATETIMEF%_192.168.1.1_run.conf"
echo y | "pscp.exe" -v -P 22 -scp "@192.168.1.1:cfg/startup-config" "c:\TestBackup\Switches\Backup_%DATETIMEF%_192.168.1.1_start.conf"
echo DONE!
_________________________________________________________________________
Jetzt funktioniert das, aber ich möchte die Backups gern wie schon erwähnt nach und nach ab Tag 30 überschreiben, das funktioniert so leider noch nicht. Also ab Tag 31, das erste, ab Tag 32, das zweite usw.
Ich stecke gerade irgendwie fest ^^
Ich hoffe ihr könnt mir helfen.
1 Antwort
Das Überschreiben kann nicht funktionieren, da Du Deine Daten in einen Ordner mit exaktem Datum und Uhrzeit speicherst. Da es jedes Datum nur einmal geben kann wird bis in alle Ewigkeit ein neuer Ordner angelegt. (selbst ohne Uhrzeit mindestens 10.000 Jahre lang)
@echo off
set "datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%"
set "datetimef" &rem mal anzeigen
pause
ich habe recht wenig Lust mich mit Putty und dessen Möglichkeiten auseinanderzusetzen.
Batch hat selbst kann keine Zeitspannen berechnen.
Die bequemste Möglichkeit wäre es, statt des ganzen Datums, einfach nur den Tag zu verwenden.
@echo off
set "datetimef=%date:~0,2%"
set "datetimef" &rem mal anzeigen
pause
...Dann wird einfach überschrieben, wenn Du wieder den gleichen Tag des Monats hast.
Das Manko, dass es nur alle 2 Monate einen 31. gibt kann man verschmerzen. (ebenso den Umstand, dass die Daten vom 29. , 30. und 31. Januar erst im März überschrieben werden)
..aber man kann auch richtig gewaltig zaubern:
Das julianische Datum zählt die Tage seit dem 1. Januar 4713 v. Chr fortlaufend.
Berechne Julianischen Tag für ein Datum :
demo.cmd
@echo off
call :getJulianDay 2022 06 04
echo 04.06.2022 Julianischer Tag: %JulianDay%
call :getJulianDay 2022 06 05
echo 05.06.2022 Julianischer Tag: %JulianDay%
call :getJulianDay 2022 06 06
echo 06.06.2022 Julianischer Tag: %JulianDay%
pause
exit /b
:getJulianDay
set "__yy=%~1"
set "__mm=%~2"
set "__dd=%~3"
set /a "__yy=10000%__yy% %% 10000 ,__mm=100%__mm% %% 100 , __dd=100%__dd% %% 100"
if %__yy% lss 100 set /a "__yy+=2000"
rem https://de.wikipedia.org/wiki/Umrechnung_zwischen_julianischem_Datum_und_gregorianischem_Kalender#:~:text=Dadurch%20beginnt%20der%20Kalender%20am,dieses%20Tages%20ist%20JD0%20%3D%201721426.
set /a "JulianDay=__dd - 32075 + 1461 * (__yy + 4800 + (__mm-14) / 12) /4 + 367 * (__mm - 2 -(__mm - 14) / 12 * 12) / 12 - 3 * ((__yy + 4900 + (__mm - 14) / 12) / 100) / 4"
exit /b
Damit lässt sich prima rechnen.
So auch ein Modulo 30. Das heist, eine fortlaufende Zählung bei der Division durch 30 innerhalb von 30 Schritten immer wieder den gleichen Rest:
@echo off
setlocal enableDelayedExpansion
for /l %%a in (1,1,370) do (
set /a "__Rest= %%a %% 30 +1"
echo !__Rest!
)
pause
Jetzt haben wir eine Umrechnung in eine Lineare Tageszählung und eine Periode von 30.
..alles zusammen geworfen bekommen wir alle 30 Tage den gleichen Wert.
RoundRobin_Filename_Demo.cmd
@echo off
setlocal enableDelayedExpansion
call :getJulianDay %date:~-4% %date:~3,2% %date:~0,2%
echo Heute ist der %JulianDay% . Tag seit 1. Januar 4713 v. Chr!
set /a "__Rest= JulianDay %% 30 +1"
echo demoFilname=c:\TestBackup\Switches\Backup_%__Rest%_192.168.1.1_run.conf
pause
exit /b
:getJulianDay
set "__yy=%~1"
set "__mm=%~2"
set "__dd=%~3"
set /a "__yy=10000%__yy% %% 10000 ,__mm=100%__mm% %% 100 , __dd=100%__dd% %% 100"
if %__yy% lss 100 set /a "__yy+=2000"
rem https://de.wikipedia.org/wiki/Umrechnung_zwischen_julianischem_Datum_und_gregorianischem_Kalender#:~:text=Dadurch%20beginnt%20der%20Kalender%20am,dieses%20Tages%20ist%20JD0%20%3D%201721426.
set /a "JulianDay=__dd - 32075 + 1461 * (__yy + 4800 + (__mm-14) / 12) /4 + 367 * (__mm - 2 -(__mm - 14) / 12 * 12) / 12 - 3 * ((__yy + 4900 + (__mm - 14) / 12) / 100) / 4"
exit /b
...wo Du Dir das Richtige Datum Merkst ist eine andere Sache. Normlerweise speichert jedes Dateisytem für eine Datei das Datum der letzten Änderung, Somit hast Du auch bei einem RoundRobin-Dateinamen immer das Datum...
Das mit Forfiles ist mir natürlich bekannt. War aber keine Option für Netzwerkzugriff über pscp.exe.
In deiner Zeile greifst Du jedoch auf einen lokalen Pfad zu und nicht wie in der Frage via Putty auf einen entfernten Server zu..
Ich denke nicht zu kompliziert, sondern habe eine Lösung angesetzt, welche ohne Kenntnis der Optionen von Putty den gewünschten Effekt erzielt.
Für ein Löschen von Dateien, hätte ich eine Dateiliste vom Sever abrufen müssen und nach deren Aufbereitung in Batch neue Kommandozeilen generieren müssen. (Das wäre ersmal kompliziert geworden..)
Die einfachte Variante war eben überschreiben...
Da Du das ganze auch noch in Batch haben wolltest, macht die Sache nicht freundlicher. In Powershell hätte 7ch einfach direkt mit dem Server gearbeitet.
Das Juluanische Datum war lediglich eine Krücke um mit purem Batch einen rotierenden Dateinamen zu basteln...
Wie Du mit forfiles auf Deinem Server agieren willst würde mich brennend interessieren 😅
Wow..
Was für eine Geile Antwort. Aber wir beide haben einfach zu kompliziert gedacht ^^
Ich habe eine Zeile hinzugefügt und es läuft wie ich es mir vorgestellt habe:
jetzt werden einfach alle Dateien die älter sind als 30 Tage gelöscht wenn das Script täglich ausgeführt wird...
Nix mit umbenennen oder überschreiben nötig.
Es kann so einfach sein, wenn man nicht zu kompliziert denkt :-D
Aber trotzdem 1000 Dank für deine Antwort. Das erlernte kann ich sicherlich dennoch irgendwann mal brauchen ;)