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?
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?
Respuestas:
Las respuestas dadas solo eliminarán archivos (lo que sin duda es lo que está en el título de esta publicación), pero aquí hay un código que primero eliminará todos los archivos anteriores a 15 días, y luego eliminará recursivamente cualquier directorio vacío que pueda haber quedado. detrás. Mi código también usa la -Force
opción de eliminar archivos ocultos y de solo lectura. También, he optado por no utilizar alias como el PO es nuevo para PowerShell y puede que no entienda lo que 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, puede agregar el -WhatIf
interruptor a la Remove-Item
llamada al cmdlet 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 prácticas funciones reutilizables en mi blog .
simplemente (PowerShell V5)
Get-ChildItem "C:\temp" -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-15) | Remove-Item -Force
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
Básicamente, itera sobre los archivos bajo la ruta dada, resta el CreationTime
de cada archivo encontrado de la hora actual y compara con la Days
propiedad del resultado. El -WhatIf
interruptor le dirá lo que sucederá sin eliminar realmente 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
Prueba esto:
dir C:\PURGE -recurse |
where { ((get-date)-$_.creationTime).days -gt 15 } |
remove-item -force
-recurse
es demasiado, ¿no? La lista de directorios es recursiva, la eliminación del elemento no debe ser con niños incluidos, ¿verdad?
El script de Esperento57 no funciona en 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
Si tiene problemas con los ejemplos anteriores en un cuadro de Windows 10, intente reemplazar .CreationTime
con .LastwriteTime
. Esto funcionó para mí.
dir C:\locationOfFiles -ErrorAction SilentlyContinue | Where { ((Get-Date)-$_.LastWriteTime).days -gt 15 } | Remove-Item -Force
LastwriteTime
no es lo mismo que CreationTime
, LastwriteTime
se actualiza cada vez que se modifica el archivo.
#----- 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
está vacía no ingresará la instrucción foreach . Debe colocar el foreach en la declaración if .