Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1680to1684
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Skript zum Erstellen eines Ringspeichers

Skript zum Erstellen eines Ringspeichers
14.03.2019 09:09:53
Phil
Hallo zusammen,
ich bin seit einiger Zeit auf der Suche nach einer Lösung für Speicherproblem:
Wir nehmen tagtäglich etliche Bilder auf, die auf einer externen Festplatte gespeichert werden. Wir haben aktuell eine Batch-Datei laufen, die jeden Tag über die Aufgabenplanung ausgeführt wird und alle Dateien älter als X Tage löscht.
Das Problem hierbei: Das ganze ist zu statisch. Je nach Tag werden jeweils unterschiedlich viele Bilder erzeugt (Kann zwischen einigen GB bis zu 100 GB schwanken!). Um ein Vollaufen der Festplatte zu verhindern müssen X dementsprechend klein wählen. Das führt aber dazu, dass bei wenig anfallenden Bildern die Festplatte (4,5 TB) ziemlich leer ist und wir viel Speicherplatz verschenken.
Ich würde gerne ein Skript schreiben, welches ab einer bestimmten Grenzunterschreitung der Festplattenkapazität (hier 100GB) dann solange die jeweils ältesten Dateien in einem Verzeichnis löscht, bis die Grenze wieder überschritten wird. Da ich von Programmierung keinerlei Ahnung habe, habe ich mir bisher was zusammengegoogelt und leicht modifiziert, komme aber nicht weiter. Gibt es hier eine relativ einfache Lösung?
Anbei mein bisheriger Stand:
Option explicit
Dim intGrenze, kritisch, strText
Dim fso, oDrive, strPlatz, vglGrenze
Dim oMessage
intGrenze = 100000
kritisch = "Nein"
strText = "Noch vorhandener Platz auf den Laufwerken:" & vbcrlf
strText = strText & Platzkontrolle("D:\",intGrenze) & vbcrlf
If kritisch = "Ja" Then
Main()
End if
Function Platzkontrolle(sLW,sLW_Warngrenze)
Set fso = CreateObject("Scripting.FileSystemObject")
Set oDrive = fso.getdrive(sLW)
strPlatz = oDrive.freespace
strPlatz = FormatNumber (strPlatz/1024^2,2)
vglGrenze = FormatNumber (sLW_Warngrenze,2)
If abs(vglGrenze)>abs(strPlatz) Then
kritisch = "Ja"
Platzkontrolle = "ACHTUNG: Auf " & sLW & " wurde die " & vglGrenze & " MB Grenze  _
unterschritten. Noch " & strPlatz & " MB frei"
Else
Platzkontrolle = sLW & "OK. Noch " & strPlatz & " MB frei"
End if
Set oDrive = nothing
Set fso = nothing
End Function
Sub Main()
Dim iTage
'wieviele Tage die Datei alt sein muss
iTage = 720
LoescheDateien iTage
End Sub
Private Sub LoescheDateien(ByVal Tage)
'Diese Routine löscht alle Text-Dateien die sich
'im aktuellen Programmverzeichnis befinden und älter
'als x Tage sind
'Parameter: Tage    wieviele Tage die Datei alt sein muss
Dim FSO
Dim Datei
Dim Dateien
Dim Ordner
Dim sDateiName
Dim sPfad
Dim DateiDatum
Set FSO = CreateObject("Scripting.FileSystemObject")
'zum aktuellen Datum Tage addieren
DateiDatum = DateAdd("D", -Tage, Format(Now, "dd.mm.yyyy"))
sPfad = App.Path
'Ordner festlegen
Set Ordner = FSO.GetFolder(sPfad)
Set Dateien = Ordner.Files
'Pfad ohne Backslash am Ende formatieren
If Right(sPfad, 1) = "D:\Test" Then sPfad = Left(sPfad, Len(sPfad) - 1)
'Dateien im aktuellen Programmverzeichnis durchlaufen
For Each Datei In Dateien
'Dateipfad zusammensetzen
sDateiName = sPfad + "\" + Datei.Name
'nach Text-Dateien filtern
If UCase(FSO.GetExtensionName(sDateiName)) = "PDF" Then
'Dateien älter als Tage löschen
If DateDiff("d", FileDateTime(sDateiName), Now) > Tage Then
'löschen erzwingen
FSO.DeleteFile sDateiName, True
End If
End If
Next
'Objekte zerstören
Set Ordner = Nothing
Set Dateien = Nothing
Set FSO = Nothing
End Sub

Für eure Hilfe wäre ich sehr dankbar!
Viele Grüße!

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA
14.03.2019 12:05:35
Fennek
Hallo,
im Code ist das Löschen auskommentiert und muss in einer Test-Umgebung geprüft werden:

Sub F_en()
Dim FSO As Object: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim ArL As Object: Set ArL = CreateObject("System.Collections.ArrayList")
'Set Drive = FSO.getdrive("C:")
'Debug.Print Drive.freespace / 1000000
Pfad = "c:\temp\"
Set Fld = FSO.getfolder(Pfad)
For Each fl In Fld.Files
ArL.Add Format(fl.datecreated, "YYYYMMDD") & "|" & fl.Name
Next fl
ArL.Sort
For Each it In ArL
Debug.Print it
'kill (Pfad & split(it, "|")(1))
If Drive.freespace > 1000000000 Then Exit For
Next it
Set ArL = Nothing
Set FSO = Nothing
End Sub
Die Verantwortung liegt bei dir.
mfg
Anzeige
AW: VBA
14.03.2019 12:58:06
Phil
Danke für die schnelle Antwort. Beim Ausführen folgende Fehlermeldung:
Zeile: 2
Zeichen: 9
Fehler: Anweisungsende erwartet
Code: 800A0401
Quelle: Kompilierungsfehler in Microsoft VBScript
AW: Welches System?
14.03.2019 13:20:11
Fennek
Dim FSO As Object:
123456789
Die Fehlermeldung ist unverständlich.
Bei "If Drive.Freespace" muss das 'größer' in ein 'kleiner' gewechselt werden.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige