2 min read · 537 words
Si te has topado con el maldito error de "duplicate keys" en un hashtable de PowerShell intentando hacer un reemplazo masivo de texto, este post es para ti. Te cuento cómo saltarte esta limitación de PowerShell (que es case-insensitive por defecto) y solucionar el problema en un abrir y cerrar de ojos.
El contexto del problema
Lo que estaba intentando hacer era usar PowerShell para reemplazar en lote ciertos strings de colores hexadecimales en un documento. Para mapear los valores (que venían mezclando mayúsculas y minúsculas), definí un hashtable tal que así:
$replacements = @{'#1e2a45'='#f6f7f8'; '#1E2A45'='#f6f7f8'}Pero en cuanto ejecuté esto, el script petó en la misma definición del hashtable.
El error: Duplicate keys in hash literals
El error exacto que me escupió la consola fue el siguiente:
Duplicate keys '#1E2A45' are not allowed in hash literalsLa razón de fondo es simple: PowerShell es, por defecto, case-insensitive al comparar claves en sus hashtables. Por lo tanto, interpreta #1e2a45 y #1E2A45 como la misma clave, lanzando la excepción de duplicado e impidiendo que el script continúe.
Mi entorno de trabajo
- OS: Windows
- Versión: Windows PowerShell 5.1
- Stack: hashtable literal (@{})
Lo que intenté primero (y falló)
Mi primer intento de workaround fue pasar del literal (@{}) y crear directamente un objeto .NET usando New-Object System.Collections.Hashtable. Spoiler: falló exactamente igual. Por debajo sigue usando el mismo mecanismo de comparación case-insensitive.
Por más que le recé para que distinguiera entre mayúsculas y minúsculas, PowerShell pasó de mí olímpicamente. Al final, con herramientas tan tercas, lo mejor es no forzar las cosas y buscar otra vía.
La solución definitiva
En lugar de seguir dándome de cabezazos con PowerShell, decidí pivotar a Python, que es infinitamente más flexible para procesar texto. Usé el módulo re de Python con la flag re.I (ignore case) mediante re.compile(re.escape(old), re.I). Con esto pude reemplazar todos los colores hex sin importar cómo estuvieran escritos y de forma totalmente segura.
El código que utilicé
import re
# Lista de reemplazos
swaps = [
('#1e2a45', '#f6f7f8'),
('#1E2A45', '#f6f7f8')
]
# Reemplazo case-insensitive
for old, new in swaps:
pat = re.compile(re.escape(old), re.I)
content = pat.sub(new, content)Resultado de la validación
Ejecuté el script de Python y, en una sola pasada, reemplacé con éxito los 131 valores hexadecimales objetivo. Cero errores de claves duplicadas, todo limpio y funcionando en producción.
Estado actual
Fixed (Solucionado)
Un consejo si estás en la misma situación
Si te estás volviendo loco con el error de "duplicate keys" en PowerShell, no pierdas el tiempo peleándote con diccionarios complejos de .NET dentro de PS. Si es para un reemplazo de texto, vete directo a Python con la flag re.I. Tu salud mental y tu productividad te lo agradecerán.
Category Coverage Notice
This article follows our label-specific editorial criteria. Details: