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?
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 .
einfach einfach (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
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
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
Versuche dies:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
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
Eine andere Alternative (15. wird automatisch in [Zeitspanne] eingegeben):
ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
$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.
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