Cómo solucionar el error 'Duplicate keys' por mayúsculas/minúsculas en hashtables de PowerShell

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 literals

La 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:

ToolSignal Pro Editorial

ToolSignal Pro는 AI·IT·소프트웨어 트렌드를 다루는 종합 IT 인사이트 매거진입니다.

이전 글 다음 글