- Resumen
- Notación de variables
- Step 1: Alcance y ubicación de almacenamiento
- Step 2: CMD (%VAR%) — Consulta y configuración
- Step 3: Cómo verificar variables de usuario y sistema en CMD
- Step 4: Edición segura de PATH (precauciones en CMD)
- Step 5: PowerShell ($env:VAR) — Consulta y configuración
- Step 6: Ver valores correctos de usuario y sistema en PowerShell
- Step 7: Configuración persistente mediante PowerShell (.NET API / Recomendado)
- Step 8: Actualizar PATH de forma segura (.NET API / Mejor práctica)
- Step 9: Eliminación de variables
- Step 10: Aplicar y validar configuración
- Step 11: Configurar múltiples variables (usuario y sistema)
- Resumen final
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.
