Powershell-Skript Datei löschen älter als

Syagrius

Lt. Junior Grade
Registriert
Apr. 2015
Beiträge
365
Hallo zusammen,

leider bin ich im Skripting nicht so bewandert, habe mir aber selber schon einige Komponenten zusammen gesucht, die einzeln funktionieren. Jetzt muss es noch als ganzes funktionieren. Folgende Ausgangssituation:

Es existiert ein Ordnerpfad E:\Kunden\Kundendaten, in diesem Ordner befinden sich hunderte Unterordner benannt nach den jeweiligen Kundennamen. In diesen Kundenordnern wiederrum befinden sich weitere Unterordner. In diesen weiteren Unterordnern soll jeweils nach den Ordner Druckdaten gesucht werden. Alle darin befindlichen Daten, deren Write-Datum älter als 5 Jahre sind, sollen gelöscht werden. Creation und Last-Access-Time funktionieren leider nicht aufgrund einer Fileserver-Migration im Oktober 2019.
Bis jetzt habe ich leider keine allumfassende Lösung gefunden, wie ich alle Parameter ausgehend von E:\Kunden\Kundendaten in ein Skript bekomme.

Mit Powershell hab ich bisher folgendes zusammengesammelt. Remove-item oder ähnliches habe ich bisher noch weggelassen:
(Alternativen wie Delage oder Robocopy scheitern leider am Filtern nach dem Unterordner)

Hier ist das Problem, dass auch auf die Files der Filter Druckdaten angewandt wird. Wenn ich den Parameter -directory setze, sucht er natürlich gar nicht mehr nach Files.
$Daysback = "-1825"
$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
Get-ChildItem -path E:\Kunden\Kundendaten -Include 'Druckdaten' -Recurse -force | Where-Object { $_.LastWriteTime -lt $DatetoDelete }

Dreh ich das ganze um und suche erst nach den Files, weiß ich leider nicht, wie ich noch nach dem Unterordner filtern kann:
$Daysback = "-1825"
$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
Get-ChildItem -path E:\AllAboutCards\Kunden\Kundendaten -file -Recurse -force | Where-Object { $_.LastWriteTime -lt $DatetoDelete }

Vielleicht hat jemand eine Lösung für mein Dilemma.

Danke und viele Grüße

Syagrius
 
Hi,
du willst alle dateien in "Druckdaten" unterordnern, die älter als x tage sind, finden?

deine bedingung ist also: älter als x tage UND in unterordner "Druckdaten"

Get-ChildItem -path E:\AllAboutCards\Kunden\Kundendaten -file -Recurse -force | Where-Object { $_.LastWriteTime -lt $DatetoDelete }
das ist schon mal ganz gut, fehlt in der where bedingung doch nur noch pfadname enthält "*\Druckdaten\".

quasi so:

Code:
Get-ChildItem -path E:\Kunden\Kundendaten -file -Recurse -force | Where-Object { $_.LastWriteTime -lt $DatetoDelete -and $_.fullname -match "Druckdaten"}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Syagrius
Code:
Get-ChildItem -Filter Kundendaten -Recurse -Directory -Force | # alle Ordner x
    Get-ChildItem -File -Recurse -Force | # dessen Dateien auflisten
    Where-Object { $_.LastWriteTime -lt $DatetoDelete } # alle Dateien älter als y
 
Danke für den Input. Mir fehlt es da ein wenig an den Grundlagen. Aber die Vorschläge klingen logisch. Wird getestet :-)
 
@DonnyDepp Dein Skript hat gestern wunderbar funktioniert. Jetzt ist aber noch die Anforderung dazu gekommen, auch alles im Unterordner Kundendaten älter als 5 Jahre zu löschen. Wichtig ist hier, dass es sich um einen weiteren Ordner Kundendaten weiter unten in der Struktur handelt und nicht um den ersten Ordner der so heißt. Beispiel: E:\Kunden\Kundendaten\abc\edf\Kundendaten

Wenn ich das gleiche Skript, wie oben anwende, findet er natürlich alle Daten älter als 5 Jahre. Kann ich in dem Skript irgendwie den ersten Ordner Kundendaten ausnehmen? Gestern hab ich das Quick und Dirty abends gelöst, in dem ich den ersten Ordner Kundendaten kurzerhand temporär umbenannt habe. Die Anforderung wird aber immer kommen. Habt ihr eine Lösung?
 
Einfach verodern.

E:\Kunden\Kundendaten\abc\edf\Kundendaten
Wildcard "Kundendaten" Wildcard "Kundendaten" Wildcard
Code:
Get-ChildItem -path E:\Kunden\Kundendaten -file -Recurse -force | Where-Object { $_.LastWriteTime -lt $DatetoDelete -and ($_.fullname -match "Druckdaten" -or $_.fullname -like "*Kundendaten*Kundendaten*")}

Kannste aber sicher mit regular expressions noch geschickter machen.
 
Zuletzt bearbeitet:
Zurück
Oben