Eliminar archivos de más de 15 días con PowerShell
powershell-v2.0 powershell-v3.0 (9)
Básicamente, itera sobre los archivos en la ruta determinada, resta el tiempo de CreationTime
de cada archivo encontrado a partir de la hora actual y compara con la propiedad Days
del resultado. El -WhatIf
le indicará lo que sucederá sin eliminar los archivos (qué archivos se eliminarán), elimine el interruptor para eliminar realmente los archivos:
$old = 15
$now = Get-Date
Get-ChildItem $path -Recurse |
Where-Object {-not $_.PSIsContainer -and $now.Subtract($_.CreationTime).Days -gt $old } |
Remove-Item -WhatIf
Me gustaría eliminar solo los archivos que se crearon hace más de 15 días en una carpeta en particular. ¿Cómo podría hacer esto usando PowerShell?
La secuencia de comandos de Esperento57 no funciona en las versiones anteriores de PowerShell. Este ejemplo hace:
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
Otra alternativa (15. se escribe a [intervalo de tiempo] automáticamente):
ls -file | where { (get-date) - $_.creationtime -gt 15. } | Remove-Item -Verbose
Otra forma es restar 15 días de la fecha actual y comparar CreationTime
con ese valor:
$root = ''C:/root/folder''
$limit = (Get-Date).AddDays(-15)
Get-ChildItem $root -Recurse | ? {
-not $_.PSIsContainer -and $_.CreationTime -lt $limit
} | Remove-Item
Prueba esto:
dir C:/PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
simplemente, (PowerShell V5)
Get-ChildItem "C:/temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
Las respuestas dadas solo eliminarán los archivos (lo que es cierto es lo que está en el título de esta publicación), pero aquí hay un código que primero borrará todos los archivos anteriores a 15 días y luego eliminará recursivamente los directorios vacíos que puedan haber quedado. detrás. Mi código también usa la opción -Force
para eliminar también los -Force
ocultos y de solo lectura. Además, elegí no usar alias ya que el OP es nuevo en PowerShell y es posible que no comprenda qué gci
, %
, etc. son.
$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
Y, por supuesto, si desea ver qué archivos / carpetas se eliminarán antes de eliminarlos realmente, puede simplemente agregar el parámetro -WhatIf
a la llamada al cmdlet Remove-Item
al final de ambas líneas.
El código que se muestra aquí es compatible con PowerShell v2.0, pero también muestro este código y el código más rápido de PowerShell v3.0 como funciones útiles reutilizables en mi blog .
#----- 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"
}
}
$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
Esto eliminará las carpetas viejas y su contenido.