PowerShell - Limpiar archivos obsoletos, tarea programada windows server

 
Vista:
sin imagen de perfil

Limpiar archivos obsoletos, tarea programada windows server

Publicado por JR (1 intervención) el 08/01/2024 19:50:24
Buenas tardes,

No soy un experto pero creo que he logrado crear un script en poweshell para limpiar el file server de mi empresa en sobre carpetas y archivos obsoletos.

Se ha jubilado el informático de mi empresa y me han asignado el puesto. El problema que el fileserver (mas de 800mil archivos y carpetas) es un autentico caos en organización y en peso. Quiero liberar espacio y a raiz de ahi dar permisos a las carpetas para llevar un orden y mantenimiento.

El script trata de eliminar todo archivo o carpeta que cumplan las condiciones dadas. Soy nuevo en este foro y ya que lo he logrado desarrollar este humilde codigo me gustaria que expertos como vosotros me dierais vuestro punto de vista. De paso si a alguien le viene bien, pues mira.. mejor aun. Antes de ejecutarlo realizaré una copia de seguridad

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# Crear archivo .bat para programarlo en el programador de tareas de windows con los privilegios mas altos (activar casilla) ya que pueden existir carpetas que tengan permisos solo a ciertos usuarios. Lo recomendable es que este script se ejecute una vez al año
# En base a un directorio raiz, examina todos los archivos si cumplen con la condicion sobre la ultima fecha de modificacion y si no esta excluido este mismo archivo en un log.txt.
# Si dicha fecha del archivo es inferior a la programada y cumplen las condiciones el archivo sera eliminado y lo registrara en un log con extension excel .csv
# el archivo sera eliminado siempre y cuando la carpeta que lo contiene, la carpeta raiz o mismo el archivo en si no este excluido.
# Si existe una carpeta vacia y ésta no esta excluida tambien sera eliminada y se registrara en el log .csv
# la idea es la de limpiar todo el Fileserver de la empresa con archivos y carpetas obsoletas.
 
 
# Ruta al directorio que quieres examinar
$rutaDirectorio = "C:\Ruta\Al\Directorio"
 
# Ruta para el archivo de log CSV
$rutaLog = "C:\Ruta\Al\logEliminacion.csv"
 
# Ruta al archivo de texto que contiene las exclusiones (carpetas raíz)
$rutaExclusiones = "C:\Ruta\Al\exclusiones.txt"
 
# Ejemplo de cómo agregar directorios/archivos a la lista de excepciones
# Puedes añadir tantos directorios/archivos como desees a esta lista, uno por línea
# "C:\Ruta\Excepcion1" Carpeta
# "C:\Ruta\Excepcion2\Archivo.txt" Archivo
 
 
 
# Verificación de Exclusiones
if (Test-Path $rutaExclusiones) {
    # Leer las exclusiones desde el archivo de texto
    $exclusiones = Get-Content $rutaExclusiones
} else {
    # Si el archivo de exclusiones no existe, inicializar la variable como un array vacío
    $exclusiones = @()
}
 
# Definir la cantidad de años como variable
$cantidadAnos = 5
 
# Definir el límite en base a la cantidad de años
$limite = (Get-Date).AddYears(-$cantidadAnos)
 
# Verificación del Archivo de Log
if (Test-Path $rutaLog) {
    # El archivo de log ya existe, obtener la información actual
    $elementos = Get-ChildItem -Path $rutaDirectorio -Recurse | Select-Object FullName, LastWriteTime | Where-Object {
        $_.FullName -notin $exclusiones -and -not $_.PSIsContainer -and $_.LastWriteTime -lt $limite -and (Get-Item $_.DirectoryName).FullName -notin $exclusiones
    }
 
    # Registro de Archivos y Carpetas a Eliminar
    foreach ($item in $elementos) {
        # Verificar si es un archivo o una carpeta vacía
        if ($item.PSIsContainer) {
            # Es una carpeta
            if ((Get-ChildItem -Path $item.FullName -File).Count -eq 0) {
                # Carpeta vacía
                $observacion = "Carpeta eliminada por estar vacía"
                Remove-Item -Path $item.FullName -Force -Recurse
            } else {
                # Carpeta con contenido
                continue
            }
        } else {
            # Es un archivo
            $rutaCarpeta = (Get-Item $item.FullName).DirectoryName
            if ($item.LastWriteTime -lt $limite -and $rutaCarpeta -notin $exclusiones) {
                $observacion = "Archivo eliminado por no haberse modificado en $cantidadAnos años"
                Remove-Item -Path $item.FullName -Force
            } else {
                # No se elimina el archivo porque la carpeta está excluida
                continue
            }
        }
 
        # Registrar la información en el archivo de log CSV con observación
        $registro = [PSCustomObject]@{
            "Ruta" = $item.FullName
            "FechaUltimaModificacion" = $item.LastWriteTime.ToString("dd/MM/yyyy HH:mm")
            "FechaEliminacion" = (Get-Date).ToString("dd/MM/yyyy HH:mm")
            "Observacion" = $observacion
        }
 
        # Agregar el registro al archivo de log CSV
        $registro | Export-Csv -Path $rutaLog -Append -NoTypeInformation -Encoding UTF8
    }
} else {
    # El archivo de log no existe, crear uno nuevo
    $elementos = Get-ChildItem -Path $rutaDirectorio -Recurse | Select-Object FullName, LastWriteTime | Where-Object {
        $_.FullName -notin $exclusiones -and -not $_.PSIsContainer -and $_.LastWriteTime -lt $limite -and (Get-Item $_.DirectoryName).FullName -notin $exclusiones
    }
 
    # Registro de Archivos y Carpetas a Eliminar
    foreach ($item in $elementos) {
        # Verificar si es un archivo o una carpeta vacía
        if ($item.PSIsContainer) {
            # Es una carpeta
            if ((Get-ChildItem -Path $item.FullName -File).Count -eq 0) {
                # Carpeta vacía
                $observacion = "Carpeta eliminada por estar vacía"
                Remove-Item -Path $item.FullName -Force -Recurse
            } else {
                # Carpeta con contenido
                continue
            }
        } else {
            # Es un archivo
            $rutaCarpeta = (Get-Item $item.FullName).DirectoryName
            if ($item.LastWriteTime -lt $limite -and $rutaCarpeta -notin $exclusiones) {
                $observacion = "Archivo eliminado por no haberse modificado en $cantidadAnos años"
                Remove-Item -Path $item.FullName -Force
            } else {
                # No se elimina el archivo porque la carpeta está excluida
                continue
            }
        }
 
        # Registrar la información en el archivo de log CSV con observación
        $registro = [PSCustomObject]@{
            "Ruta" = $item.FullName
            "FechaUltimaModificacion" = $item.LastWriteTime.ToString("dd/MM/yyyy HH:mm")
            "FechaEliminacion" = (Get-Date).ToString("dd/MM/yyyy HH:mm")
            "Observacion" = $observacion
        }
 
        # Agregar el registro al archivo de log CSV
        $registro | Export-Csv -Path $rutaLog -Append -NoTypeInformation -Encoding UTF8
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder