Nur Dateien löschen in verschiedenen Ordnern nach X Tagen.
Hallo zusammen,
ich brauche mal wieder von der Gemeinde ein paar Tipps, weil ich bei dem Script nicht weiter komme.
Es geht um eine Angelegenheit, die mich schon ein paar Tage beschäftigt und wo ich dringend Hilfe von ein paar schlauen Köpfen benötige.
Ich besitze ein paar Server, die regelmäßig lokal logs schreiben in einen festen Ordern.
Hier kurz aufgemalt wie ich das meine.
Beispiel:
>C:
>Logs <- Hauptordner
>11111111 <- ein Unterordner
>11111111_20120706113401_logs.zip
>11111111_20120806113401_logs.zip
>11111111_20110706113401_logs.zip
>11111111_20100706113401_logs.zip
>11111111_usw._logs.zip
>11111112
>11111113_20120706113401_logs.zip
>11111113_20120806113401_logs.zip
>11111113_20110706113401_logs.zip
>11111113_20100706113401_logs.zip
>11111113_usw._logs.zip
>11111113
>11111113_20120706113401_logs.zip
>11111113_20120806113401_logs.zip
>11111113_20110706113401_logs.zip
>11111113_20100706113401_logs.zip
>11111113_usw._logs.zip
Ich möchte im Moment dass jeden Tag die Dateien !!!keine Ordner!!!, die älter sind als 2 Monate, gelöscht werden.
Im Moment habe ich folgendes:
Wie die schnellen von euch schon gesehen haben, haben die Dateien ein Datum-Feld, welches rückwärts formatiert ist.
Ich möchte gerne die Daten, die auf den Dateien zu erkennen sind auswerten und nicht den Windows Timestamp, da dieser nicht korrekt läuft und die Zeit von Programm, der den Timestamp auf den Dateien versteht, richtig ist.
Bis zum findstr Befehl erhalte ich dann sowas:
06.07.2012 11:21 8.189 11111111_20120706113401_logs.zip
10.07.2012 10:15 6.974 11111111_20110804225407_logs.zip
19.07.2012 08:15 11.424 11111111_20100813210233_logs.zip
19.07.2012 08:26 1.233 11111111_20120213210358_logs.zip
usw.
Die eigentliche Datei fängt dann immer ab Spalte 37 an.
Das Datum ab Spalte 46 und Hört bei Spalte 60 auf.
Ich möchte also dann diese Datei rausisolieren und habe mir folgendes gedacht.
Ich rechne das aktuelle Datum so um, dass es mit dem Format der Log Datei übereinstimmt.
Dann nehme ich eine Datei aus der "only_files" Liste und lasse das aktuelle Datum minus das Datum + 2 Monate aus der Liste berechnen und wenn das aktuelle Datum vom numerischen Wert höher ist, soll anschließend die Datei im Ordner gelöscht werden.
Aber wie mache ich das?
Wie kann ich das so übersetzen (mit Batch mitteln ohne VBS und Powerscripten - da ältere Server)?
Für jede Hilfe bin ich dankbar!
Andere Wege im Batch Bereich sind mir auch gerne Willkommen, da ich von sowas keine Ahnung habe.
ich brauche mal wieder von der Gemeinde ein paar Tipps, weil ich bei dem Script nicht weiter komme.
Es geht um eine Angelegenheit, die mich schon ein paar Tage beschäftigt und wo ich dringend Hilfe von ein paar schlauen Köpfen benötige.
Ich besitze ein paar Server, die regelmäßig lokal logs schreiben in einen festen Ordern.
Hier kurz aufgemalt wie ich das meine.
Beispiel:
>C:
>Logs <- Hauptordner
>11111111 <- ein Unterordner
>11111111_20120706113401_logs.zip
>11111111_20120806113401_logs.zip
>11111111_20110706113401_logs.zip
>11111111_20100706113401_logs.zip
>11111111_usw._logs.zip
>11111112
>11111113_20120706113401_logs.zip
>11111113_20120806113401_logs.zip
>11111113_20110706113401_logs.zip
>11111113_20100706113401_logs.zip
>11111113_usw._logs.zip
>11111113
>11111113_20120706113401_logs.zip
>11111113_20120806113401_logs.zip
>11111113_20110706113401_logs.zip
>11111113_20100706113401_logs.zip
>11111113_usw._logs.zip
Ich möchte im Moment dass jeden Tag die Dateien !!!keine Ordner!!!, die älter sind als 2 Monate, gelöscht werden.
Im Moment habe ich folgendes:
C:
cd "c:\logs"
if exist temp.txt del temp.txt else echo "Keine Temp Datei zu löschen!"
date /t >> "C:\logs\temp.txt"
dir "C:\logs\" /s /t >> "C:\logs\temp.txt"
if exist only_files.txt del only_files.txt else echo "Keine Temp Datei zu löschen!"
findstr /E _logs.zip "temp.txt" >> "C:\logs\only_files.txt"
(Zeug was noch nicht fertig ist)
current_date=%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%%time:~6,2%
(Bedingung / Schleife müsste hier wohl hin, welche automatisch in current_file pro Zeile die Datei auswertet)
current_file=1_zeile/datei_aufgefuehrt_in_der_temp_datei_welche_nur_die_Datei_zeigt (wie schaffe ich es hier, dass für die Rechnung nur das Datum der jeweiligen Datei genutzt wird, aber später dann auch die richtige Datei gelöscht wird)
rem 00000200000000 sind 2 Monate (Wenn Monat Februar oder Januar ist, müsste noch die Bedingung rein, dass nicht minus 00000200000000 gerechnet werden muss, sondern 00009000000000 bei Januar und Februar. (wenn ich das richtig berechnet habe^^)
if current_file < /current_date /a - 00000200000000) del current_file
Wie die schnellen von euch schon gesehen haben, haben die Dateien ein Datum-Feld, welches rückwärts formatiert ist.
Ich möchte gerne die Daten, die auf den Dateien zu erkennen sind auswerten und nicht den Windows Timestamp, da dieser nicht korrekt läuft und die Zeit von Programm, der den Timestamp auf den Dateien versteht, richtig ist.
Bis zum findstr Befehl erhalte ich dann sowas:
06.07.2012 11:21 8.189 11111111_20120706113401_logs.zip
10.07.2012 10:15 6.974 11111111_20110804225407_logs.zip
19.07.2012 08:15 11.424 11111111_20100813210233_logs.zip
19.07.2012 08:26 1.233 11111111_20120213210358_logs.zip
usw.
Die eigentliche Datei fängt dann immer ab Spalte 37 an.
Das Datum ab Spalte 46 und Hört bei Spalte 60 auf.
Ich möchte also dann diese Datei rausisolieren und habe mir folgendes gedacht.
Ich rechne das aktuelle Datum so um, dass es mit dem Format der Log Datei übereinstimmt.
Dann nehme ich eine Datei aus der "only_files" Liste und lasse das aktuelle Datum minus das Datum + 2 Monate aus der Liste berechnen und wenn das aktuelle Datum vom numerischen Wert höher ist, soll anschließend die Datei im Ordner gelöscht werden.
Aber wie mache ich das?
Wie kann ich das so übersetzen (mit Batch mitteln ohne VBS und Powerscripten - da ältere Server)?
Für jede Hilfe bin ich dankbar!
Andere Wege im Batch Bereich sind mir auch gerne Willkommen, da ich von sowas keine Ahnung habe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 192032
Url: https://administrator.de/contentid/192032
Ausgedruckt am: 22.11.2024 um 20:11 Uhr
15 Kommentare
Neuester Kommentar
Hallo darkangel2k3!
Auch von mir etwas zum Testen:
Durch das "
Die Ungenauigkeit beim Vergleich (es wird, so wie im Ansatz von PH, einfach die Monatszahl um den in Zeile 3 angegebenen Wert - im Beispiel 2 - verringert) wird hoffentlich zu verschmerzen sein - ansonsten einfach die Berechnung des Timestamps (%TS%) anpassen ...
Grüße
bastla
P.S.: Welche älteren Server-BS, auf denen VBS nicht verwendet werden könnte, sind denn bei Euch im Einsatz?
Auch von mir etwas zum Testen:
@echo off & setlocal
set "Basis=C:\Logs"
set /a MonateAlt=2
for /f "tokens=1-3 delims=." %%i in ("%date%") do set /a Jahr=%%k & set /a Monat=1%%j & set /a Tag=1%%i
set /a TSJahr=Jahr
set /a TSMonat=Monat - MonateAlt
if %TSMonat% leq 100 (set /a TSJahr-=1 & set /a TSMonat+=12)
set "TS=%TSJahr%%TSMonat:~-2%%Tag:~-2%"
for /f "delims=" %%i in ('dir /s/b/a-d "%Basis%\*.zip"') do for /f "tokens=2 delims=_" %%a in ("%%~ni") do if "%%a" lss "%TS%" echo del "%%i"
echo
" in der letzten Zeile werden die Löschbefehle nur angezeigt, aber nicht ausgeführt.Die Ungenauigkeit beim Vergleich (es wird, so wie im Ansatz von PH, einfach die Monatszahl um den in Zeile 3 angegebenen Wert - im Beispiel 2 - verringert) wird hoffentlich zu verschmerzen sein - ansonsten einfach die Berechnung des Timestamps (%TS%) anpassen ...
Grüße
bastla
P.S.: Welche älteren Server-BS, auf denen VBS nicht verwendet werden könnte, sind denn bei Euch im Einsatz?
Moin
Wieso eigentlich immer das Rad neu erfinden ? Ich nehme für solche Aufgaben einfach delage
Gruß
Hubert
Wieso eigentlich immer das Rad neu erfinden ? Ich nehme für solche Aufgaben einfach delage
Gruß
Hubert
Hallo darkangel2k3!
Mit Deinen Testdaten erhalte ich mit meinem Batch-Ansatz von oben folgende Löschbefehle als Ergebnis:
- sieht doch eigentlich vernünftig aus ...
Nur ganz kurz zu Zeile 11 (den davor ermittelten Vergleichs-Timestamp %TS% kannst Du ja zur Kontrolle ausgeben lassen):
liefert alle unterhalb von "%Basis%" liegenden *.zip-Dateien mit voller Pfadangabe in "%%i"
zerlegt nur den Dateinamen ("%%ni") anhand des "_" und stellt den zweiten entstehenden Teil - also etwa "20110708113401" - in "%%a" zur Verfügung
Durch den Text-Vergleich (wegen der Anführungszeichen; es wird nicht die Zahl, sondern Zeichen für Zeichen von links nach rechts verglichen) kann dieser Timestamp in "%%a" mit zB "20120730" in "%TS%" verglichen werden, und wenn er kleiner ist, wird gelöscht (zumindest, wenn dann das "
Grüße
bastla
Mit Deinen Testdaten erhalte ich mit meinem Batch-Ansatz von oben folgende Löschbefehle als Ergebnis:
del "C:\Logs\11111111\11111111_20100707153401_logs.zip"
del "C:\Logs\11111111\11111111_20110708113401_logs.zip"
del "C:\Logs\11111111\11111111_20120705073601_logs.zip"
del "C:\Logs\11111112\11111112_20101106182601_logs.zip"
del "C:\Logs\11111112\11111112_20110106100101_logs.zip"
del "C:\Logs\11111112\11111112_20120406052901_logs.zip"
del "C:\Logs\11111113\11111113_20100409193401_logs.zip"
del "C:\Logs\11111113\11111113_20110308173401_logs.zip"
del "C:\Logs\11111113\11111113_20120106133401_logs.zip"
del "C:\Logs\11111113\11111113_20120207153401_logs.zip"
Nur ganz kurz zu Zeile 11 (den davor ermittelten Vergleichs-Timestamp %TS% kannst Du ja zur Kontrolle ausgeben lassen):
for /f "delims=" %%i in ('dir /s/b/a-d "%Basis%\*.zip"') do
for /f "tokens=2 delims=_" %%a in ("%%~ni") do
if "%%a" lss "%TS%" echo del "%%i"
echo
" entfernt ist ...Grüße
bastla
Hallo darkangel2k3!
Grüße
bastla
Es gibt wohl ein Problemchen mit dem Script, wenn die Ordner "bla bla bla bla und 14955821" gekennzeichnet sind.
Leerzeichen sollten eigentlich keine Schwierigkeiten machen, da ja "%%i" ohne Trennung ("delims=
") erstellt und danach unter Anführungszeichen verwendet wird und in der zweiten "for
"-Schleife nur "_" (und nicht das defaultmäßige Leerzeichen) als Delimiter gilt ...Bei Zeile 8 bei dir umgehst du dann das Problem, wenn der Monat auf Null oder negativ sinkt - sehe ich das so richtig?
Yep - die zwischenzeitliche Speicherung des Monats als zB 109 anstatt 9 ermöglicht das Beibehalten der führenden Null (und umgeht das Problem, dass Zahlen, die mit 0 beginnen, bei Berechnungen in CMD als Oktalzahlen interpretiert werden - was natürlich bei 08 und 09 zu Fehlern führen würde) - deswegen der Vergleich mit dem Wert 100.Wenn der Pfad C:\logs geändert werden soll, reicht es ja nur wenn ich Zeile 2 von deinem Script ändere, oder?
Ja - mache ich meist so, da einfach übersichtlicher (und für "*.zip" würde sich auch noch eine Variable anbieten).Grüße
bastla