Ich möchte nur die Dateien löschen, die vor mehr als 15 Tagen in einem bestimmten Ordner erstellt wurden. Wie kann ich das mit PowerShell machen?
Ich möchte nur die Dateien löschen, die vor mehr als 15 Tagen in einem bestimmten Ordner erstellt wurden. Wie kann ich das mit PowerShell machen?
Antworten:
Mit den gegebenen 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 verbleibenden leeren Verzeichnisse rekursiv löscht hinter. Mein Code verwendet auch die -Force
Option, um versteckte und schreibgeschützte Dateien zu löschen. Auch ich wählte nicht Aliase zu verwenden , da die OP neu in Powershell ist und kann nicht verstehen , was gci
, ?
, %
etc. 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 sehen möchten, welche Dateien / Ordner gelöscht werden, bevor Sie sie tatsächlich löschen, können Sie den -WhatIf
Schalter einfach zum Remove-Item
Cmdlet-Aufruf 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 (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 mit CreationTime
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
von jeder gefundenen Datei von der aktuellen Zeit und vergleichen sie mit der Days
Eigenschaft des Ergebnisses. Der -WhatIf
Schalter 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
-recurse
ist einer zu viel, nein? Die Verzeichnisliste ist rekursiv, das Löschen des Elements sollte nicht mit Kindern erfolgen, oder?
Das Skript von Esperento57 funktioniert in älteren PowerShell-Versionen nicht. Dieses Beispiel macht:
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
Wenn Sie Probleme mit den obigen Beispielen auf einer Windows - 10 - Box haben, versuchen Sie ersetzen .CreationTime
mit .LastwriteTime
. Das hat bei mir funktioniert.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTime
ist nicht dasselbe wie CreationTime
, LastwriteTime
wird jedes Mal aktualisiert, wenn die Datei geändert wird.
#----- Define parameters -----#
#----- Get current date ----#
$Now = Get-Date
$Days = "15" #----- define amount of days ----#
$Targetfolder = "C:\Logs" #----- define folder where files are located ----#
$Extension = "*.log" #----- define extension ----#
$Lastwrite = $Now.AddDays(-$Days)
#----- Get files based on lastwrite filter and specified folder ---#
$Files = Get-Children $Targetfolder -include $Extension -Recurse | where {$_.LastwriteTime -le "$Lastwrite"}
foreach ($File in $Files)
{
if ($File -ne $Null)
{
write-host "Deleting File $File" backgroundcolor "DarkRed"
Remove-item $File.Fullname | out-null
}
else
write-host "No more files to delete" -forgroundcolor "Green"
}
}
$Files
leer ist, die foreach- Anweisung nicht eingibt . Sie sollten das foreach in die if- Anweisung einfügen .