Powershell Old Files and Folders Deletion after x days
Hallo
Auf einem meiner Laufwerke möchte ich alte Ordner und Dateien automatisiert löschen.
Die Verzeichnisstruktur ist folgende:
Laufwerk
AbteilungA
@scan
Folder123
bild.jpg
AbteilungB
@scan
Folderabc
beispiel.pdf
AbteilungC
@scan
Folderxyz
text.txt
AbteilungA soll komplett unangetastet bleiben.
Die @scan Folder sollen erhalten bleiben, alles was sich darin befindet kann gelöscht werden.
Ordner und Dateien in den anderen Abteilungen sollen nach 28 Tagen ohne Access gelöscht werden.
Das Problem ist aber, dass wenn ich in einem Unterordner einen weiteren Ordner habe und dort eine Datei hineinkopiere, wird die Access Time nur von dem Ordner geändert, in dem die Datei selber ist.
Dann versucht das Skript aber den ganzen Ordner mit allen Unterordnern zu löschen, da es von oben nach unten geht.
Ich müsste aber von unten anfangen.
Vielleicht kann mir jemand behilflich sein
Liebe Grüße!
Auf einem meiner Laufwerke möchte ich alte Ordner und Dateien automatisiert löschen.
Die Verzeichnisstruktur ist folgende:
Laufwerk
AbteilungA
@scan
Folder123
bild.jpg
AbteilungB
@scan
Folderabc
beispiel.pdf
AbteilungC
@scan
Folderxyz
text.txt
AbteilungA soll komplett unangetastet bleiben.
Die @scan Folder sollen erhalten bleiben, alles was sich darin befindet kann gelöscht werden.
Ordner und Dateien in den anderen Abteilungen sollen nach 28 Tagen ohne Access gelöscht werden.
Das Problem ist aber, dass wenn ich in einem Unterordner einen weiteren Ordner habe und dort eine Datei hineinkopiere, wird die Access Time nur von dem Ordner geändert, in dem die Datei selber ist.
Dann versucht das Skript aber den ganzen Ordner mit allen Unterordnern zu löschen, da es von oben nach unten geht.
Ich müsste aber von unten anfangen.
Vielleicht kann mir jemand behilflich sein
$root = "C:\Users\Userxyz\Test"
$abteilunga = "*\AbteilungA\*"
$scan = "*\@scan\*"
$date = (Get-Date).AddDays(-28)
$folders = Get-ChildItem $root -recurse | ForEach-Object {Get-ChildItem $_.FullName} | Where-Object {$_.Name -notlike $abteilunga}
foreach($folder in $folders){
$folder | Where-Object {($_.LastAccessTime -lt $date) -and ($_.PSIsContainer -eq $True) -and ($_.Name -notlike $scan)} | Remove-Item
$folder| Where-Object {($_.LastAccessTime -lt $date) -and ($_.PSIsContainer -ne $True)} | Remove-Item
}
Liebe Grüße!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 332457
Url: https://administrator.de/contentid/332457
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
4 Kommentare
Neuester Kommentar
Dann versucht das Skript aber den ganzen Ordner mit allen Unterordnern zu löschen, da es von oben nach unten geht.
Ich müsste aber von unten anfangen.
Sortiere sie einfach der Länge nach sort-object ist dein Freund.Ich müsste aber von unten anfangen.
Hier gibts auch noch was fertiges Dateien Löschen als Dienst mit Filterung
$root = "C:\Users\Userxyz\Test"
$filtered = gci $folder -Recurse | ?{$_.Fullname -notlike "$folder\AbteilungA*" -and $_.LastAccessTime -lt (get-date).AddDays(-28)}
# remove old files
$filtered | ?{!$_.PSIsContainer} | remove-item -force
# remove old empty folders
$filtered | ?{$_.PSISContainer -and $_.Name -ne '@scan' -and $_.GetFiles('*',[System.IO.SearchOption]::AllDirectories).Count -eq 0} | sort {$_.Fullname.Length} -Desc | remove-item -recurse -Force
Gruß p.
Wo hast du den Müll her? Das Skript von der verlinkten Seite sieht ganz anders aus!
und das
btw. s. mein Skript im letzten Kommentar da ist alles drin was du brauchst!!
und das
$time = $_.LastAccessTime -lt (get-date).AddDays(-28)
kann ja schon mal gar nicht funktionieren wenn du das Boolean-Ergebnis in einer Pipe verwendest ...btw. s. mein Skript im letzten Kommentar da ist alles drin was du brauchst!!