#Requires -Version 5.1 <# .SYNOPSIS Reconstruye la cache de iconos del usuario actual. .DESCRIPTION Windows guarda los iconos en una cache por usuario. Despues de renombrar ficheros muchas veces (por ejemplo, el .rt26 del ejercicio y su reversion), esa cache se queda obsoleta: los ficheros aparecen con un icono generico, en blanco, o con el del nombre anterior. Este script hace las tres cosas que lo arreglan: 1. Cierra el Explorador (es quien tiene abierta la cache). 2. Borra los ficheros de cache de iconos del usuario. 3. Vuelve a abrir el Explorador y pide al shell que reconstruya los iconos. Tambien reinicia el proceso de la barra de tareas y el escritorio, asi que la pantalla parpadeara un par de segundos y volvera sola. .PARAMETER SinExplorador No cierra ni reinicia el Explorador. Util si prefieres hacerlo tu despues, o si lo lanzas desde una sesion remota donde no quieres perder la barra de tareas. .PARAMETER TodosLosPerfiles Ademas del usuario actual, borra las caches de iconos de los demas perfiles del equipo. Requiere ejecutarse ELEVADO, y es lo que hace falta en un equipo compartido. .EXAMPLE .\Reset-IconCache.ps1 Lo normal: cierra el Explorador, limpia y vuelve a abrirlo. .EXAMPLE .\Reset-IconCache.ps1 -TodosLosPerfiles Limpia tambien las caches de los demas usuarios del equipo. Ejecutar ELEVADO. .NOTES La cache de iconos es POR USUARIO: para que un usuario vea bien sus iconos, hay que limpiar la suya. De ahi -TodosLosPerfiles. #> [CmdletBinding()] param( [switch]$SinExplorador, [switch]$TodosLosPerfiles ) $ErrorActionPreference = 'Continue' function Escribir { param([string]$Texto, [string]$Color = 'Gray') Write-Host $Texto -ForegroundColor $Color } function Limpiar-Perfil { param([string]$RutaPerfil, [string]$Etiqueta) $localAppData = Join-Path $RutaPerfil 'AppData\Local' if (-not (Test-Path -LiteralPath $localAppData)) { Escribir (" {0}: sin AppData\Local, se salta" -f $Etiqueta) 'Yellow' return 0 } $borrados = 0 # La cache clasica $iconCache = Join-Path $localAppData 'IconCache.db' if (Test-Path -LiteralPath $iconCache) { Remove-Item -LiteralPath $iconCache -Force -ErrorAction SilentlyContinue if (-not (Test-Path -LiteralPath $iconCache)) { $borrados++ } } # Y las modernas, que en Windows 10 son varias y con nombres distintos $carpetaExplorer = Join-Path $localAppData 'Microsoft\Windows\Explorer' if (Test-Path -LiteralPath $carpetaExplorer) { foreach ($f in @(Get-ChildItem -LiteralPath $carpetaExplorer -File -ErrorAction SilentlyContinue | Where-Object { $_.Name -match '^(iconcache|thumbcache)_.*\.db$' })) { Remove-Item -LiteralPath $f.FullName -Force -ErrorAction SilentlyContinue if (-not (Test-Path -LiteralPath $f.FullName)) { $borrados++ } } } Escribir (" {0}: {1} fichero(s) de cache borrados" -f $Etiqueta, $borrados) 'Green' return $borrados } $quien = [Security.Principal.WindowsIdentity]::GetCurrent().Name $esAdmin = [bool]([Security.Principal.WindowsPrincipal]::new( [Security.Principal.WindowsIdentity]::GetCurrent() ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) Escribir '' Escribir '=== Reconstruir la cache de iconos ===' 'Cyan' Escribir ("usuario : {0}" -f $quien) Escribir ("equipo : {0} elevado={1}" -f $env:COMPUTERNAME, $esAdmin) Escribir '' $total = 0 # ---------------------------------------------------------------- 1) cerrar el Explorador if (-not $SinExplorador) { Escribir '1) cerrando el Explorador...' Stop-Process -Name explorer -Force -ErrorAction SilentlyContinue Start-Sleep -Seconds 3 Escribir ' cerrado' 'Green' } else { Escribir '1) -SinExplorador: no se toca el Explorador' } # ---------------------------------------------------------------- 2) borrar las caches Escribir '' Escribir '2) borrando las caches' # La del usuario actual, siempre $total += Limpiar-Perfil -RutaPerfil $env:USERPROFILE -Etiqueta $env:USERNAME # Y las de los demas, si se pide if ($TodosLosPerfiles) { if (-not $esAdmin) { Escribir ' -TodosLosPerfiles necesita ejecutarse ELEVADO: no se tocan los demas' 'Yellow' } else { $noSonPerfiles = @('Public', 'Default', 'Default User', 'All Users', 'WDAGUtilityAccount') foreach ($p in @(Get-ChildItem 'C:\Users' -Directory -ErrorAction SilentlyContinue | Where-Object { ($noSonPerfiles -notcontains $_.Name) -and ($_.Name -ne $env:USERNAME) })) { $total += Limpiar-Perfil -RutaPerfil $p.FullName -Etiqueta $p.Name } } } # ---------------------------------------------------------------- 3) volver a arrancar Escribir '' if (-not $SinExplorador) { Escribir '3) arrancando el Explorador...' Start-Process explorer.exe Start-Sleep -Seconds 3 Escribir ' arrancado' 'Green' 1..3 | ForEach-Object { Start-Process 'ie4uinit.exe' -ArgumentList '-show' -WindowStyle Hidden -ErrorAction SilentlyContinue Start-Sleep -Milliseconds 700 } Escribir ' iconos reconstruidos' 'Green' } else { Escribir '3) recuerda: cierra y abre el Explorador para que se reconstruya la cache' Start-Process 'ie4uinit.exe' -ArgumentList '-show' -WindowStyle Hidden -ErrorAction SilentlyContinue } Escribir '' Escribir ("Total de ficheros de cache borrados: {0}" -f $total) 'Cyan' Escribir 'Si algun icono sigue raro, cierra la sesion y vuelve a entrar: se reconstruye del todo.' 'Cyan'