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 -ForceOption, 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 -WhatIfSchalter einfach zum Remove-ItemCmdlet-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 CreationTimediesem 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 CreationTimevon jeder gefundenen Datei von der aktuellen Zeit und vergleichen sie mit der DaysEigenschaft des Ergebnisses. Der -WhatIfSchalter 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
-recurseist 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 .CreationTimemit .LastwriteTime. Das hat bei mir funktioniert.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTimeist nicht dasselbe wie CreationTime, LastwriteTimewird 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"
}
}
$Filesleer ist, die foreach- Anweisung nicht eingibt . Sie sollten das foreach in die if- Anweisung einfügen .