Batch para eliminar carpetas antiguas

Iniciado por _CrisiS_, 17 Agosto 2019, 20:05 PM

0 Miembros y 1 Visitante están viendo este tema.

_CrisiS_

Hola quisiera que me ayuden con un batch que pueda eliminar todas las carpetas que tengan en su fecha de creacion 5 dias de antiguedad a mas, estas carpetas se encuentran en una unidad de red "192.168.X.X\CARPETA\"

EdePC

Saludos,

- Batch tiene sus limitaciones para manipular fechas, y más aún si se trata de una fecha de creación. Lo usual es ayudarse de vbScript o hoy en día de PowerShell.

- Por ejemplo el siguiente script en PowerShell Muestra (Write-Output) todas las carpetas (-Directory) del Escritorio que tengan una fecha de creación anterior a 5 días, esto lo hace de la forma correcta, tomando incluso los segundos:

Código (dos) [Seleccionar]
Get-ChildItem 'C:\Users\EdSon\Desktop' -Directory | Where-Object {(Get-Date).AddDays(-5) -gt $_.CreationTime} | Write-Output

-- Puedes reemplazar la Ruta y el comando final (Write-Output) por Remove-Item para eliminar en lugar de mostrar. Como siempre, recomiendo probar los comandos de manera no destructiva hasta que esté bien claro que es como se quiere que trabaje.

-- El siguiente comando muestra de forma detallada la fecha de creación, última modificación y último acceso de las carpetas:

Código (dos) [Seleccionar]
Get-ChildItem 'C:\Users\EdSon\Desktop' -Directory | Where-Object {(Get-Date).AddDays(-5) -gt $_.CreationTime} | Write-Output | Format-List

- Lo puedes ejecutar desde una consola CMD o un Bacth anteponiendo PowerShell y usando comillas dobles para el/los comandos a ejecutar:

Código (dos) [Seleccionar]
PowerShell "Get-ChildItem 'C:\Users\EdSon\Desktop' -Directory | Where-Object {(Get-Date).AddDays(-5) -gt $_.CreationTime} | Write-Output | Format-List"

- Si lo que necesitas es trabajar con fechas de modificación, se puede utilizar ForFiles.

_CrisiS_

Cuando hablas de ForFiles yo usaba este codigo

ForFiles /p "\\192.168.4.60\bk_siaf\BACKUPS_DATA\" /s /d -5 /c "cmd /c del @file"

pero no funcioonaba

EdePC

- No se tiene que agregar el \ al final de la carpeta, lo correcto es:

Código (dos) [Seleccionar]
ForFiles /p "\\192.168.4.60\bk_siaf\BACKUPS_DATA" /s /d -5 /c "cmd /c del @file /q"

- Le agrego el /q al final para que no pregunte si hay que eliminar o no. Recordar que Del solo elimina ficheros y no carpetas. SI se le pasa una carpeta, Del elimina el contenido de dicha carpeta pero no a la carpeta en sí. Se puede usar RD /S /Q en su lugar haciendo un IF que compruebe si se trata de un Archivo o Directorio, usar Del o RD respectivamente:

Código (dos) [Seleccionar]
FORFILES /P "\\192.168.4.60\bk_siaf\BACKUPS_DATA" /D -5 /C "CMD /C IF '@isdir'=='TRUE' (RD /S /Q @file) ELSE (DEL /Q @file)"

- Recordar que ForFiles solo trabaja con Fechas de Modificación, además de que no es tan sencillo ver las Fechas de Modificación y Último Acceso de las carpetas, estas no se muestran en la Propiedades de las Carpetas, ahí solo se muestra la fecha de creación. Para verlo hay que usar una Vista Detallada desde el Explorador de Windows o usar programas de terceros.

-- También se pueden usar los siguientes comandos:

--- Muestra las fechas de Creación, Modificación y Último acceso:

Código (dos) [Seleccionar]
PowerShell "Get-ChildItem '\\192.168.4.60\bk_siaf\BACKUPS_DATA' -Recurse | Format-List"

--- Muestra la Fecha de Modificación y nombre:

Código (dos) [Seleccionar]
ForFiles /p "\\192.168.4.60\bk_siaf\BACKUPS_DATA" /s /d -5 /c "cmd /c echo @fdate @file"

Código (dos) [Seleccionar]
Dir /O:D /T:W /S \\192.168.4.60\bk_siaf\BACKUPS_DATA

- Documentación en Inglés:
https://ss64.com/nt/del.html
https://ss64.com/nt/rd.html
https://ss64.com/nt/dir.html
https://ss64.com/nt/forfiles.html

_CrisiS_

Según lo que voy entendiendo esos códigos me hacen una búsqueda de entre todas mis carpetas y dentro de ellas borran los archivos viejos no?

Yo quiero eliminar carpetas, aunque sea co su fecha de creación las mas antiguas, como podria ?

EdePC

- Usa llamadas a PowerShell como puse en mi primer mensaje, el siguiente script muestra solamente las carpetas que tienen una fecha de creación anterior a 5 días:

Código (dos) [Seleccionar]
PowerShell "Get-ChildItem '\\192.168.4.60\bk_siaf\BACKUPS_DATA' -Directory | Where-Object {(Get-Date).AddDays(-5) -gt $_.CreationTime} | Write-Output | Format-List"

- Si los resultados te convencen, cambia el mostrar por eliminar:

Código (dos) [Seleccionar]
PowerShell "Get-ChildItem '\\192.168.4.60\bk_siaf\BACKUPS_DATA' -Directory | Where-Object {(Get-Date).AddDays(-5) -gt $_.CreationTime} | Remove-Item"

- Batch no maneja directamente las fechas de creación para esto, y se tendrían que hacer decenas de líneas de código o usar "librerías" externas, en su lugar se puede usar llamadas vbScript o más actual y corto: PowerShell tal cual lo he puesto.

Código (dos) [Seleccionar]
@Echo Off
Echo Mostrando carpetas anteriores a 5 días en \\192.168.4.60\bk_siaf\BACKUPS_DATA:
PowerShell "Get-ChildItem '\\192.168.4.60\bk_siaf\BACKUPS_DATA' -Directory | Where-Object {(Get-Date).AddDays(-5) -gt $_.CreationTime} | Write-Output | Format-List"
Pause
Echo Eliminando carpetas ...
PowerShell "Get-ChildItem '\\192.168.4.60\bk_siaf\BACKUPS_DATA' -Directory | Where-Object {(Get-Date).AddDays(-5) -gt $_.CreationTime} | Remove-Item"

Echo Proceso completado
Pause