darkangel2k3
Goto Top

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:

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.

Content-ID: 192032

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

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

wiesi200
wiesi200 30.09.2012 aktualisiert um 16:32:02 Uhr
Goto Top
Hallo,

Ich glaub das ist was für dich
Forfiles
darkangel2k3
darkangel2k3 30.09.2012 um 16:13:31 Uhr
Goto Top
Leider kommt nur "Seite nicht gefunden..."
wiesi200
wiesi200 30.09.2012 um 16:40:10 Uhr
Goto Top
Versuch's jetzt bitte mal. Der Link sollte jetzt passen.
darkangel2k3
darkangel2k3 30.09.2012 um 16:45:33 Uhr
Goto Top
Danke, ich kenne forfiles - aber wenn du gelesen hast, was ich geschrieben habe - möchte ich nicht den Windows Timestamp auswerten.
Wenn das hier auch Dateinamen auswerten kann und mit aktuellen Datum abgleicht lasse ich mich gerne erhellen.

Trotzdem danke!
wiesi200
wiesi200 30.09.2012 um 16:50:39 Uhr
Goto Top
Nö, das mit Timestamp hab ich überlesen.
darkangel2k3
darkangel2k3 30.09.2012 aktualisiert um 17:36:31 Uhr
Goto Top
Kein Problem, ich hoffe dass vielleicht u.a. Bieber oder bastla Zeit und Lust haben und sich vielleicht diesen Thread ansehen und haben den einen oder anderen Tipp für mich...
pieh-ejdsch
pieh-ejdsch 30.09.2012 um 17:41:29 Uhr
Goto Top
moin,

als Test in der CMD-Line:
>for /f %a in ('set /a "D=%date:~-4%%date:~-7,-5%%date:~-10,-8% - 200" ') do @for /f "tokens=1,2*delims=_" %i in ("11111113_20120706113401_logs.zip") do @set "x=%j" &cmd /von /c "if !x:~0^,8! lss %a echo del "%i_%j_%k" "

Gruß Phil
bastla
bastla 30.09.2012 aktualisiert um 18:06:37 Uhr
Goto Top
Hallo darkangel2k3!

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"  
Durch das "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? face-wink
Hubert.N
Hubert.N 30.09.2012 aktualisiert um 19:50:52 Uhr
Goto Top
Moin

Wieso eigentlich immer das Rad neu erfinden ? Ich nehme für solche Aufgaben einfach delage

Gruß

Hubert
darkangel2k3
darkangel2k3 30.09.2012 aktualisiert um 20:00:04 Uhr
Goto Top
Vielen Dank wie immer euch beiden.

Ja NT und so'n Gedöns/Garaffel und sicher ist sicher... und ich hab mal wieder keine Ahnung was ich machen soll =).

So wirklich verstehe ich das Script nicht, aber es funktioniert nicht so richtig.

Natürlich auch daran zu verschulden, dass ich mal wieder stuß aufgezeichnet habe. Der komplette Zeitstempel als Dateiname ändert sich, nicht nur das Jahr und Monat - im Moment nimmt findet ja das Script nur JAHRMO06113401!

Aber so sieht es eigentlich aus:

>C:
>Logs <- Hauptordner
>11111111 <- ein Unterordner
>11111111_20120705073601_logs.zip
>11111111_20120802123301_logs.zip
>11111111_20110708113401_logs.zip
>11111111_20100707153401_logs.zip
>11111111_usw._logs.zip

>11111112
>11111113_20120406052901_logs.zip
>11111113_20120806235501_logs.zip
>11111113_20110106100101_logs.zip
>11111113_20101106182601_logs.zip
>11111113_usw._logs.zip

>11111113
>11111113_20120106133401_logs.zip
>11111113_20120207153401_logs.zip
>11111113_20110308173401_logs.zip
>11111113_20100409193401_logs.zip
>11111113_usw._logs.zip

Die Unterordner können natürlich auch anders heißen und andere Bezeichnungen habe, aber die Zips-Log sind immer gleich aufgebaut, aber haben auch willkürlich andere Zahlen Kombinationen.

Was muss ich anpassen, damit der ganze String variable erkannt wird?

Und wenn du magst und ganz ganz ganz nett bist, vielleicht kurz die Zeit nehmen und ganz kurz erklären, wie du das realisiert hast respektive, was da was macht im Script^^
bastla
bastla 30.09.2012 aktualisiert um 19:55:35 Uhr
Goto Top
@ HubertN

Gute Idee, wenn da nicht
Ich möchte gerne die Daten, die auf den Dateien zu erkennen sind auswerten und nicht den Windows Timestamp
zu berücksichtigen wäre ... face-wink

Grüße
bastla
darkangel2k3
darkangel2k3 30.09.2012 aktualisiert um 19:57:39 Uhr
Goto Top
Danke HubertN, aber die Server können und dürfen nicht verändert werden, nur Boardmittel dürfen genutzt werden in der Firma.

ja und wie bastla schon oben erwähnt hat^^
bastla
bastla 30.09.2012 um 20:08:02 Uhr
Goto Top
Hallo darkangel2k3!

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"
- 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):
for /f "delims=" %%i in ('dir /s/b/a-d "%Basis%\*.zip"') do
liefert alle unterhalb von "%Basis%" liegenden *.zip-Dateien mit voller Pfadangabe in "%%i"
for /f "tokens=2 delims=_" %%a in ("%%~ni") do
zerlegt nur den Dateinamen ("%%ni") anhand des "_" und stellt den zweiten entstehenden Teil - also etwa "20110708113401" - in "%%a" zur Verfügung
if "%%a" lss "%TS%" echo del "%%i"
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 "echo" entfernt ist ...

Grüße
bastla
darkangel2k3
darkangel2k3 30.09.2012 aktualisiert um 20:52:54 Uhr
Goto Top
OK vielen Dank dir =)

Es gibt wohl ein Problemchen mit dem Script, wenn die Ordner "bla bla bla bla und 14955821" gekennzeichnet sind. Dann kann den Ordner irgendwie nicht richtig durchsuchen, aber das ist egal.

Die Ordner sind normalerweise immer 8-stellig numerisch, von daher kein Problem - deshalb hat es bei mir vorher nicht so funktioniert.

Bei Zeile 8 bei dir umgehst du dann das Problem, wenn der Monat auf Null oder negativ sinkt - sehe ich das so richtig?

Wenn der Pfad C:\logs geändert werden soll, reicht es ja nur wenn ich Zeile 2 von deinem Script ändere, oder?

Nochmals vielen Dank für deine Zeit und Hilfe. Ich versuche das mal alles nachzuvollziehen, damit ich das mal bei Gelegenheit auch anpassen kann. ;)

Schönen Abend wünsche ich noch.
bastla
bastla 30.09.2012 um 21:02:45 Uhr
Goto Top
Hallo darkangel2k3!
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