Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateien Löschen als Dienst mit Filterung

Frage Microsoft Windows Tools

Mitglied: petere

petere (Level 1) - Jetzt verbinden

18.04.2014, aktualisiert 19.04.2014, 2979 Aufrufe, 8 Kommentare, 1 Danke

Hallo,

ich suche ein Tool, welches auf einem Windows-Server läuft und folgendes kann:

- Man gibt mehrere Verzeichnisse an
- Filter nach Dateiname und Dateialter
z.B. Lösche alle Dateien und leere Unterverzeichnisse, die älter als 90 Tage sind, mit *.bak enden ABER nicht die, welche am ersten jeden Monats erstellt wurden.

Habt ihr da ein Tool, was das kann?
Viele Grüße,
Peter
Mitglied: jsysde
19.04.2014 um 09:47 Uhr
Moin.

Spontan fällt mir da DelAge32 ein:
http://www.horstmuc.de/wbat32d.htm

Cheers,
jsysde
Bitte warten ..
Mitglied: petere
19.04.2014 um 10:08 Uhr
Oh das klingt toll.
Jetzt ist die frage: verzichte ich auf den Filter, dass Dateien des Monatsersten nicht gelöscht werden oder gibt's einen workaround.

Mit fällt spontan nix ein.
Bitte warten ..
Mitglied: jsysde
19.04.2014 um 10:17 Uhr
Moin.

Auch wieder spontan: Nach Datum filtern innerhalb der Batchdatei, mit der du DelAge32.exe aufrufst und dann eben DelAge32.exe mehrmals aus der Batch heraus starten mit unterschiedlichen Parametern, also einmal "Files von <aktuelles Datum> bis <aktuelles Datum -n Tage>", dann "letzter Monat exclude 01.Tag des Monats" usw. Ist sicherlich ein bisschen Gebastel und Geskripte, aber es funktioniert.

Cheers,
jsysde
Bitte warten ..
Mitglied: bastla
19.04.2014, aktualisiert um 11:38 Uhr
Hallo petere!

Ein VBScript für diesen Zweck könnte etwa so aussehen:
01.
' * hier eigenen Bedürfnissen anpassen * 
02.
Ordnerliste =    "D:\Ordnerliste.txt" 'Liste der zu bearbeitenden Ordner; 1 Ordner je Zeile 
03.
Dateitypen =     "D:\Typen.txt" 'Liste der Dateitype; 1 Typ je Zeile 
04.
Alter =          90 'Alter der zu löschenden Dateien in Tagen 
05.
ErstellungsTag = 1 'Dateien, die an diesem Tag des Monats erstellt wurden, nicht löschen 
06.
' * Ende der Anpassungen * 
07.
 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
Verzeichnis = Split(fso.OpenTextFile(Ordnerliste).ReadAll, vbCrLF) 'Ordnerliste einlesen 
11.
Include = LCase("#" & Replace(fso.OpenTextFile(Dateitypen).ReadAll, vbCrLF, "#") & "#") 'Dateitypen einlesen 
12.
 
13.
Heute = Date() 
14.
 
15.
For n = 0 To UBound(Verzeichnis) 'alle Ordner durchgehen 
16.
    Set Ordner = fso.GetFolder(Verzeichnis(n)) 
17.
    DeleteInFolder(Ordner) 'Lösch-Unterprogramm für Ordner aufrufen 
18.
Next 
19.
 
20.
Sub DeleteInFolder(Ordner) 
21.
Set Dateien = Ordner.Files 
22.
For Each Datei In Dateien 'alle Dateien in diesem Ordner durchgehen 
23.
    If Datei.DateLastModified < (Heute - Alter) Then 'Datei ist alt genug 
24.
        If InStr(Include, "#" & LCase(fso.GetExtensionName(Datei.Name)) & "#") > 0 Then 'Datei hat passenden Typ 
25.
            If Day(Datei.DateCreated) <> ErstellungsTag Then 'nicht am festgelegten Tag eines Monats erstellt 
26.
                On Error Resume Next 
27.
                'Datei.Delete 'Datei löschen 
28.
                WScript.Echo Datei.DateLastModified & "_" & Datei.Path 'zu löschende Datei nur anzeigen 
29.
                'Falls Fehler "permission denied" aufgetreten, ignorieren, ansonsten Script abbrechen 
30.
                If Err And Err <> 70 Then MsgBox "Fehler (Code=" & Err & ")", vbCritical: WScript.Quit 
31.
                On Error Goto 0 
32.
            End If 
33.
        End If 
34.
    End If 
35.
Next 
36.
 
37.
For Each Unter In Ordner.SubFolders 'alle Unterordner durchgehen 
38.
    DeleteInFolder(Unter) 'DeleteInFolder rekursiv aufrufen 
39.
    If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then 'Unterverzeichnis leer 
40.
        'If Unter.DateLastModified < (Heute - Alter) Then Unter.Delete 'löschen, wenn Ordner alt genug 
41.
        If Unter.DateLastModified < (Heute - Alter) Then WScript.Echo "#" & Unter.DateLastModified & "_" & Unter.Path 'zu löschenden Ordner nur anzeigen 
42.
    End If 
43.
Next 
44.
End Sub
Benötigt werden die in den Zeilen 2 und 3 angeführten Textdateien, um die zu bearbeitenden Verzeichnisse bzw die zu berücksichtigenden Dateitypen festzulegen - für die Dateitypen könnte die Datei zB folgenden Inhalt haben:
01.
bak 
02.
tmp 
03.
log
- damit würden dann nur "*.bak"-, "*.tmp"- und "*.log"-Dateien gelöscht. Ein Filter für Dateinamen ist derzeit noch nicht integriert, ließe sich aber bei Bedarf "nachrüsten".

Zum Testen das Script mit
cscript "D:\Scriptname.vbs"
aus einer CMD-Shell starten - es werden dann alle Dateien und Ordner (Kennzeichnung mit vorangestelltem "#") angezeigt, die gelöscht würden, mit Änderungsdatum und Pfad angezeigt. Ordner werden allerdings nur aufscheinen, wenn sie bereits vorher leer waren (da ja noch keine Dateien gelöscht werden).

Wenn das Ergebnis ok aussieht, die Zeilen 27 und 40 aktivieren (indem der Apostroph ' am Zeilenanfang entfernt wird) und vor die (dann nicht mehr benötigten) Zeilen 28 und 41 einen Apostroph setzen oder diese Zeilen einfach entfernen. Dann kann das Script auch ohne "cscript" bzw per Doppelklick gestartet werden.

Noch ein Hinweis: Bei Verzeichnissen wird nur das Alter, aber nicht der Erstellungstag, geprüft - ein leeres Verzeichnis zu behalten, weil es am 1. eines Monats erstellt wurde, dürfte nicht nötig sein, wobei sich aber natürlich auch diese Prüfung ergänzen ließe.

Grüße
bastla
Bitte warten ..
Mitglied: petere
19.04.2014 um 11:33 Uhr
Danke euch beiden, das sind echt sehr gute loesungen.
Bitte warten ..
Mitglied: bastla
19.04.2014 um 11:33 Uhr
@ jsysde
Im Fall des Falles würde ich eher "delage32" mit "/preview" aufrufen und dann jede der aufgelisteten Dateien auf den Erstellungstag prüfen - das Löschen der danach leeren Ordner bliebe so allerdings auf der Strecke ...

Grüße
bastla
Bitte warten ..
Mitglied: colinardo
LÖSUNG 19.04.2014, aktualisiert um 13:10 Uhr
Hallo Peter,
und hier noch die Powershell-Variante:
01.
function Cleanup-Folders { 
02.
    param( 
03.
        [parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string[]]$folders, 
04.
        [int]$olderthandays, 
05.
        [string]$filepattern = "*.*", 
06.
        [switch]$RemoveEmptyDirs, 
07.
        [switch]$Recurse, 
08.
        [ValidateRange(1,31)][int]$keepfileswithdayofmonth, 
09.
        [string]$logfile 
10.
11.
 
12.
    process{ 
13.
         
14.
        foreach($folder in $folders){ 
15.
            if (Test-Path $folder) { 
16.
                # process files ----------- 
17.
                if ($Recurse){ 
18.
                    $files = gci $folder -Recurse | ?{!$_.PSIsContainer} 
19.
                }else{ 
20.
                    $files = gci $folder | ?{!$_.PSIsContainer} 
21.
22.
                if ($olderthandays -gt 0){ 
23.
                    $files = $files | ?{$_.Name -like $filepattern -and $_.LastWriteTime -lt (get-date).AddDays(-$olderthandays)}  
24.
25.
                if ($keepfileswithdayofmonth -gt 0){ 
26.
                    $files = $files | ?{(get-date $_.LastWriteTime).Day -ne $keepfileswithdayofmonth} 
27.
28.
                $files = $files | ?{$_.Name -like $filepattern} 
29.
                foreach($file in $files){ 
30.
                    remove-item $file.FullName -Force -EA SilentlyContinue -EV err 
31.
                    if ($err.Count -gt 0){ 
32.
                        write-host "Beim Löschen von Ordner: '$($file.Fullname)' ist ein Fehler aufgetreten: $($err[0].ErrorDetails.Message)" -BackgroundColor Red -ForegroundColor Yellow 
33.
                        if ($logfile){echo "ACHTUNG Fehler: $($err[0].ErrorDetails.Message)" | out-file $logfile -Force -Append} 
34.
                    }else{ 
35.
                        write-host "Lösche Datei: '$($file.Fullname)'" -ForegroundColor Green 
36.
                        if($logfile){echo "$(get-date -Format "dd.MM.yyyy hh:mm:ss") - Datei gelöscht: $($file.FullName)" | out-file $logfile -Force -Append} 
37.
38.
39.
                 
40.
                # process empty folders ---- 
41.
                if($RemoveEmptyDirs){ 
42.
                    if ($Recurse){ 
43.
                        $allSubfolders = gci $folder -Recurse | ?{$_.PSIsContainer} 
44.
                    }else{ 
45.
                        $allSubfolders = gci $folder | ?{$_.PSIsContainer} 
46.
47.
                    $allSubfolders = $allSubfolders | ?{$_.GetDirectories().Count -eq 0 -and $_.GetFiles().Count -eq 0} 
48.
                    foreach($f in $allSubfolders){ 
49.
                        remove-item $f.FullName -Force -EA SilentlyContinue -EV err 
50.
                        if ($err.Count -gt 0){ 
51.
                            write-host "Beim Löschen von Ordner: '$($f.Fullname)' ist ein Fehler aufgetreten: $($err[0].ErrorDetails.Message)" -BackgroundColor Red -ForegroundColor Yellow 
52.
                            if ($logfile){echo "ACHTUNG Fehler: $($err[0].ErrorDetails.Message)" | out-file $logfile -Force -Append} 
53.
                        }else{ 
54.
                            write-host "Lösche Ordner: '$($f.Fullname)'" -ForegroundColor Green 
55.
                            if($logfile){echo "$(get-date -Format "dd.MM.yyyy hh:mm:ss") - Leerer Ordner gelöscht: $($f.FullName)" | out-file $logfile -Force -Append} 
56.
57.
                    }  
58.
                }  
59.
60.
61.
62.
}
Der Aufruf der Function erfolgt dann so:
Cleanup-Folders -folders "C:\ordner1","d:\Ordner2","E:\ordner3" -olderthandays 90 -filepattern "*.bak" -Recurse -RemoveEmptyDirs -keepfileswithdayofmonth 1 -logfile "C:\logfile.txt"
Der Parameter -folders ist dabei Pflichtangabe und es können mehrere Ordner mit Komma getrennt angegeben werden, die anderen Parameter sind Optional und können nach Bedarf kombiniert werden. Wird kein -filepattern angegeben wird von *.* ausgegangen.

Viel Spaß

Grüße Uwe
Bitte warten ..
Mitglied: petere
19.04.2014 um 13:10 Uhr
Super, herzlichen Dank
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Entwicklung
Versteckte .(Punkt)Dateien löschen (3)

Frage von DarkJM zum Thema Entwicklung ...

Batch & Shell
gelöst Powershell ältere Dateien löschen (6)

Frage von Cougar77 zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...