Script de PowerShell para realizar un mantenimiento completo y automatizado de equipos con Windows 10 y Windows 11. Detecta el tipo de almacenamiento instalado (SSD, NVMe o HDD) y adapta los pasos correspondientes. No elimina archivos sensibles ni datos del usuario. Incluye un modo de interfaz grafica (-GUI) con checkboxes, log en tiempo real y barra de progreso.
| Requisito | Detalle |
|---|---|
| Sistema operativo | Windows 10 (build 10240+) o Windows 11 |
| PowerShell | 5.1 o superior (incluido en Windows) |
| Permisos | Debe ejecutarse como Administrador |
| Modulo opcional | PSWindowsUpdate para instalar actualizaciones automaticamente |
Abre PowerShell (no hace falta ejecutarlo como Administrador de antemano) y pega:
irm run.andresbolivar.me/run.ps1 | iex
El lanzador detecta automaticamente si la sesion no esta elevada, solicita permisos via UAC y abre el menu de seleccion de pasos en una ventana de administrador.
Para pasar opciones usa la sintaxis de scriptblock:
# Ejecutar todos los pasos sin mostrar el menu
& ([scriptblock]::Create((irm 'run.andresbolivar.me/run.ps1'))) -TodosLosPasos
# Pasos especificos
& ([scriptblock]::Create((irm 'run.andresbolivar.me/run.ps1'))) -Pasos 2,5,7
# Todos los pasos con reinicio automatico en 30 segundos
& ([scriptblock]::Create((irm 'run.andresbolivar.me/run.ps1'))) -TodosLosPasos -AutoReiniciar -SegundosEspera 30
Mantenimiento-Windows.ps1 desde este repositorio.Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\Mantenimiento-Windows.ps1
| Parametro | Tipo | Descripcion |
|---|---|---|
-TodosLosPasos |
Switch | Ejecuta todos los pasos sin mostrar el menu de seleccion |
-Pasos |
int[] |
Lista de numeros de paso a ejecutar (ej. 2,5,6) |
-AutoReiniciar |
Switch | Reinicia el equipo automaticamente al finalizar |
-SegundosEspera |
int |
Segundos de cuenta regresiva antes del reinicio automatico (defecto: 60) |
-GUI |
Switch | Abre una ventana grafica con checkboxes, log en tiempo real y barra de progreso |
Cuando se ejecuta sin parametros, muestra un menu donde se pueden activar o desactivar los pasos antes de comenzar:
.\Mantenimiento-Windows.ps1
====================================================================
SELECCION DE PASOS - Mantenimiento Windows v1.4.0
====================================================================
N Est Paso Descripcion
--------------------------------------------------------------------
1 [*] Informacion del sistema (requerido) Detecta OS, CPU, RAM y tipo de disco
2 [X] Limpieza de temporales Elimina archivos temporales...
3 [X] Limpieza de disco (cleanmgr) Ejecuta la herramienta integrada...
4 [X] Optimizacion de almacenamiento TRIM para SSD/NVMe o desfrag para HDD
...
15 [X] Salud de disco (S.M.A.R.T.) Detecta fallos inminentes por temperatura...
--------------------------------------------------------------------
Pasos seleccionados: 15 de 15
[T] Todos [N] Ninguno [ENTER] Ejecutar [Q] Salir
>
Controles del menu:
| Tecla | Accion |
|---|---|
| Numero (1-15) | Activa o desactiva ese paso |
T |
Selecciona todos los pasos |
N |
Desmarca todos los pasos (excepto el requerido) |
ENTER |
Ejecuta con la seleccion actual |
Q |
Cancela y sale del script |
.\Mantenimiento-Windows.ps1 -TodosLosPasos
Util para automatizacion o tareas programadas. El paso 1 siempre se incluye.
# Ejecutar solo limpieza, integridad y actualizaciones
.\Mantenimiento-Windows.ps1 -Pasos 2,3,5,6
# Todos los pasos + reinicio automatico con 60 segundos de espera
.\Mantenimiento-Windows.ps1 -TodosLosPasos -AutoReiniciar
# Pasos especificos + reinicio en 30 segundos
.\Mantenimiento-Windows.ps1 -Pasos 2,5,7 -AutoReiniciar -SegundosEspera 30
Abre una ventana WinForms con checkboxes visuales para seleccionar pasos, log de progreso en tiempo real con colores y barra de progreso. Al finalizar muestra un dialogo para reiniciar el equipo.
# Ejecucion local
.\Mantenimiento-Windows.ps1 -GUI
# Via irm (con parametros)
& ([scriptblock]::Create((irm 'run.andresbolivar.me/run.ps1'))) -GUI
| N° | Nombre | Descripcion | SSD/NVMe | HDD |
|---|---|---|---|---|
| 1* | Informacion del sistema | Detecta OS, CPU, RAM y tipo de disco | Si | Si |
| 2 | Limpieza de temporales | Elimina archivos temporales del sistema (Windows\Temp) y del usuario (%TEMP%), cache de Windows Update, prefetch y minidumps con mas de 2 dias de antiguedad |
Si | Si |
| 3 | Limpieza de disco (cleanmgr) | Ejecuta cleanmgr en modo silencioso con todas las categorias seguras habilitadas |
Si | Si |
| 4 | Optimizacion de almacenamiento | Ejecuta TRIM en discos SSD/NVMe y desfragmentacion en discos HDD | TRIM | Defrag |
| 5 | Integridad del sistema | Ejecuta DISM CheckHealth, ScanHealth y RestoreHealth (si hay danos), seguido de SFC /scannow |
Si | Si |
| 6 | Windows Update | Instala actualizaciones pendientes con PSWindowsUpdate (si esta disponible) o lista las pendientes via COM |
Si | Si |
| 7 | Analisis de seguridad | Actualiza las definiciones de Windows Defender y ejecuta un escaneo rapido | Si | Si |
| 8 | Mantenimiento de red | Vacia la cache de DNS, renueva la direccion IP y restablece el catalogo Winsock | Si | Si |
| 9 | Eventos criticos | Revisa los eventos de nivel Error y Critico de los logs System y Application de las ultimas 24 horas |
Si | Si |
| 10 | Verificacion de disco | Ejecuta Repair-Volume -Scan (equivalente a chkdsk) en todos los volumenes NTFS |
Si | Si |
| 11 | Programas de inicio | Lista las entradas del registro de inicio y detecta servicios automaticos detenidos | Si | Si |
| 12 | Revision de controladores | Detecta dispositivos con errores o codigos de problema en el Administrador de dispositivos | Si | Si |
| 13 | Configuracion de energia | Verifica el plan de energia activo y genera un informe de salud de bateria en equipos portatiles | Si | Si |
| 14 | Tareas programadas | Dispara las tareas de mantenimiento integradas de Windows (defrag, limpieza, registro, WinSAT, etc.) | Si | Si |
| 15 | Salud de disco (S.M.A.R.T.) | Detecta fallos inminentes analizando temperatura, desgaste (SSD), errores no corregidos, horas de encendido y latencias maximas mediante Get-StorageReliabilityCounter. Calcula y muestra un porcentaje de salud con barra de progreso visual |
Si | Si |
* El paso 1 es requerido y siempre se ejecuta. Los demas son opcionales.
Usa Get-StorageReliabilityCounter, integrado en Windows 10/11, para analizar cada disco fisico sin herramientas externas. Evalua las siguientes metricas con umbrales diferenciados por tipo de disco:
| Estado | HDD | SSD / NVMe |
|---|---|---|
| Normal | <= 45 °C | <= 60 °C |
| Advertencia | 46 - 55 °C | 61 - 70 °C |
| Critica | > 55 °C | > 70 °C |
| Estado | Desgaste acumulado |
|---|---|
| Normal | < 70% usado |
| Advertencia - planifica reemplazo | >= 70% usado |
| Critico - reemplazo urgente | >= 90% usado |
| Metrica | Condicion de alerta |
|---|---|
| Errores de lectura no corregidos | Cualquier valor > 0 (critico) |
| Errores de escritura no corregidos | Cualquier valor > 0 (critico) |
| Horas de encendido | > 35 000 h en HDD / > 43 800 h en SSD (informativo) |
| Latencia maxima de lectura/escritura | > 500 ms (advertencia) |
| Estado general de Windows | Warning o Unhealthy |
Al final del analisis de cada disco se muestra un porcentaje de salud calculado a partir de todos los indicadores anteriores, similar a la metrica principal de HDD Sentinel:
Salud del disco : [#########################] 100% - Bueno
Salud del disco : [##################-------] 72% - Regular
Salud del disco : [#######------------------] 28% - Malo
El color de la barra cambia segun el resultado:
| Rango | Color | Estado |
|---|---|---|
| 80% - 100% | Verde | Bueno |
| 50% - 79% | Amarillo | Regular |
| 0% - 49% | Rojo | Malo |
Los factores que reducen el porcentaje y su impacto son:
| Factor | Impacto en la salud |
|---|---|
Estado Windows: Unhealthy |
Techo maximo en 10% |
Estado Windows: Warning |
Techo maximo en 65% |
| Errores de lectura no corregidos | -25% por cada tipo |
| Errores de escritura no corregidos | -25% por cada tipo |
| Desgaste SSD >= 90% | Salud = 100 - desgaste (ej. 95% usado -> max 5%) |
| Desgaste SSD >= 70% | -15% |
| Temperatura critica | -20% |
| Temperatura elevada | -10% |
| Latencia maxima > 1 000 ms | -10% |
| Latencia maxima > 500 ms | -5% |
| Horas de encendido excesivas | -5% |
Si se detectan factores negativos, se listan individualmente debajo de la barra para facilitar el diagnostico.
El resumen al final del mantenimiento indica si hay problemas criticos (considerar reemplazo inmediato), advertencias (monitorizar de cerca) o si todos los discos estan en buen estado.
Al terminar el mantenimiento el script siempre ofrece la opcion de reiniciar el equipo para aplicar todos los cambios.
Muestra un prompt [S] Reiniciar ahora / [N] Reiniciar despues. Si se elige S, inicia una cuenta regresiva de 15 segundos cancelable con cualquier tecla.
-AutoReiniciar)Inicia directamente la cuenta regresiva con los segundos configurados en -SegundosEspera (defecto: 60). El usuario puede cancelar presionando cualquier tecla en cualquier momento de la cuenta.
-GUI)Al finalizar todos los pasos aparece un dialogo ¿Desea reiniciar el equipo ahora? con opciones Si / No. Si se elige Si, el equipo reinicia inmediatamente.
Cada ejecucion genera un archivo de log detallado con marca de tiempo:
C:\Mantenimiento_Logs\Mantenimiento_2025-06-15_10-30-00.log
El log incluye:
El script esta disenado para ser conservador con los datos del usuario:
Solo se eliminan archivos en las siguientes rutas seguras:
C:\Windows\Temp - temporales del sistema (>2 dias)%TEMP% del usuario actual (>2 dias)C:\Windows\SoftwareDistribution\Download - cache de descarga de Windows UpdateC:\Windows\Minidump - volcados de memoria (>30 dias)C:\Windows\Prefetch - archivos de precarga (>30 dias)C:\ProgramData\Microsoft\Windows\WER\Temp - temporales de informe de erroresPara que el paso 6 pueda instalar actualizaciones automaticamente (no solo listarlas), instala el modulo una sola vez:
Install-Module PSWindowsUpdate -Force -Scope CurrentUser
Sin este modulo el script igualmente detecta y lista las actualizaciones pendientes usando la API COM de Windows Update.
Para ejecutar el mantenimiento de forma desatendida cada semana:
$accion = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-ExecutionPolicy Bypass -File `"C:\Scripts\Mantenimiento-Windows.ps1`" -TodosLosPasos -AutoReiniciar -SegundosEspera 120"
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At "02:00AM"
$config = New-ScheduledTaskSettingsSet -RunOnlyIfIdle -IdleDuration 00:10:00
Register-ScheduledTask `
-TaskName "Mantenimiento Semanal Windows" `
-Action $accion `
-Trigger $trigger `
-Settings $config `
-RunLevel Highest `
-Force
El script esta guardado en UTF-8 con BOM y saltos de linea CRLF, que es el formato requerido por Windows PowerShell 5.1. Si el archivo se abre y se guarda con un editor que cambie el encoding (sin BOM o con LF), puede aparecer el siguiente error al ejecutarlo:
Missing expression after unary operator '--'
Para verificar o corregir el encoding desde PowerShell:
# Verificar encoding actual
$bytes = [System.IO.File]::ReadAllBytes('.\Mantenimiento-Windows.ps1')
if ($bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) {
Write-Host "OK: UTF-8 con BOM"
} else {
Write-Host "ADVERTENCIA: falta BOM - puede causar errores"
}
# Corregir encoding si es necesario
$content = Get-Content '.\Mantenimiento-Windows.ps1' -Raw
[System.IO.File]::WriteAllText('.\Mantenimiento-Windows.ps1', $content,
[System.Text.UTF8Encoding]::new($true)) # $true = incluir BOM
| Version | Cambios |
|---|---|
| 1.4.0 | Agrega interfaz grafica WinForms (-GUI): checkboxes visuales para seleccionar pasos, log en tiempo real con colores por tipo (INFO/OK/WARN/ERROR/SECCION), barra de progreso y dialogo de reinicio al finalizar. Los pasos se ejecutan en un runspace independiente para no bloquear la UI. Se actualiza run.ps1 para reenviar -GUI en la elevacion UAC |
| 1.3.1 | Agrega porcentaje de salud del disco similar a HDD Sentinel en el paso 15. Muestra una barra de progreso visual ([#####-----]) con color verde/amarillo/rojo segun el estado y lista los factores que reducen la salud (errores, desgaste, temperatura, latencia, uso prolongado) |
| 1.3.0 | Agrega paso 15: verificacion de salud de disco con S.M.A.R.T. Detecta temperatura critica, desgaste de SSD, errores de lectura/escritura no corregidos, horas de encendido y latencias elevadas usando Get-StorageReliabilityCounter nativo de Windows |
| 1.2.2 | Corrige error The property 'Count' cannot be found on this object al seleccionar [N] Ninguno en el menu. Causa raiz: OrderedDictionary siempre usa el indexador posicional (int) en PowerShell aunque las claves sean strings, devolviendo $null cuando el indice estaba fuera de rango. Solucion definitiva: reemplaza [ordered]@{} por un array de hashtables con iteracion directa (foreach/Where-Object/ForEach-Object) eliminando cualquier indexador ambiguo |
| 1.2.1 | Corrige error de indice fuera de rango (Index was out of range) en el menu de seleccion de pasos al acceder al paso 14. Causa: [ordered]@{} con claves enteras usa indexacion posicional en lugar de por clave. Solucion: claves convertidas a strings. Ademas: encoding corregido a UTF-8 con BOM y CRLF para compatibilidad con Windows PowerShell 5.1 |
| 1.2.0 | Menu interactivo de seleccion de pasos, parametros -Pasos y -TodosLosPasos |
| 1.1.0 | Opcion de reinicio al finalizar con cuenta regresiva cancelable, parametros -AutoReiniciar y -SegundosEspera |
| 1.0.0 | Version inicial con los 14 pasos de mantenimiento y deteccion SSD/HDD |