adm.mks
Goto Top

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

Content-Key: 395344

Url: https://administrator.de/contentid/395344

Ausgedruckt am: 28.03.2024 um 10:03 Uhr

Mitglied: H41mSh1C0R
H41mSh1C0R 11.12.2018 um 17:20:42 Uhr
Goto Top
Hi,

was soll das Ergebnis sein?
Soll die Datei die Namen der gelöschten Dateien und Ordner beinhalten?

VG
Mitglied: adm.mks
adm.mks 11.12.2018 um 17:24:02 Uhr
Goto Top
Zitat von @H41mSh1C0R:

Hi,
Hi
was soll das Ergebnis sein?
Soll die Datei die Namen der gelöschten Dateien und Ordner beinhalten?

Ja richtig, entschuldigt. habe das ganz vergessen zu schreiben.
Mitglied: erikro
erikro 12.12.2018 um 09:06:00 Uhr
Goto Top
Moin,

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. face-wink

Wenn Du die geschwätzige (verbose) Ausgabe in eine Datei schreiben willst, dann hänge einfach ein

>>pfad_zur_datei
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
Mitglied: 137846
Lösung 137846 12.12.2018, aktualisiert am 17.12.2018 um 16:29:14 Uhr
Goto Top
Eine weitere Variante zum Loggen bietet Start-Transcript
$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
Gruß A.
Mitglied: adm.mks
adm.mks 17.12.2018 um 15:05:49 Uhr
Goto Top
$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
Mitglied: H41mSh1C0R
H41mSh1C0R 17.12.2018 aktualisiert um 15:24:29 Uhr
Goto Top
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*
Mitglied: 137846
137846 17.12.2018 aktualisiert um 15:24:33 Uhr
Goto Top
S. fix und fertige Lösung die auch funktioniert oben.
Mitglied: adm.mks
adm.mks 17.12.2018 um 15:33:57 Uhr
Goto Top
Hi Answer, wenn ich das Skript unter Powershell starte, kommen folgende Fehlermeldungen:


In C:\Users\benutzer\Desktop\delete.ps1:9 Zeichen:36

back-to-topgci $source -Directory -recurse | ?{$_.LastWriteTime -lt $time -and ! ...

back-to-top~

Die schließende "}" fehlt im Anweisungsblock oder der Typdefinition.
In C:\Users\benutzer\Desktop\delete.ps1:9 Zeichen:102

back-to-top... stWriteTime -lt $time -and !(gci $_.Fullname -recurse -file))} | sort ...

back-to-top~

Unerwartetes Token ")" in Ausdruck oder Anweisung.
In C:\Users\benutzer\Desktop\delete.ps1:9 Zeichen:103

back-to-top... tWriteTime -lt $time -and !(gci $_.Fullname -recurse -file))} | sort ...

back-to-top~

Unerwartetes Token "}" in Ausdruck oder Anweisung.
In C:\Users\benutzer\Desktop\delete.ps1:9 Zeichen:105

back-to-top... riteTime -lt $time -and !(gci $_.Fullname -recurse -file))} | sort {$ ...

back-to-top~

Ein leeres Pipeelement ist nicht zulässig.
+ CategoryInfo : ParserError: (face-smile , ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace
Mitglied: H41mSh1C0R
Lösung H41mSh1C0R 17.12.2018 um 15:43:08 Uhr
Goto Top
Grob beim Drüberfliegen würd ich sagen da ist ein ")" zuviel. =)
Mitglied: adm.mks
adm.mks 17.12.2018 um 15:44:25 Uhr
Goto Top
$source = "c:\del"  
$time = (get-date).AddDays(-2)
# Logvorgang starten (alles was bis Stop-Transcript in der Shell ausgegeben wird wird aufgezeichnet)
Start-Transcript "c:\del\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

mit diesem Code wird nun gelöscht. Allerdings kommt noch folgende Meldung:

gci : Der Zugriff auf den Pfad "C:\WINDOWS\system32\LogFiles\WMI\RtBackup" wurde verweigert.
In C:\Users\user\Desktop\delete.ps1:9 Zeichen:70

back-to-top... LastWriteTime -lt $time -and !(gci $_.Fullname -recurse -file) sort { ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : PermissionDenied: (C:\WINDOWS\syst...es\WMI\RtBackup:String) [Get-ChildItem], UnauthorizedAccessException
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand


?$_.LastWriteTime : Die Benennung "?$_.LastWriteTime" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die
Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In C:\Users\user\Desktop\delete.ps1:9 Zeichen:35

back-to-topgci $source -Directory -recurse | ?$_.LastWriteTime -lt $time -and !( ...

back-to-top~~~~~~~~~~~~~~~~~

+ CategoryInfo : ObjectNotFound: (?$_.LastWriteTime:String) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Mitglied: erikro
erikro 17.12.2018 um 16:10:20 Uhr
Goto Top
Moin,

Zitat von @adm.mks:

$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
Mitglied: 137846
137846 17.12.2018 aktualisiert um 16:33:21 Uhr
Goto Top
Zitat von @H41mSh1C0R:

Grob beim Drüberfliegen würd ich sagen da ist ein ")" zuviel. =)
Rischtisch. Ist oben korrigiert.
Mitglied: 137846
137846 17.12.2018 aktualisiert um 16:37:13 Uhr
Goto Top
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!
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 face-confused.
Mitglied: adm.mks
adm.mks 17.12.2018 um 16:37:06 Uhr
Goto Top
Danke - Jetzt klappt es!

Super support von euch. Vielen Danke nochmals.

Gruß M
Mitglied: KMUlife
KMUlife 08.03.2019 um 14:35:30 Uhr
Goto Top
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