Comandos para consultar y configurar variables de entorno en Windows

Resumen

Las variables de entorno de Windows se leen desde un bloque de entorno creado en el momento en que se inicia un proceso. Este artículo explica con precisión el alcance de las variables (proceso, usuario, sistema), cómo se almacenan de forma persistente, cómo consultarlas y configurarlas mediante CMD y PowerShell y, sobre todo, cómo difieren y se muestran las variables de usuario y de sistema.


Notación de variables

Nombre Ejemplo Descripción
<<VAR_NAME>> PATH Nombre de la variable a operar
<<VALUE>> C:\Tools Valor a configurar

Step 1: Alcance y ubicación de almacenamiento

Tipo Ubicación Alcance Persistencia Nota
Variable de proceso Memoria Solo el proceso actual Temporal CMD: set / PowerShell: $env:
Variable de usuario HKCU\Environment Usuario actual Persistente setx / .NET API
Variable del sistema (Machine) HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Todos los usuarios Persistente setx /M / .NET API (admin)

Proceso, usuario y sistema son independientes

  • Proceso: solo visible para la sesión actual
  • Usuario: específico por perfil de usuario
  • Sistema: compartido para todos
  • PATH puede mostrarse como concatenación de PATH del sistema + PATH del usuario

Es fundamental verificar el alcance adecuado antes de definir una variable.


Step 2: CMD (%VAR%) — Consulta y configuración

2-1. Listar variables de proceso

set

2-2. Consultar variable

echo %<<VAR_NAME>>%

2-3. Establecer variable temporal (solo CMD actual)

set <<VAR_NAME>>=<<VALUE>>

2-4. Configurar variable persistente (setx)

Sintaxis básica

setx <<VAR_NAME>> "<<VALUE>>"

Alcance de usuario (por defecto)

setx <<VAR_NAME>> "<<VALUE>>"

Alcance del sistema (requiere admin, /M obligatorio)

setx <<VAR_NAME>> "<<VALUE>>" /M

Características de setx

  • No actualiza la sesión CMD actual
  • Los valores con %PATH% se expanden y se guardan estáticos
  • Puede truncarse el PATH si es demasiado largo (no recomendado)

Step 3: Cómo verificar variables de usuario y sistema en CMD

Usuario (HKCU)

reg query HKCU\Environment

Sistema (HKLM)

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

reg query permite ver valores sin combinar, tal como están en cada ámbito.


Step 4: Edición segura de PATH (precauciones en CMD)

Este es un mal ejemplo y no se recomienda:

# setx PATH "%PATH%;C:\Tools"

Motivos:

  • %PATH% se expande y se almacena como texto fijo
  • REG_EXPAND_SZ puede convertirse en REG_SZ, perdiendo referencias como %SystemRoot%
  • PATH largo puede truncarse

La modificación del PATH debe hacerse con PowerShell + .NET API (se explica más adelante).


Step 5: PowerShell ($env:VAR) — Consulta y configuración

5-1. Listar variables de proceso

Get-ChildItem Env:

5-2. Consultar variable

$env:<<VAR_NAME>>

5-3. Configuración temporal

$env:<<VAR_NAME>> = "<<VALUE>>"

Step 6: Ver valores correctos de usuario y sistema en PowerShell

Usuario (HKCU)

Get-ItemProperty "HKCU:\Environment"

Sistema (HKLM)

Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

Step 7: Configuración persistente mediante PowerShell (.NET API / Recomendado)

Usuario (User)

[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","User")

Sistema (Machine – requiere privilegios)

[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","Machine")

Ventajas:

  • Evita truncamiento del PATH
  • Mantiene REG_EXPAND_SZ
  • Edición segura y controlada

Step 8: Actualizar PATH de forma segura (.NET API / Mejor práctica)

$add = "C:\Tools"
$current = [System.Environment]::GetEnvironmentVariable("PATH","Machine")
$new = ($current.TrimEnd(';') + ';' + $add).Trim(';')
[System.Environment]::SetEnvironmentVariable("PATH",$new,"Machine")

Step 9: Eliminación de variables

9-1. Proceso (solo en sesión actual)

Remove-Item Env:<<VAR_NAME>> -ErrorAction SilentlyContinue

9-2. Eliminación persistente (registro)

Usuario

Remove-ItemProperty -Path "HKCU:\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue

Sistema (requiere admin)

Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue

Step 10: Aplicar y validar configuración

10-1. Ver valor en proceso actual

Get-ChildItem Env:<<VAR_NAME>>

10-2. Validar en CMD

echo %<<VAR_NAME>>%

10-3. Volver a cargar valor persistente

$env:<<VAR_NAME>> = [System.Environment]::GetEnvironmentVariable("<<VAR_NAME>>","User")

Step 11: Configurar múltiples variables (usuario y sistema)

# Usuario
$vars = @{
  "APPDATA_DIR" = "C:\AppData"
  "LOG_PATH"    = "C:\Logs"
  "TOOLS"       = "C:\Tools"
}
foreach ($v in $vars.GetEnumerator()) {
  [System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"User")
}

# Sistema
$sysVars = @{
  "JAVA_HOME" = "C:\Program Files\Java\<<VALUE>>"
}
foreach ($v in $sysVars.GetEnumerator()) {
  [System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"Machine")
}

Resumen final

  • Las variables de proceso, usuario y sistema existen por separado.
  • CMD y PowerShell pueden mostrar valores combinados o distintos.
  • HKCU/HKLM muestran los valores reales de cada ámbito.
  • setx puede persistir, pero no es adecuado para PATH.
  • La API de .NET (SetEnvironmentVariable) es el método más seguro y fiable.