Powershell Ordner und Dateien löschen mit Alterung und Ausnahme

dark-redeemer

Enthusiast
Thread Starter
Mitglied seit
31.03.2006
Beiträge
3.456
Ort
Bayern
Hallo zusammen,

stehe vor einem Problem bei dem ich irgendwie nicht mehr weiter komme :-(
Folgende Ausgangssituation:
In einem Pfad z.B.: D:\Test\ existieren mehrere Unterordner die wiederum auch Unterordner und Dateien enthalten können. Jetzt soll von diesem Pfad täglich per Script jede Datei und jeder Ordner gelöscht werden, der älter als 30 Tage ist. Desweiteren sollen aber Dateien und Ordner die direkt auf D:\Test\ liegen und mit "_" beginnen nicht gelöscht werden, eben nur in den Unterordnern. Ich habe folgende Probleme bei der Umsetzung: mit exclude _* kann ich zwar den Auschluss definieren, allerdings gilt das dann auch für alle Unterordner und Dateien und eben nicht nur für die Wurzel...
Und wenn das Script jetzt eine Datei in einem Ordner löscht, wird ja auch automatisch das Änderungsdatum von dem Ordner geändert. Liese sich das durch den Parameter recursiv beheben sodass der Ordnerinhalt nicht erst nach 30 Tagen wieder durchsucht wird?

Vielen Dank schon mal für eure Hilfe.

Gruß
Andreas
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Hallo Andreas,

Zur Problematik mit dem Datum:

Ich vermute du filterst die Ausgabe nach folgendem Verfahren:
Code:
Get-ChildItem | ? LastWriteTime -lt $datum | Remove-Item...
In diesem Fall wandern die entsprechenden Objekte gefiltert in die Pipeline. Das "neue" Änderungsdatum dürfte nach meinem Verständnis erst bei der nächsten Ausführung des Befehls erfasst werden.
Du solltest das Verhalten mit Hilfe des Parameters -Whatif testen können.

Der Unterstrich:

Du könntest auf folgende Art verschachteln:
Code:
Get-ChildItem -Directory | Get-ChildItem

Sprich für jedes Verzeichnis unterhalb deines Root-Verzeichnisses Get-ChildItem ausführen.

Die Schreibweise von mir bezieht sich auf die PowerShell 3.0. Bei dieser wurden u.a. die Filter (? / Where-Object) vereinfacht. Auch gibt es für Get-ChildItem den Parameter -Directory für Verzeichnisse. In PowerShell 2.0 muss hier mit dem Filter ?{ $_.PsIsContainer } gearbeitet werden.
 
Danke für die Antwort :)
hab deine Tipps befolgt und das ganze so aufgaut:

$Jetzt = Get-Date
$Alterung = "30"
$Aenderung = $Jetzt.AddDays(-$Alterung)
$Files = Get-Childitem E:\stu\public\ -Exclude _* -Force | Where {$_.LastWriteTime -le "$Aenderung"}
foreach ($File in $Files)
{
if ($File -ne $NULL)
{
write-host "Loesche $File" -ForegroundColor "DarkRed"
Remove-Item $File.FullName -Force -recurse | out-null
}
else
{
Write-Host "Nichts zu loeschen!" -foregroundcolor "Green"
}
}

Hat bei den Tests bisher problemlos funktioniert. Ich hoffe mal, dass da kein Denkfehler drinnen ist. Ziel ist wie gesagt nur Ordner und Dateien zu löschen, die älter als 30 Tage sind mit Ausnahme von Dateien die in einem Ordner auf root liegen der mit _ beginnt.
 
Das Script sollte funktionieren.
Es dürft nichts gelöscht werden, dessen Datei- oder Verzeichnisname mit einem Unterstrich beginnt.
Sollte es in einem Unterordner eine Datei mit dem Namen _* geben, dürfte diese nicht gelöscht werden, sofern nicht bereits der Ordner gelöscht wurde und dies noch eine Rolle spielt.
 
Zuletzt bearbeitet:
Läuft schon und hat noch niemand gemeckert :d
Aber er sollte doch nur auf E:\stu\public\ das _* ausschließen weil "tiefer" doch mit dem getchilditem nicht mehr interessiert oder?
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh