Jump to content

Powershell Skript zum Löschen von Dateien die älter sind als X Tage


Direkt zur Lösung Gelöst von BOfH_666,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

ich baue aktuell mal wieder ein Skript mit Powershell welches zum einen eine Bestimmte Gerätesammlung aus dem Active Directory ausliest.

Für jeden Computer in dieser Liste soll in bestimmten Pfaden sollen Dateien die älter sind als X Tage gelöscht werden.

Außerdem soll mit dem Skript auf einem Server in verschiedenen Pfaden ebenfalls Dateien die älter sind als X Tage gelöscht werden. 

Ich habe das ganze bisher so realisiert was auch an sich gut funktioniert:

$MDE = (Get-ADComputer -Filter "Name -like 'COMPUTER'").Name

$SourceMDE1 = "\\$PC\c$\XXX\XXX\"
$SourceMDE2 = "\\$PC\c$\XXX\XXX\"
$SourceMDE3 = "\\$PC\c$\XXX\XXX\"
$SourceFVS1 = "\\server\c$\XXX\XXX\"
$SourceFVS2 = "\\server\c$\XXX\XXX\"
$SourceFVS3 = "\\server\c$\XXX\XXX\"
$SourceFVS4 = "\\server\c$\XXX\XXX\"
$LogSourceMDE = "\\server\c$\XXX\XXX\"
$LogSourceFVS = "\\server\c$\XXX\XXX\"
$Days1 = 10
$Days2 = 30	
$ext = "*.bat","*.cat","*.txt","*.ini","*.zip","*.pdf","*.log"	
$logMDE = "$LogSourceMDE$(get-date -format yymmddHHmmss).txt"
$logFVS = "$LogSourceFVS$(get-date -format yymmddHHmmss).txt"
$DateBeforeXDays1 = (Get-Date).AddDays(-$Days1)
$DateBeforeXDays2 = (Get-Date).AddDays(-$Days2)

ForEach ($PC in $MDE)
{
   
    start-transcript $logMDE
    write-host "--------------------------------------------------------------------------------------"
    write-host "Löschen aller Dateien ($ext) im Ordner $SourceMDE1 $SourceMDE2 $SourceMDE3 die älter sind als $Days1 und $Days2 Tage."
    write-host "--------------------------------------------------------------------------------------"
    get-childitem $SourceMDE1\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    get-childitem $SourceMDE2\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    get-childitem $SourceMDE3\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    stop-transcript
}
 

start-transcript $logFVS
write-host "--------------------------------------------------------------------------------------"
write-host "Löschen aller Dateien ($ext) im Ordner $SourceFVS1 $SourceFVS2 $SourceFVS3 $SourceFVS4 die älter sind als $Days1 und $Days2 Tage."
write-host "--------------------------------------------------------------------------------------"
get-childitem $SourceFVS1\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
get-childitem $SourceFVS2\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
get-childitem $SourceFVS3\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
get-childitem $SourceFVS4\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
stop-transcript

 

 

Jetzt hab ich leider noch ein Problem, und zwar in einem der Pfade (SourceFVS2) sind Unterordner die ich auch nach dem gleichen Schema mit löschen möchte.

Steh gerade etwas auf dem Schlauch welchen Parameter ich ändern muss damit er in diesem Pfad die Unterordner mit löscht.

Ansonsten bin ich allgemein offen für Verbesserungsvorschläge :-)

 

Vielen Dank im voraus.

Gruß Niklas

Link zu diesem Kommentar
  • Beste Lösung

Wir (Powershell)-Scripter schreiben nicht so gern code doppelt und dreifach. Dafür gibt es Arrays und Schleifen. Hier mal ein Beispiel, der von Deinem Code "inspiriert" wurde. Der Muss selbstverständlich noch angepasst werden.

$ComputerNameList = (Get-ADComputer -Filter Name -like 'COMPUTER').Name

$DirectoryList = @(
    'C:\xxx\xxx1'
    'C:\xxx\xxx2'
    'C:\xxx\xxx3'
)
$10DaysBefore = (Get-Date).AddDays(-10)
$30DaysBefore = (Get-Date).AddDays(-30)

foreach ($ComputerName in $ComputerNameList) {
    if (Test-Connection -ComputerName $ComputerName -Quiet -Count 1) {
        Invoke-Command -ComputerName $ComputerName {
            foreach ($Directory in $DirectoryList) {
                Get-ChildItem -Path $DirectoryList -Include *.bat, *.cat, *.txt, *.ini, *.zip, *.pdf, *.log -Recurse -Force -File |
                    Where-Object {
                        $_.LastWriteTime -lt $10DaysBefore
                    } |
                        Remove-Item -Force
            }
        }
    }
}

Wie Du siehst, ist keine CodeZeile doppelt vorhanden. Das macht den Code deutlich leichter zu lesen, zu debuggen falls nötig und auch leichter zu erweitern, falls gewünscht.  ;-)  Wenn Du z.B. ein weiteres Verzeichnis behandeln möchtest, fügst Du einfach ein weiteres Verzeichnis dem Array $DirectoryList hinzu.

 

Fragen? Fragen!  ;-) :D 

 

Edit: Achja ... noch vergessen ... der Code dürfte auch so deutlich schneller laufen, da Du die Dateien nicht über die administrativen Freigaben löschen musst, sondern quasi lokal unterwegs bist. 

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 13 Stunden schrieb Dukel:

Nur stört das oft nicht. Wenn im Betrieb Dateien in zwei oder zehn Minuten bereinigt sind, dürfte unerheblich sein.

Schon klar - nur meinte Olaf, daß sein Code deutlich schneller laufen dürfte. Da hat er - was den reinen logischen Code betrifft - vermutlich recht, aber das fällt im Verhältnis zur Lahmheit der Dateioperationen nicht wirklich ins Gewicht :-)

Link zu diesem Kommentar

Einer muß ja auf dem Teppich bleiben - der kehrt den dann auch ab und zu :-)

Was ich schon für Klimmzüge gemacht habe, um PSDrive-Operationen zu beschleunigen... Bis hin zum Speichern aller bereits besuchten "Verzeichnisse" in einer Hashtable, damit ich da schnell nachschauen kann, ob es existiert. Weil "nachschauen im realen PSDrive" bis zu 5 Sekunden dauerte...

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...