CMD Script Wiederholen?

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

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...

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

loloft 
Beitragsersteller
 07.06.2022, 09:49

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:

forfiles /p "c:\TestBackup\Switches" /s /m *.* /d -30 /c "cmd /c del @path"

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 ;)

Erzesel  07.06.2022, 10:51
@loloft

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 😅