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, 3120 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 ..
Ähnliche Inhalte
Windows Server
gelöst Windows 2012R2 kann Datei nicht löschen (2)

Frage von Akcent zum Thema Windows Server ...

Batch & Shell
gelöst Löschen von Dateien nach bestimmten Zeitmuster (8)

Frage von NetzwerkDude zum Thema Batch & Shell ...

Windows Server
Datei nach dem löschen weiterhin vorhanden (5)

Frage von derBadner zum Thema Windows Server ...

Batch & Shell
gelöst Dateien auf der Basis einer Liste löschen (2)

Frage von symei3 zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

(2)

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Viren und Trojaner

CNC-Fräsen von MECANUMERIC werden (ggf.) mit Viren, Trojanern, Würmern ausgeliefert

(4)

Erfahrungsbericht von anteNope zum Thema Viren und Trojaner ...

Windows 10

Windows 10: Erste Anmeldung Animation deaktivieren

(3)

Anleitung von alemanne21 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Netzwerkgrundlagen
Kann auf Freigabe nicht Zugreifen (19)

Frage von leon123 zum Thema Netzwerkgrundlagen ...

Windows Server
gelöst Neues KB für W10 1607 und W2K16 wieder mal nicht im WSUS 3.0, hat das noch jemand? (16)

Frage von departure69 zum Thema Windows Server ...

Windows Server
DC virtualisieren + wie sichern (SingleDC-Environment) (12)

Frage von KMUlife zum Thema Windows Server ...

Festplatten, SSD, Raid
RAID Controller mit Trim-Funktion, wie ermitteln (11)

Frage von pixel24 zum Thema Festplatten, SSD, Raid ...