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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 324321
Url: https://administrator.de/contentid/324321
Ausgedruckt am: 19.11.2024 um 19:11 Uhr
12 Kommentare
Neuester Kommentar
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ß
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ß
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ß
Gruß
Gerade gefunden:
Powershell ältere Dateien löschen
Powershell ältere Dateien löschen
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.
Viel Spaß
Grüße Uwe
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
Grüße Uwe
Servus.
Naja, sieht man ja am Gelöst-Kennzeichen das der schon in den Jagdgründen schlummert .
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
Naja, sieht man ja am Gelöst-Kennzeichen das der schon in den Jagdgründen schlummert .
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änzenKönntest du mir da behilflich sein?
$files = gci $folder -Filter $filter -Recurse -File -Exclude "whatever"
Darfst du hier nachlesen
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Gruß @colinardo
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
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