bwacombine
Goto Top

Script oder Tool zum Löschen von Dateien die mehr als X Tage im Ordner existieren

Hallo zusammen,

ich bin auf der Suche nach einem Tool/Script zum Löschen von Dateien, die mehr als X Tage in einem Ordner existieren auf Windows Ebene.
Es geht hier nicht um das Erstelldatum/Änderungsdatum, sondern darum, wie lange diese Datei in einem Ordner ist.

ZB:
Daten sollen nach 30 Tagen gelöscht werden.
Ich kopiere eine Datei von 1990 in einen Ordner.
Diese Datei soll dann erst nach 30 Tagen wieder gelöscht werden.

Hat jemand eine Idee, wie man dies umsetzen kann? Das Tool darf auch gerne etwas kosten.

Mfg

Content-ID: 324321

Url: https://administrator.de/forum/script-oder-tool-zum-loeschen-von-dateien-die-mehr-als-x-tage-im-ordner-existieren-324321.html

Ausgedruckt am: 20.12.2024 um 14:12 Uhr

131381
131381 20.12.2016 aktualisiert um 11:12:18 Uhr
Goto Top
Moin,
sowas lässt sich auf einem Windows Server mit Bordmitteln und den Fileserver Resource Properties realisieren:
Deploy Implementing Retention of Information on File Servers (Demonstration Steps)

Gruß
BWAcombine
BWAcombine 20.12.2016 um 11:26:13 Uhr
Goto Top
Hey, vielen Dank für den Tipp.
Meinst Du es ist auch ohne AD möglich?
131381
131381 20.12.2016 um 11:28:32 Uhr
Goto Top
Zitat von @BWAcombine:

Hey, vielen Dank für den Tipp.
Meinst Du es ist auch ohne AD möglich?
Dann musst du den Ordner mit einem Skript überwachen (z.B. Filesystemwatcher) und die Eingangsdaten z.B. in einer Datei auzeichnen und regelmäßig die Dateien löschen.

Gruß
131381
Lösung 131381 20.12.2016 aktualisiert um 11:40:44 Uhr
Goto Top
colinardo
Lösung colinardo 20.12.2016, aktualisiert am 12.01.2023 um 15:10:19 Uhr
Goto Top
Servus BWAcombine,
ala Alternative zum FSRM lässt sich das auch mit einem Skript abfackeln das du einmal am Tag z.B. über den Taskplaner ausführst:
Variablen siehe Skriptkopf. Das Skript erstellt eine CSV-Datei als Datenbank in der die Datumswerte mit dem Dateinamen gespeichert werden. Beim ersten Aufruf des Skripts werden alle Dateien im Ordner inkl. Unterordner in das Datenbankfile hinzugefügt. Beim erneuten Aufruf werden evt. nicht mehr vorhandene Dateien aus dem Datenbankfile gelöscht und neu hinzugekommene hinzugefügt. Dann werden die Datenbankeinträge durchlaufen und gegen das aktuelle Datum geprüft und bei Überschreiten der max. Anzahl Tage gelöscht.
#----VARIABLEN --------------------------
$folder = 'D:\MeinOrdner'  
$filter = '*.*'  
$MaxDays = 30
$databasepath = "$(Split-Path $MyInvocation.MyCommand.Definition -Parent)\database.csv"  
#----------------------------------------
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    

$global:database = @()

function Update-DatabaseFile {
    $global:database | export-csv $databasepath -Delimiter ";" -Encoding UTF8 -NoType  
}

function Read-Database {
    if(Test-Path $databasepath){
        # Datenbank einlesen und nicht mehr existente Dateien aus der Datenbank entfernen
        $global:database += Import-CSV $databasepath -Delimiter ";" | ?{Test-Path $_.Fullname}  
        # hinzugekommene Dateien während das Skript nicht ausgeführt wurde hinzufügen
        $files = Get-ChildItem $folder -Filter $filter -Recurse -File
        if ($files){
            $additional = compare $global:database $files -Property FullName -PassThru -EA Ignore | ?{$_.SideIndicator -eq '=>'} | select Fullname,@{n="DateAdded";e={(get-date).Date}}  
            if ($additional){
                write-host "Füge Dateien zur Datenbank hinzu:" -ForegroundColor Green  
                $additional
            }
            $global:database += $additional
            # nicht mehr vorhandene Dateien aus der DB entfernen
            $global:database = $global:database | ? Fullname -in $files.Fullname
        }    
    }else{
        # Datenbank existiert noch nicht, also Lese Verzeichnis mit den Dateien und dem aktuellen Datum ein
        $global:database = gci $folder -Filter $filter -Recurse -File | select Fullname,@{n="DateAdded";e={(get-date).Date}}  
    }
}

# Dateien älter als x Tage ermitteln und löschen
function Remove-OldFiles {
    $global:database | ?{(get-date $_.DateAdded) -lt (get-date).Date.AddDays(-$MaxDays)} | %{
        write-host "Entferne '$($_.Fullname)' da älter als $MaxDays Tag(e)."-ForegroundColor Yellow  
        remove-item -Path $_.Fullname -Force -EA SilentlyContinue
    }
}

Read-Database
Remove-OldFiles
Update-DatabaseFile
Viel Spaß
Grüße Uwe
BWAcombine
BWAcombine 22.12.2016 aktualisiert um 09:04:27 Uhr
Goto Top
Moin,

vielen Dank in dem Thread, den Mirkotik nennt, war die Lösung mit dem FSRM von colinardo, scheint gut zu klappen.

http://www.roetgen.net/files/administrator.de/fsrm_remove_files_oder_th ...
joehuaba
joehuaba 16.06.2017 um 07:47:14 Uhr
Goto Top
Bluemerson
Bluemerson 07.02.2020 aktualisiert um 08:08:19 Uhr
Goto Top
Hi, hoffe der Thread hier ist noch offen ...

Ich habe ein ähnliches Script (siehe Mitglied: colinardo) im Einsatz und suche nun noch nach der Lösung, ggf. gewisse Dateien bzw. ganze Ordner auf dem Laufwerk vom Löschen auszuschließen.

Könntest du mir da behilflich sein?

Schöne Grüße
colinardo
colinardo 07.02.2020 aktualisiert um 08:50:33 Uhr
Goto Top
Servus.
Zitat von @Bluemerson:

Hi, hoffe der Thread hier ist noch offen ...
Naja, sieht man ja am Gelöst-Kennzeichen das der schon in den Jagdgründen schlummert face-wink.
Ich habe ein ähnliches Script (siehe Mitglied: colinardo) im Einsatz und suche nun noch nach der Lösung, ggf. gewisse Dateien bzw. ganze Ordner auf dem Laufwerk vom Löschen auszuschließen.

Könntest du mir da behilflich sein?

Kein Problem dafür kannst du Zeile 20 mit dem Parameter -Exclude ergänzen
$files = gci $folder -Filter $filter -Recurse -File -Exclude "whatever"  
Es können dabei auch mehrere Strings in einem Array verwendet werden.

Darfst du hier nachlesen
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Gruß @colinardo
Bluemerson
Bluemerson 07.02.2020 um 09:42:46 Uhr
Goto Top
Hi colinardo,

vielen Dank für deine schnelle Antwort ...
Diese Zeile inkl. Aufbau habe ich in der Form nicht ...

Anbei mein Script:

' *
' * Programm: LoescheAlteDateien.vbs *
' * Funktion: löscht nicht gewollte Verzeichnisse auf Laufwerk U: *
' *

Option Explicit

Dim oFSO, oDatei, oFolder, oFileCol, oProt ' Objekte
Dim cVZ(), cMsg(), cPrefix(0), cListe1(), cTmp, cDir, cAusnahme, cProt ' Strings
Dim iPointer, iLoop, iLoop1, iMsg, iTage ' Integers
Dim dDatum ' Datum

iMsg = 1
Redim cMsg(1)
cMsg(0) = "'"
cMsg(1) = "Routine gestartet am " + cstr(date) + " um " + cstr(time) + " Uhr"

Set oFSO = CreateObject("Scripting.FileSystemObject")

'*
' Hier Einstellungen anpassen
'
*
cPrefix(0) = "U:\" ' Pfad zum Arbeitsverzeichnis
Const ResCloud = "\\..." ' UNC Pfad zum Arbeitsverzeichnis
Const bDontKeepMappings = False
'Const NetUseUser = ""
'Const NetUseUserPw = ""

cProt = "D:\.log" ' Protokoll-Datei
iTage = 7 ' Vorhalte-Zeitraum der Dateien in Tagen
'*
Dim oNetwork : Set oNetwork = WScript.CreateObject("WScript.Network")
oNetwork.MapNetworkDrive "U:", ResCloud, bDontKeepMappings

'
*
' Verzeichnisse einlesen
'*
Call LeseVZ(cListe1, cPrefix(0)) ' Arbeitsverzeichnis


'
*
' alte Dateien löschen (älter als iTage)
'*
dDatum = DateAdd("d", iTage * -1, now)
Call LeseVZ(cListe1, cPrefix(0))
For iLoop = 0 To ubound(cListe1)
Set oFolder = oFSO.GetFolder(cPrefix(0) + cListe1(iLoop))
Set oFileCol = oFolder.Files
For Each oDatei In oFileCol
If oDatei.DateLastModified < dDatum And right(oDatei.Name, 13) <> "NichtLoeschen" Then
iMsg = iMsg + 1
Redim preserve cMsg(iMsg)
cMsg(iMsg) = "Datei gelöscht: " + cListe1(iLoop) + "\" + oDatei.Name + " (" + cstr(oDatei.Size) + " Bytes)"
Call oDatei.Delete(True)
End If
Next
Next

'
*
' Protokoll beenden und speichern
'*
oNetwork.RemoveNetworkDrive "U:"

iMsg = iMsg + 1
Redim preserve cMsg(iMsg)
cMsg(iMsg) = "Routine beendet am " + cstr(date) + " um " + cstr(time) + " Uhr"
Set oProt = oFSO.OpenTextFile(cProt, 8, True)
For iLoop = 0 To ubound(cMsg)
oProt.WriteLine(cMsg(iLoop))
Next
oProt.Close

WScript.Quit

'

'* Unter-Routinen *
'

'

' GetSubFolders: rekursives Einlesen der Verzeichnisse -> wird von LeseVZ aufgerufen
'

Sub GetSubFolders
dim oVZ, oFolderCol, oFolder, iTmp

iTmp = iPointer
set oVZ = oFSO.GetFolder(cVZ(iPointer))
set oFolderCol = oVZ.SubFolders
for each oFolder in oFolderCol
iPointer = iPointer + 1
redim preserve cVZ(iPointer)
cVZ(iPointer) = cVZ(iTmp) + "\" + ucase(oFolder.Name)
call GetSubFolders
next
End Sub

'

' LeseVZ: liest Verzeichnisse rekursiv ein und entfernt Arbeits- bzw. Vorgabepfad
'
**
Sub LeseVZ(cListe(), cPrefix)
iPointer = 0
Redim preserve cVZ(iPointer)
cVZ(iPointer) = cPrefix
Call GetSubFolders
Redim cListe(ubound(cVZ))
For iLoop1 = 0 To ubound(cVZ)
cListe(iLoop1) = mid(cVZ(iLoop1), len(cPrefix) + 1)
Next
End Sub


Könntest du mir hier ggf. den String passend einfügen, welcher gesamte Ordner ausschließen würde?

Vielen, vielen Dank vorab für deine Hilfe.

Schöne Grüße
colinardo
colinardo 07.02.2020 aktualisiert um 10:30:09 Uhr
Goto Top
Du bist definitiv im falschen Thread, das Skript oben ist Powershell kein VBA!!
Bluemerson
Bluemerson 07.02.2020 um 10:42:39 Uhr
Goto Top
Und könntest du mir auch bzgl. VBA behilflich sein oder muss ich mir hierzu den entspr. Thread suchen bzw. öffnen?

Vielen Dank vorab.