138122
11.12.2018
11860
15
0
Powershell - Dateien und Ordner älter als 2 Tage löschen
Servus alle zusammen,
ich möchte mit einem Script wie im Betreff erwähnt Dateien und Ordner löschen, die älter als 2 Tage sind.
Anschließend möchte ich das Ergebnis in eine Text Datei schreiben.
Folgendes Script verwende ich dazu:
$DatumVor30Tagen = (Get-Date).AddDays(-2)
$Source = "C:\temp1"
get-childitem "$Source " -recurse | where { $_.lastwritetime -lt $DatumVor2Tagen -and -not $_.psiscontainer -and $_.name} | remove-item -verbose -recurse
Mir fehlen noch die beiden Bausteine für die Ordner Löschung als auch die Ergebnis Text File.
Kann mir hier jemand helfen?
Liebe Grüße M
ich möchte mit einem Script wie im Betreff erwähnt Dateien und Ordner löschen, die älter als 2 Tage sind.
Anschließend möchte ich das Ergebnis in eine Text Datei schreiben.
Folgendes Script verwende ich dazu:
$DatumVor30Tagen = (Get-Date).AddDays(-2)
$Source = "C:\temp1"
get-childitem "$Source " -recurse | where { $_.lastwritetime -lt $DatumVor2Tagen -and -not $_.psiscontainer -and $_.name} | remove-item -verbose -recurse
Mir fehlen noch die beiden Bausteine für die Ordner Löschung als auch die Ergebnis Text File.
Kann mir hier jemand helfen?
Liebe Grüße M
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 395344
Url: https://administrator.de/contentid/395344
Ausgedruckt am: 24.11.2024 um 08:11 Uhr
15 Kommentare
Neuester Kommentar
Moin,
mache bitte die Code-Tags um Deinen Code. Das ist einfacher zu lesen. Das ist die Schaltfläche </> am linken Rand. Danke.
Dann kannst Du Dir das Wegfiltern der Ordner sparen. Merke: Hol nur das, was Du auch brauchst.
Warum filterst Du nach $_.name? Ich denke so reicht das aus:
Was soll das -recurse dahinter? Du hast jetzt nur einzelne Dateien am Wickel. Die kannst Du nicht rekursiv löschen.
Wenn Du die geschwätzige (verbose) Ausgabe in eine Datei schreiben willst, dann hänge einfach ein
hinten an den Befehl dran. Das leitet die Ausgabe auf die Datei um und hängt sie hinten dran.
Welche Ordner willst Du denn nun löschen? Alle, die älter sind als zwei Tage? Das halte ich für gefährlich. Alle, die nach der Löschaktion der Dateien leer sind?
hth
Erik
mache bitte die Code-Tags um Deinen Code. Das ist einfacher zu lesen. Das ist die Schaltfläche </> am linken Rand. Danke.
get-childitem "$Source " -recurse -file
Dann kannst Du Dir das Wegfiltern der Ordner sparen. Merke: Hol nur das, was Du auch brauchst.
| where { $_.lastwritetime -lt $DatumVor2Tagen -and -not $_.psiscontainer -and $_.name}
Warum filterst Du nach $_.name? Ich denke so reicht das aus:
| where { $_.lastwritetime -lt $DatumVor2Tagen}
| remove-item -verbose -recurse
Was soll das -recurse dahinter? Du hast jetzt nur einzelne Dateien am Wickel. Die kannst Du nicht rekursiv löschen.
Wenn Du die geschwätzige (verbose) Ausgabe in eine Datei schreiben willst, dann hänge einfach ein
>>pfad_zur_datei
Welche Ordner willst Du denn nun löschen? Alle, die älter sind als zwei Tage? Das halte ich für gefährlich. Alle, die nach der Löschaktion der Dateien leer sind?
hth
Erik
Eine weitere Variante zum Loggen bietet Start-Transcript
Gruß A.
$source = "c:\temp1"
$time = (get-date).AddDays(-2)
# Logvorgang starten (alles was bis Stop-Transcript in der Shell ausgegeben wird wird aufgezeichnet)
Start-Transcript "c:\log.txt"
# Dateien älter als x löschen
gci $source -File -recurse | ?{$_.LastWriteTime -lt $time} | del -Force -verbose
# Ordner älter als x löschen, aber nur wenn in ihm und seinen Unterordnern keine Dateien mehr sind
gci $source -Directory -recurse | ?{$_.LastWriteTime -lt $time -and !(gci $_.Fullname -recurse -file)} | sort {$_.Fullname.Length} -Desc | del -recurse -Force -verbose
Stop-Transcript
Gibt's eine Fehlermeldung?
Warum machst du 2 mal einen where Block? Einmal reicht doch.
Bekommst du denn überhaupt eine Ausgabe der gefilterten Dateien?
Kommentiere mal ab "| remove-item.... " den Rest aus.
Wenn du da keine Ausgabe bekommst wird schon nicht korrekt gefiltert.
VG
BTW:
Das was answer geschrieben hat ist schon super kompakt und funktional. Das mal ausprobiert? *g*
Warum machst du 2 mal einen where Block? Einmal reicht doch.
Bekommst du denn überhaupt eine Ausgabe der gefilterten Dateien?
Kommentiere mal ab "| remove-item.... " den Rest aus.
Wenn du da keine Ausgabe bekommst wird schon nicht korrekt gefiltert.
VG
BTW:
Das was answer geschrieben hat ist schon super kompakt und funktional. Das mal ausprobiert? *g*
S. fix und fertige Lösung die auch funktioniert oben.
Moin,
Da ist ein Filter zu viel. Und das gci fehlt:
Liebe Grüße
Erik
Zitat von @138122:
Servus erikro, so habe ich das versucht, allerdings löscht es nichts. Was mache ich falsch?
Liebe Grüße M
$DatumVor2Tagen = (Get-Date).AddDays(-2)
> $Source = "C:\del\" | where { $_.lastwritetime -lt $DatumVor2Tagen -and -not $_.psiscontainer -and $_.name} | where { $_.lastwritetime -lt $DatumVor2Tagen} | remove-item -verbose >>"C:\del\logging.txt"
Servus erikro, so habe ich das versucht, allerdings löscht es nichts. Was mache ich falsch?
Liebe Grüße M
Da ist ein Filter zu viel. Und das gci fehlt:
$Source = "C:\del\"
get-childitem $Source -recurse -file | where { $_.lastwritetime -lt $DatumVor2Tagen} | remove-item -verbose >>"C:\del\logging.txt"
Liebe Grüße
Erik
Rischtisch. Ist oben korrigiert.
Allerdings kommt noch folgende Meldung:
gci : Der Zugriff auf den Pfad "C:\WINDOWS\system32\LogFiles\WMI\RtBackup" wurde verweigert.
Logisch, ohne entsprechende Rechte (UAC beachten) darfst du dort nicht hantieren!gci : Der Zugriff auf den Pfad "C:\WINDOWS\system32\LogFiles\WMI\RtBackup" wurde verweigert.
Beim Rest hast du wieder falsch Klammern gesetzt (vergessen) und das Pipe Symbol nicht gesetzt min jung. Siehe Code oben!
Man wundert sich wie wenig selbständig hier manch einer arbeitet .
Hallo zusammen!
Ich weise vollständigkeitshalber noch auf folgenden Beitrag (Siehe Kommentar von @colinardo) hin:
Powershell - Wenn ein Ordner leer ist, diesen auch löschen hinzufügen?
Da mit dem Script von "137846 (Level 2)" die Dateien zwar gelöscht werden. Beim löschen der Files die Ordner aber ein neues Änderungsdatum kriegen und dann im Schritt zwei "Ordner löschen" dann nicht gelöscht werden.
Um dieses Problem zu beheben, einfach die Funktion von @colinardo noch anhängen um die nun leeren Ordner zu löschen. Evt. würs dafür auch ne schönere Lösung geben. Funktionieren tuts so auf jedenfall.
Grüsse
KMUlife
Ich weise vollständigkeitshalber noch auf folgenden Beitrag (Siehe Kommentar von @colinardo) hin:
Powershell - Wenn ein Ordner leer ist, diesen auch löschen hinzufügen?
Da mit dem Script von "137846 (Level 2)" die Dateien zwar gelöscht werden. Beim löschen der Files die Ordner aber ein neues Änderungsdatum kriegen und dann im Schritt zwei "Ordner löschen" dann nicht gelöscht werden.
Um dieses Problem zu beheben, einfach die Funktion von @colinardo noch anhängen um die nun leeren Ordner zu löschen. Evt. würs dafür auch ne schönere Lösung geben. Funktionieren tuts so auf jedenfall.
Grüsse
KMUlife