blablup
Goto Top

Dateien löschen, wenn bestimmte Datei älter als x Tage ist

Wenn eine Hauptdatei (xyz_001.log) älter als 30 Tage ist sollen alle Dateien gelöscht werden die mit xyz_001 anfangen, auch wenn sie andere Dateiendungen haben (zum Beispiel: xyz_001-1.zip, xyz_001-bsp.log usw)

Hallo,


Ich habe das Problem das ich ein Reihe von Dateien habe die ich löschen will sobald die Hauptdatei älter als 30 Tage ist.

Hier das Beispiel zur Veranschaulichung:

Verzeichnis test

- xyz_001.zip 01.06.2006
- xyz_001.z01 01.06.2006
- xyz_001.z02 01.06.2006
- xyz_001-001.zip 10.06.2006
- xyz_001-001.z01 10.06.2006
- xyz_001.log 10.06.2006

- xyz_002.zip 01.07.2006
- xyz_002.z01 01.07.2006
- xyz_002.z02 01.07.2006
- xyz_002-001.zip 10.07.2006
- xyz_002-001.z01 10.07.2006
- xyz_002.log 10.07.2006

In diesem Beispiel sollen die Dateien xyz_001.zip und xyz_002.zip überprüft werden ob sie älter als 30 tage sind. xyz_001.zip ist älter als 30 Tage, darum sollen alle Dateien die mit xyz_001* anfangen gelöscht werden. Auch die Dateien vom 10.06, da ich mit diesen Dateien ohne die Hauptdatei nichts anfangen kann. Die Dateien haben alle (abgesehen von der Hauptdatei) unterschiedliche Datei Endungen.


Ich kenne das tool "delage", es bringt mich aber in diesem Fall auch nicht weiter. Ich habe schon gegoogelt und auch in diesem Forum gesucht, aber nichts gefunden was mich wirklich weiter bringt.

Vielen Dank im Voraus
BlaBlup

Content-ID: 35724

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

Ausgedruckt am: 23.11.2024 um 08:11 Uhr

Metzger-MCP
Metzger-MCP 10.07.2006 um 15:51:21 Uhr
Goto Top
Warum so Kompliziert.

Sortiere doch einfach in einem Explorer Fenster die Datein nach Datum. Makiere die erste bis letzte löschbare Datei -> Fertig. das jeden Tag.

So wie ich das erkenne, kannst du noch niemals am Dateianfang oder Ende etwas festmachen. Welche Datein gelöscht werden können, ausser Datum.

Schaue mal nach einer Batchdatei !

Mfg Metzger
BlaBlup
BlaBlup 10.07.2006 um 16:47:07 Uhr
Goto Top
Weil es zu aufwändig wäre es jeden Tag zu machen.

Ich kann es schon am Dateinamen Festmachen, da für die Hauptdatei (die die überprüft werden soll) schon über ein suchmuster zu Filtern ist. "xyz_*.zip" Damit bekomme ich alle Dateien die nach Datum überprüft werden müssen. Ich hbe auch eine vbs Script welches alle Dateien auf die diese Suchmuster zutrift löscht, aber ich kenne mich in vbs nicht gut genug aus um da Strings auseinander zu nehmen. Außerdem bin ich für jeden anderen vorschlag (zb. Batch-Datei) offen.

Aber hier mal soweit wie ich es mit vbs und dem Internet hinbekommen habe:

DIM fs,mFolder,f,fc,f1,checkpath,olderthan

'in diesem Ordner wird nach alten Files gesucht
checkpath = "C:\temp\"
'soviele Tage alt dürfen die Files sein
olderthan = 30


set FS = CreateObject("scripting.filesystemobject")
Set f = fs.GetFolder(checkpath)
Set fc = f.Files

For Each f1 in fc
if InStr(2, f1.name, "xyz_") >0 Then 'jede Datei in der xyz_ vorkommt
if InStr(2, f1.name, ".zip") >0 Then 'jede Datei die die endung .zip hat
filedate = cdate(left(f1.datelastmodified,10))

if filedate <= (date - olderthan) then
fs.DeleteFile f1
end if
end if
end if
Next


Ich weiß es ist keine sauber Programmiertes Tool, aber ich habe noch nie mit vbs gearbeitet, und mir viel keine Lösung über Batchdateien ein.
Biber
Biber 10.07.2006 um 20:44:39 Uhr
Goto Top
Moin BlaBlub,

Auf meinem Rechner würde ich es wahrscheinlich mit einem Oneliner vom CMD-Prompt aus machen...
>for %i in (*.log) do @for /f "tokens=1-3,5-7 delims=. " %a in ("%~ti %date%") do @ECHO set /a "datediff= %f*365 + %e*30 + %d - %c*365 - %b*30 -%a" && if !datediff! GEQ 30 del /Y "%~dpn*.*">nul  
...der würde als Bätch und auf ein paar Zeilen gestreckt so aussehen
@echo Off & setlocal EnableDelayedExpansion
PushD "x:\mein\LogVerzeichzeichnis"  
for %%i in (*.log) do (
      for /f "tokens=1-3,5-7 delims=. " %%a in ("%%~ti %date%") do (  
                ECHO set /a "datediff= %%f*365 + %%e*30 + %%d - %%c*365 - %%b*30 -%%a" && if !datediff! GEQ 30 del /Y "%%~dpn*.*">nul   
))
PopD

...aber ich gebe zu, erst der Output hilft, den Source nachzuvollziehen.
Output vom CMD-Oneliner oben:
set /a "datediff= 2006*365 + 07*30 + 10 - 2006*365 - 01*30 -12"  
set /a "datediff= 2006*365 + 07*30 + 10 - 2006*365 - 07*30 -06"  
set /a "datediff= 2006*365 + 07*30 + 10 - 2006*365 - 07*30 -03"  
set /a "datediff= 2006*365 + 07*30 + 10 - 2006*365 - 07*30 -05"  
set /a "datediff= 2006*365 + 07*30 + 10 - 2004*365 - 03*30 -18"  
set /a "datediff= 2006*365 + 07*30 + 10 - 2003*365 - 11*30 -10"  
das heißt, ich rechne einfach (überschlägig) die Datumswerte von Datei- und heutigen Datum [= ("%%~ti %date%") ] um in Tage und bilde die Differenz.
Wenn größer als 30 [Tage], wird Parent-Logdatei und alle Child-Logdateien gelöscht.

Nein, komm zurück, sollte ein Spaß sein... face-wink

So etwas würde ich auch keinem Kollegen anbieten...
... das funktioniert zwar, aber ist natürlich so nicht wartbar oder in meinen drei Tagen Jahresurlaubs von irgendwem anpassbar.
Solche Codeschnipsel, zumindest ohne Dokumentation, auf Produktivmaschinen wäre IMHO ein Kündigungsgrund.
Hab ich nur aus educational purposes zusammengebraten.

Wieder im Ernst:
Erste Option wäre für mich, den VBS-Schnipsel fertig zu stellen.
Da ist ja nichts mehr so buggy daran, dass Du es nicht mit zwei Tassen Tee hinbekommst.

Zweite Variante:
- native batch: entfällt. Da Batch NICHT in der Lage ist, mit Datumswerten zu rechnen/ Datumswerte zu vergleichen.
ABER: ich habe schon in einigen ähnlichen Batch-Fragen hier gepostet, wie Batch mit einem kleinen JS- oder VBS-Codefetzen mit der DateDiff()-Funktion zusammenspielen kann.
Such bitte über Forumssuche nach "yesterdate" ... da ist so ein Beispiel.
Wenn Du dieses Beispiel nachvollziehst und leicht variierst (als Parameter das FileDate der *.log-Datei rein, als Ausgabe Differenz in Tagen bis Heute), dann kannst Du es auch LESbar per Batch machen.

Machbare Variante Drei (die ich aus ästhetischen Aspekten ausschließen würde) wäre ein Einzeiler mit der M$-Nobelpreis-Nominierung "ForFiles.exe", die wie für Deinen Fall gemacht ist.
Link zu ForFiles.exe habe ich gestern gepostet.

Gruß
Biber
BlaBlup
BlaBlup 11.07.2006 um 08:27:55 Uhr
Goto Top
Ja, prinzipell funktioniert mein Tool ja auch, nur das es halt nur die Hauptdatei löäscht und nicht die anderen Dazugehörigen Dateien. Und bisher habe ich auch noch nicht die nötige Funktion gefunden die das tut was ich brauche.

Ich dachte daran es irgendwie in der art zu machen:

Die letzten 4 Zeichen von dem Dateinamen abschneiden (.zip)
Ein cmd Befehl aufrufen nach dem Muster: "del (f1.name-4Zeichen)*
.*"
Aufgelöst würde das in obigen Beispiel zum ergebniss haben: "del xyz_001*.*"
das wäre genau das was ich brauche.

Mir ist halt nur nicht klar wie ich das in vbs machen kann.
Metzger-MCP
Metzger-MCP 11.07.2006 um 09:50:15 Uhr
Goto Top
Schliesse Mich da Biber an.

Ich habe bis jetzt eine ganz wilde Batchdatei zusammen gestrickt.
Die zwa ein bissel aufgebläht ist, aber doch um so einfacher zu verstehen ist.

Leider scheitere ich aber bei dem vergleich 2er Variablen. face-sad
Aber vielleicht kann Biber mir da weiter helfen face-smile um meine Datei vertig zu stellen.

MFg Metzger
BlaBlup
BlaBlup 14.07.2006 um 08:34:16 Uhr
Goto Top
Vielen Dank für eure Hilfe.

Ich habe mein Script jetzt vervollständigt, und noch erweitert, nachdem ich mich vorgestern Abend mal mit vbs auseinander gesetzt habe!

Habe inzwischen noch die option die Logdatei hinterher per Mail zu versenden.
Naja der "Quellcode würde hier den Rahmen sprengen da er inzwischen (wegen den andern funktionen usw.) auf etwa 280 Zeilen angeschwollen ist. Aber wer Interesse hat kann sich ja bei mir melden.


mfg