Usar PowerShell para establecer variables de entorno de Windows, leer variables de entorno y crear nuevas variables de entorno es fácil una vez que conoces el truco. Los trucos que aprendas en este artículo funcionarán para las variables de entorno de Windows 10, así como para cualquier cliente/servidor de Windows después de Windows 7 SP1/Windows Server 2008.
PowerShell proporciona muchas formas diferentes de interactuar con las variables de entorno de Windows desde el PSDrive $env:
, el registro y la clase .NET [System.Environment]
. Aprenderás sobre cada método, incluido el entendimiento del alcance de las variables de entorno, en este recorrido paso a paso.
Suposiciones
A lo largo de este artículo, estaré usando Windows PowerShell 5.1 en Windows 10. Pero si tienes alguna versión de Windows PowerShell posterior a la v3 en Windows 7 SP1 o posterior, las técnicas que estoy a punto de mostrarte deberían funcionar perfectamente bien.
¿Qué son las Variables de Entorno?
Las variables de entorno, como sugiere el nombre, almacenan información sobre el entorno que es utilizada por Windows y las aplicaciones. Las variables de entorno pueden ser accedidas por aplicaciones gráficas como el Explorador de Windows y editores de texto plano como Notepad, así como por cmd.exe y PowerShell.
Usar variables de entorno te ayuda a evitar la codificación de rutas de archivos, nombres de usuario o computadoras y mucho más en tus scripts o módulos de PowerShell.
Variables de Entorno Comunes
Al comenzar a aprender más sobre cómo trabajar con variables de entorno en PowerShell, te encontrarás con muchas variables diferentes. Algunas son más útiles que otras. A continuación, se muestra una lista de algunas de las variables de entorno comunes y su uso como referencia.
Variable | Usage |
---|---|
ClientName | The name of the remote computer connected via a Remote Desktop session. |
SessionName | This helps to identify if the current Windows session is regarded by the operating system as running at the console. For console sessions SessionName will be ‘Console’. Enhanced Session connections to Hyper-V Virtual Machines do not report SessionName as ‘Console’, whereas Standard Sessions do. |
ComputerName | The name of the computer. |
SystemRoot and Windir | The path to the current Windows installation. |
ProgramFiles and ProgramFiles(x86) | The default locations for x64 and x86 programs. |
ProgramW6432 | The default location for programs, avoiding 32/64 bit redirection. This variable only applies for 32 bit processes running on a 64 bit platform. This means that you can use it to identify when a 32 bit instance of PowerShell is running on a 64 bit system. |
UserDNSDomain | The Fully Qualified Domain Name of the Active Directory domain that the current user logged on to. Only present for domain logons. |
UserDomain | The NETBIOS-style name of the domain that the current user logged on to. Can be a computer name if there’s no domain. |
UserDomainRoamingProfile | The location of the central copy of the roaming profile for the user, if any. Only present for domain logons. |
UserName | The name of the currently logged on user. |
UserProfile | The location of the profile of the current user on the local computer. |
Ámbitos de Variables de Entorno
Existen tres ámbitos de variables de entorno. Piensa en los ámbitos como capas de variables que se acumulan para dar una imagen completa. Combinados, estos “niveles” proporcionan muchas variables de entorno diferentes a cualquier proceso en ejecución en Windows.
Jerarquía de Ámbitos de Variables de Entorno
Cada uno de estos “niveles” combina u sobrescribe a los demás. Se definen en una jerarquía como: máquina –> usuario –> proceso, con cada variable de ámbito sobrescribiendo a la variable padre si existe en el ámbito padre.
Por ejemplo, una variable de entorno común es TEMP
. Esta variable almacena la ruta de la carpeta temporal local de Windows. Esta variable de entorno se establece en:
C:\WINDOWS\TEMP
in the machine scopeC:\Users\<username>\AppData\Local\Temp
in the user scopeC:\Users\<username>\AppData\Local\Temp
in the process scope.
Si no hay una variable de entorno TEMP
establecida en el ámbito usuario, entonces el resultado final será C:\WINDOWS\TEMP
.
Tipos de Ámbitos de Variables de Entorno
Existen tres tipos diferentes de ámbitos de variables de entorno en Windows.
Máquina
Las variables de entorno en el ámbito máquina están asociadas con la instancia en ejecución de Windows. Cualquier cuenta de usuario puede leerlas, pero establecer, cambiar o eliminarlas debe hacerse con privilegios elevados.
Usuario
Variables de entorno en el ámbito del usuario están asociadas con el usuario que ejecuta el proceso actual. Las variables de usuario sobrescriben las variables con el mismo nombre en el ámbito de la máquina.
Nota: Microsoft recomienda que los valores de las variables de entorno con ámbito de máquina y usuario no contengan más de 2048 caracteres.
Proceso
Las variables de entorno en el ámbito del proceso son una combinación de los ámbitos de la máquina y del usuario, junto con algunas variables que Windows crea dinámicamente.
A continuación se presenta una lista de variables de entorno disponibles para un proceso en ejecución. Todas estas variables se crean dinámicamente.
ALLUSERSPROFILE
APPDATA
COMPUTERNAME
HOMEDRIVE
HOMEPATH
LOCALAPPDATA
LOGONSERVER
PROMPT
PUBLIC
SESSION
SystemDrive
SystemRoot
USERDNSDOMAIN
USERDOMAIN
USERDOMAIN_ROAMINGPROFILE
USERNAME
USERPROFILE
Variables de entorno en el Registro
Las variables de entorno se almacenan en dos ubicaciones del registro, una para el ámbito de usuario y otra para el ámbito de la máquina.
No utilice el Registro para gestionar variables de entorno
Hay un inconveniente al realizar cambios en variables dentro del registro. Los procesos en ejecución no verán cambios en las variables del registro. Los procesos solo ven las variables y valores del registro que estaban presentes cuando se inició el proceso, a menos que Windows les notifique que ha habido un cambio.
En lugar de modificar directamente el registro, puede utilizar una clase .NET en su lugar. La clase .NET [System.Environment]
puede modificar variables de entorno con ámbito de máquina y usuario y encargarse del mantenimiento del registro por usted. En lugar de modificar directamente el registro, puede utilizar una clase .NET en su lugar. La clase .NET [System.Environment]
puede modificar variables de entorno con ámbito de máquina y usuario y encargarse del mantenimiento del registro por usted.
Modificar variables de entorno en el registro directamente, aunque es posible, no tiene sentido. La clase .NET ofrece un enfoque más sencillo respaldado por Microsoft. Aprenderá a usar la clase [System.Environment]
.NET más adelante en este artículo.
Ubicaciones del Registro de Variables de Entorno y Consulta
I hope you’ve been convinced to not modify the registry directly but if you’d like to take a peek at what’s in there, you can find all user environment variables in the HKEY_CURRENT_USER\Environment
key. Machine-scoped environment variables are stored at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
Dentro de cualquiera de estas claves se encuentran valores de registro de tipo REG_SZ
o REG_EXPAND_SZ
. Los valores REG_EXPAND_SZ
contienen variables de entorno incrustadas como parte de su valor. Estas variables de entorno se expanden cuando se recupera el valor.
Para demostrar esto, utilice la utilidad REG
. Esta es una pequeña utilidad de línea de comandos incluida con Windows.
Consulta la variable de entorno TEMP
como se muestra a continuación. Ejecuta REG
con el parámetro QUERY
para recuperar el valor de la variable TEMP
.
A veces notarás que las variables de entorno se muestran rodeadas de símbolos de porcentaje (
%COMPUTERNAME%
) como se muestra arriba. Esta es la forma antigua de mostrar variables de entorno a través de cmd.exe y archivos batch. Ten en cuenta que PowerShell no reconoce este formato.
La utilidad REG
nos permite ver el valor nativo del valor del registro. El tipo de valor es REG_EXPAND_SZ
y el valor contiene la variable de entorno %USERPROFILE%
.
Si prefieres usar PowerShell para recuperar el valor del registro, puedes hacerlo usando el cmdlet Get-Item
como se muestra a continuación.
Ver y configurar variables de entorno de Windows a través de la GUI
Para ver una vista GUI de las variables de entorno del usuario y del sistema, ejecuta SystemPropertiesAdvanced.exe desde PowerShell, un símbolo del sistema o desde Windows Key+R para mostrar la pestaña Propiedades del sistema avanzadas. Haz clic en el botón Variables de entorno, que está resaltado en la imagen a continuación.

El diálogo Variables de entorno, mostrado a continuación, te permite ver, crear y modificar variables de entorno de alcance de usuario y de máquina. Ten en cuenta que el diálogo se refiere a las variables de ámbito de máquina como Variables de sistema.

Ahora que tienes una comprensión de las variables de entorno, ¡vamos a lo que viniste aquí, administrarlas con PowerShell!
Hay algunas formas diferentes de interactuar con las variables de entorno usando PowerShell.
- La unidad y el proveedor
Env:
– basado en sesiones. Solo establece los valores de las variables de entorno para la sesión actual de PowerShell - Variables
$env:
– basado en sesiones. Solo establece los valores de las variables de entorno para la sesión actual de PowerShell - La Clase .NET
[System.Environment]
– te permite persistir las variables de entorno con alcance de usuario y sistema entre sesiones y reinicios
La unidad y el proveedor Env:
Una de las mejores maneras de leer variables de entorno es un concepto de PowerShell conocido como unidades de PowerShell (PS drives). Una unidad PS te permite tratar las variables de entorno como si fueran un sistema de archivos a través de la unidad Env:
.
Cambiando a la unidad Env:
Como todas las unidades PS, la referencias mediante rutas como Env:\TEMP
, Env:\COMPUTERNAME
, etc. Pero para ahorrar algunos golpes de tecla, cambia a la unidad Env:
como lo harías con cualquier unidad de sistema de archivos, como se muestra a continuación.
Completar con tabulación con la unidad Env:
Puedes usar los mismos comandos que utilizarías para acceder a un sistema de archivos, como Get-Item
y Get-ChildItem
para acceder a las variables de entorno. Pero en lugar del sistema de archivos, estás leyendo la unidad Env:
.
Como las variables de entorno se almacenan en una unidad PS, puedes usar la función de autocompletado de pestañas de PowerShell para recorrer las variables disponibles, como se muestra a continuación.

Ahora, veamos un par de ejemplos de cómo puedes usar la unidad Env:
de PS para trabajar con variables de entorno.
Enumeración de Variables de Entorno con Env:
Enumeración de Variables de Entorno Usando un Comodín con Env:
Buscar Valores de Variables de Entorno con Env:
Los resultados de estos comandos son objetos .NET de tipo clave/valor [System.Collections.DictionaryEntry]
. Estos objetos contienen el nombre de la variable de entorno en la propiedad Name
y el valor en la propiedad Value
.
Puedes acceder a un valor específico de una variable de entorno envolviendo la referencia del comando Get-Item
entre paréntesis y haciendo referencia a la propiedad Value
, como se muestra a continuación:
En situaciones en las que necesitas devolver solo ciertas variables de entorno, utiliza cmdlets estándar de PowerShell como Select-Object
y Where-Object
para seleccionar y filtrar los objetos devueltos por el proveedor Env:
.
En el siguiente ejemplo, solo se devuelve la variable de entorno COMPUTERNAME
.
Como método alternativo, utiliza el cmdlet Get-Content
. Este cmdlet devuelve un objeto [String]
que contiene el valor de la variable de entorno. Este objeto es más sencillo de manejar ya que solo devuelve el valor, en lugar de un objeto con las propiedades Name
y Value
.
**Demo:** Inserción de valores de entorno en una cadena
Usando Get-Content
, puedes encontrar el valor de una variable de entorno e insertar, por ejemplo, la variable de entorno COMPUTERNAME
en una cadena de texto.
Establecer una variable de entorno (y crearla) con Env:
Crea nuevas variables de entorno con PowerShell utilizando el cmdlet New-Item
. Proporciona el nombre de la variable de entorno en la forma Env:\<EnvVarName>
para el valor de Name
y el valor de la variable de entorno para el parámetro Value
, como se muestra a continuación.
Utilice el cmdlet Set-item
para establecer una variable de entorno, o crear una nueva si aún no existe. A continuación, puede ver cómo con el cmdlet Set-Item
, puede tanto crear como modificar una variable de entorno.
Copiando una variable de entorno con Env:
A veces surge la situación en la que necesita replicar el valor de una variable de entorno. Puede hacerlo utilizando el cmdlet Copy-Item
.
A continuación, puede ver que el valor de la variable COMPUTERNAME
se copia en MYCOMPUTER
, sobrescribiendo su valor existente.
Eliminando una variable de entorno con Env:
Surgen situaciones en las que una variable de entorno ya no es necesaria. Puede eliminar variables de entorno utilizando uno de tres métodos:
- Utilice el cmdlet
Set-Item
para establecer una variable de entorno con un valor vacío
- Utilice el cmdlet
Remove-Item
.
- Utilice el cmdlet
Clear-Item
.
Renombrando una variable de entorno con Env:
En situaciones en las que necesita cambiar el nombre de una variable de entorno, tiene la opción de renombrarla en lugar de eliminarla y recrearla con el proveedor Env:
.
Utilice el cmdlet Rename-Item
para cambiar el nombre de una variable de entorno manteniendo su valor. A continuación, puede ver que la variable MYCOMPUTER
se renombra a OLDCOMPUTER
manteniendo su valor.
$Env:
Variables
Una vez que haya dominado la unidad Env:
para tratar las variables de entorno como archivos, esta sección le muestra cómo tratarlas como variables. Otra forma de administrar las variables de entorno en la sesión es utilizando el Analizador de Expresiones de PowerShell. Esta característica le permite utilizar el ámbito $Env:
para acceder a las variables de entorno.
Obtener una variable de entorno con $Env:
Utilizando el ámbito $Env
, puede hacer referencia a las variables de entorno directamente sin utilizar un comando como Get-Item
como se muestra a continuación.
Este método facilita la inserción de variables de entorno en cadenas como se muestra a continuación:
Establecer o crear una variable de entorno con $Env:
Establecer una variable de entorno utilizando este método es sencillo. Esto también creará una nueva variable de entorno si aún no existe como se muestra a continuación.
Utilice la sintaxis +=
para agregar a un valor existente en lugar de sobrescribirlo.
Eliminar una variable de entorno con $Env:
Para eliminar una variable de entorno utilizando este método, simplemente establezca su valor en una cadena vacía.
Usando la clase .NET [System.Environment]
La clase .NET [System.Environment]
ofrece métodos para obtener y establecer variables de entorno también. Este es el único método para acceder directamente a varios ámbitos de entorno y establecer variables de entorno que sobreviven entre sesiones de PowerShell.
En todos los ejemplos siguientes, si no se proporciona un ámbito, se asume el ámbito del proceso.
Cuando usas la clase [System.Environment]
, usarás algunos métodos de la clase estática .NET.. No necesitas entender qué es un método estático. Solo necesitas entender que para usar cualquiera de las técnicas que estás a punto de aprender, primero necesitarás hacer referencia a la clase ([System.Environment]
), seguida de dos dos puntos (::
) y luego seguida del método.
Listado de Variables de Entorno con [System.Environment]
Si deseas ver todas las variables de entorno en un ámbito particular, usarías el método GetEnvironmentVariables
. Este método devuelve todas las variables de entorno según el ámbito especificado como argumento del método (entre paréntesis).
Obtención de Variables de Entorno Individuales con [System.Environment]
Si necesitas encontrar una variable de entorno específica, puedes hacerlo de dos formas diferentes.
GetEnvironmentVariables().<nombre de variable>
– no recomendadoGetEnvironmentVariable('<nombre de var>','<ámbito>')
GetEnvironmentVariables()
Usando el método GetEnvironmentVariables()
, se utiliza la notación de punto para hacer referencia al valor. Encierra la referencia de la clase y el método estático [System.Environment]
en paréntesis seguido de un punto y luego el nombre de la variable de entorno como se muestra a continuación:
Ten en cuenta que al hacer referencia a variables de entorno de esta manera, ¡debes asegurarte de que coincida la capitalización! En el ejemplo anterior, intenta hacer referencia a la variable
APPDATA
usandoappdata
. Utiliza en su lugarGetEnvironmentVariable()
.
GetEnvironmentVariable()
En lugar de utilizar el método GetEnvironmentVariables()
, utiliza GetEnvironmentVariable()
para buscar variables de entorno individuales. Esto resuelve el problema de la capitalización y también te permite especificar el ámbito.
Para usar este método, especifica el nombre de la variable de entorno y el ámbito en el que deseas buscar esa variable separados por una coma.
Establecer una variable de entorno con [System.Environment]
Utiliza el método SetEnvironmentVariable()
para establecer el valor de una variable de entorno para el ámbito dado, o crear una nueva si aún no existe.
Cuando se establecen variables en el ámbito del proceso, notarás que este ámbito es volátil, mientras que los cambios en los ámbitos de usuario y máquina son permanentes.
Nota: Llamar al método SetEnvironmentVariable con un nombre de variable o valor de 32767 caracteres o más provocará que se lance una excepción.
Eliminar una variable de entorno con [System.Environment]
Utiliza el método SetEnvironmentVariable()
para eliminar una variable de entorno para el ámbito dado estableciendo su valor como una cadena vacía.
Variables de entorno útiles en PowerShell
Al igual que muchas otras aplicaciones de Windows, PowerShell tiene algunas variables de entorno propias. Dos variables de entorno útiles para conocer son PSExecutionPolicyPreference
y PSModulePath
.
PSExecutionPolicyPreference
La variable de entorno PSExecutionPolicyPreference
almacena la política de ejecución actual de PowerShell. Se crea si se establece una política de ejecución específica de la sesión mediante:
- Ejecutar el cmdlet
Set-ExecutionPolicy
con un parámetroScope
deProcess
. - Ejecutar el ejecutable
powershell.exe
para iniciar una nueva sesión, utilizando el parámetro de línea de comandosExecutionPolicy
para establecer una política para la sesión.
PSModulePath
La variable de entorno PSModulePath
contiene la ruta que PowerShell busca para los módulos si no especificas una ruta completa. Se forma de manera similar a la variable de entorno estándar PATH
, con rutas de directorio individuales separadas por un punto y coma.
Consejo rápido: Divide cada carpeta para obtener una matriz de cadenas para procesar cada ruta individualmente usando $env:PSModulePath.split(‘;’)
Resumen
Las variables de entorno son un método útil para obtener información sobre un sistema en ejecución o almacenar información entre sesiones y reinicios. Ya sea que estés leyendo las variables de entorno predeterminadas del sistema operativo Windows y creando las tuyas propias, ¡ahora puedes gestionarlas usando una variedad de formas con PowerShell!
Lecturas adicionales
- about_Environment_Variables
- La Clase .NET [System.Environment] en la documentación de Microsoft
- Aprende el formato de cadena de PowerShell y la expansión de cadenas
Source:
https://adamtheautomator.com/powershell-environment-variables/