wake-up-neo.com

Löschen Sie Dateien, die älter als 15 Tage sind, mit PowerShell

Ich möchte nur die Dateien löschen, die vor mehr als 15 Tagen in einem bestimmten Ordner erstellt wurden. Wie könnte ich das mit PowerShell machen?

166
user2470170

Bei den angegebenen Antworten werden nur Dateien gelöscht (was zugegebenermaßen im Titel dieses Beitrags steht). Hier ist jedoch ein Code, der zuerst alle Dateien löscht, die älter als 15 Tage sind, und dann alle leeren Verzeichnisse, die möglicherweise übrig geblieben sind, rekursiv löscht hinter. Mein Code verwendet auch die Option -Force, um auch versteckte und schreibgeschützte Dateien zu löschen. Außerdem habe ich mich dafür entschieden, keine Aliase zu verwenden, da das OP für PowerShell neu ist und möglicherweise nicht versteht, was gci, ?, % usw. ist.

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

Und wenn Sie natürlich wissen möchten, welche Dateien/Ordner gelöscht werden, bevor Sie sie tatsächlich löschen, können Sie einfach den Schalter -WhatIf zum Cmdlet-Aufruf Remove-Item am Ende beider Zeilen hinzufügen.

Der hier gezeigte Code ist PowerShell v2.0-kompatibel, aber ich zeige diesen Code und den schnelleren PowerShell v3.0-Code auch als praktische wiederverwendbare Funktionen in meinem Blog .

274
deadlydog

einfach einfach (PowerShell V5)

Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt  (Get-Date).AddDays(-15)  | Remove-Item -Force
38
Esperento57

Eine andere Möglichkeit besteht darin, 15 Tage vom aktuellen Datum abzuziehen und CreationTime mit diesem Wert zu vergleichen:

$root  = 'C:\root\folder'
$limit = (Get-Date).AddDays(-15)

Get-ChildItem $root -Recurse | ? {
  -not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
15
Ansgar Wiechers

Grundsätzlich iterieren Sie über Dateien unter dem angegebenen Pfad, subtrahieren die CreationTime jeder gefundenen Datei von der aktuellen Zeit und vergleichen sie mit der Days -Eigenschaft des Ergebnisses. Der Schalter -WhatIf teilt Ihnen mit, was passieren wird, ohne die Dateien tatsächlich zu löschen (welche Dateien werden gelöscht). Entfernen Sie den Schalter, um die Dateien tatsächlich zu löschen:

$old = 15
$now = Get-Date

Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf
13
Shay Levy

Versuche dies:

dir C:\PURGE -recurse | 
where { ((get-date)-$_.creationTime).days -gt 15 } | 
remove-item -force
7
Roland Jansen

Das Skript von Esperento57 funktioniert in älteren PowerShell-Versionen nicht. In diesem Beispiel wird Folgendes ausgeführt:

Get-ChildItem -Path "C:\temp" -Recurse -force -ErrorAction SilentlyContinue | where {($_.LastwriteTime -lt  (Get-Date).AddDays(-15) ) -and (! $_.PSIsContainer)} | select name| Remove-Item -Verbose -Force -Recurse -ErrorAction SilentlyContinue
5
KERR

Eine andere Alternative (15. wird automatisch in [Zeitspanne] eingegeben):

ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
2
js2010
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force -Recurse

Dadurch werden alte Ordner und deren Inhalt gelöscht.

1
Aigar

Wenn Sie Probleme mit den obigen Beispielen auf einer Windows 10-Box haben, ersetzen Sie .CreationTime durch .LastwriteTime. Das hat bei mir funktioniert.

dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
0
Jeff Blumenthal