Variables de entorno de PowerShell: la guía definitiva
Usar PowerShell para configurar variables de entorno de Windows, leer variables de entorno y crear nuevas variables de entorno es fácil una vez que conoce el truco. Los trucos que aprenderá en este artículo funcionarán para las variables de entorno de Windows 10, así como para cualquier cliente/servidor de Windows posterior a Windows 7 SP1/Windows Server 2008.
PowerShell proporciona muchas formas diferentes de interactuar con las variables de entorno de Windows desde $env: PSDrive. el registro y la clase .NET [System.Environment]. Aprenderá sobre cada método, incluido el alcance de las variables de entorno, en este tutorial paso a paso.
Suposiciones
A lo largo de este artículo, usaré Windows PowerShell 5.1 en Windows 10. Pero si tiene alguna versión de Windows PowerShell posterior a la v3 en Windows 7 SP1 o posterior, las técnicas que voy a mostrarle deberían funcionar bien.
¿Qué son las variables de entorno?
Las variables de entorno, como su nombre indica, almacenan información sobre el entorno que utilizan Windows y las aplicaciones. Se puede acceder a las variables de entorno mediante aplicaciones gráficas como el Explorador de Windows y editores de texto sin formato como el Bloc de notas, así como cmd.exe y PowerShell.
El uso de variables de entorno le ayuda a evitar codificar rutas de archivo, nombres de usuario o de computadora y mucho más en sus scripts o módulos de PowerShell.
Variables de entorno comunes
A medida que empiece a aprender más sobre cómo trabajar con variables de entorno en PowerShell, encontrará muchas variables diferentes. Algunos son más útiles que otros. A continuación se muestra una lista de algunas de las variables de entorno comunes y su uso como referencia.
- ClientName
El nombre de la computadora remota conectada a través de una sesión de Escritorio remoto.
- SessionName
Esto ayuda a identificar si el sistema operativo considera que la sesión actual de Windows se está ejecutando en la consola. Para sesiones de consola, el nombre de sesión será "Consola". Las conexiones de sesión mejorada a máquinas virtuales Hyper-V no informan el nombre de sesión como "Consola", mientras que las sesiones estándar sí lo hacen.
- ComputerName
El nombre de la computadora.
- SystemRoot and Windir
La ruta a la instalación actual de Windows.
- ProgramFiles and ProgramFiles(x86)
Las ubicaciones predeterminadas para programas x64 y x86.
- ProgramW6432
La ubicación predeterminada para los programas, evitando la redirección de 32/64 bits. Esta variable solo se aplica a procesos de 32 bits que se ejecutan en una plataforma de 64 bits. Esto significa que puede usarlo para identificar cuándo se está ejecutando una instancia de PowerShell de 32 bits en un sistema de 64 bits.
- UserDNSDomain
El nombre de dominio completo del dominio de Active Directory en el que inició sesión el usuario actual. Sólo presente para inicios de sesión de dominio.
- UserDomain
El nombre estilo NETBIOS del dominio en el que inició sesión el usuario actual. Puede ser el nombre de una computadora si no hay dominio.
- UserDomainRoamingProfile
La ubicación de la copia central del perfil móvil del usuario, si la hubiera. Sólo presente para inicios de sesión de dominio.
- UserName
-
El nombre del usuario que ha iniciado sesión actualmente.
- UserProfile
La ubicación del perfil del usuario actual en la computadora local.
Alcances de variables de entorno
Hay tres alcances de variables de entorno. Piense en los ámbitos como capas de variables que se acumulan para brindar una imagen total. Combinadas, estas "capas" proporcionan muchas variables de entorno diferentes para cualquier proceso en ejecución en Windows.
Alcance de la variable de entorno “Jerarquía”
Cada una de estas "capas" se combina o se sobrescribe entre sí. Se definen en una jerarquía como: máquina -> usuario -> proceso con cada variable de ámbito sobrescribiendo la variable principal si existe una en la principal. alcance.
Por ejemplo, una variable de entorno común es TEMP. Esta variable almacena la ruta de la carpeta a la carpeta temporal local de Windows. Esta variable de entorno está configurada en:
C:\WINDOWS\TEMPen el ámbito máquinaC:\Users\en el ámbito usuario\AppData\Local\Temp C:\Users\en el alcance del proceso.\AppData\Local\Temp
Si no hay una variable de entorno TEMP establecida en el alcance user, el resultado final será C:\WINDOWS\TEMP.
Tipos de alcance de variables de entorno
Hay tres ámbitos de variables de entorno diferentes 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 leerlos, pero configurarlos, cambiarlos o eliminarlos debe realizarse con privilegios elevados.
Usuario
Las variables de entorno en el alcance usuario están asociadas con el usuario que ejecuta el proceso actual. Las variables de usuario sobrescriben las variables de ámbito máquina que tienen el mismo nombre.
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 alcance proceso son una combinación de los alcances máquina y usuario, junto con algunas variables que Windows crea dinámicamente.
A continuación se muestra una lista de variables de entorno disponibles para un proceso en ejecución. Todas estas variables se crean dinámicamente.
ALLUSERSPROFILEAPPDATACOMPUTERNAMEHOMEDRIVEHOMEPATHLOCALAPPDATALOGONSERVERPROMPTPUBLICSESSIONSystemDriveSystemRootUSERDNSDOMAINUSERDOMAINUSERDOMAIN_ROAMINGPROFILEUSERNAMEUSERPROFILEVariables de entorno en el registro
Las variables de entorno se almacenan en dos ubicaciones de registro, una para el ámbito del usuario y otra para el ámbito de la máquina.
No utilice el registro para gestionar variables de entorno
Hay un problema al realizar cambios en las variables dentro del registro. Cualquier proceso en ejecución no verá cambios variables en el 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 el registro directamente, puede utilizar una clase .NET. La clase .NET [System.Environment] puede modificar variables de entorno de ámbito de máquina y de usuario-y manejar la limpieza del registro por usted.
Modificar las variables de entorno en el registro directamente, si bien es posible, no tiene sentido. La clase .NET ofrece un enfoque más sencillo, compatible con Microsoft. Aprenderá a utilizar la clase .NET [System.Environment] más adelante en este artículo.
Ubicaciones y consultas del registro de variables de entorno
Espero que se haya convencido de no modificar el registro directamente, pero si desea echar un vistazo a lo que contiene, puede encontrar todas las variables de entorno del usuario en la clave HKEY_CURRENT_USER\Environment. Las variables de entorno de ámbito de máquina se almacenan en 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 integradas 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 ve a continuación. Ejecute REG con el parámetro QUERY para recuperar el valor de la variable TEMP.
> REG QUERY HKCU\Environment /V TEMP
HKEY_CURRENT_USER\Environment
TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\TempA veces notarás que las variables de entorno se muestran rodeadas de símbolos de porcentaje (
%COMPUTERNAME%) como arriba. Esta es la forma antigua de mostrar variables de entorno a través de cmd.exe y archivos por lotes. Sepa 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 prefiere usar PowerShell para recuperar el valor del registro, puede hacerlo usando el cmdlet Get-Item como se muestra a continuación.
PS51> Get-ItemProperty -Path HKCU:\Environment -Name TEMP
TEMP : C:\Users\<your username>\AppData\Local\Temp
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Environment
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
PSChildName : Environment
PSDrive : HKCU
PSProvider : Microsoft.PowerShell.Core\RegistryVer y configurar variables de entorno de Windows a través de la GUI
Para ver una vista GUI de las variables de entorno del sistema y del usuario, ejecute SystemPropertiesAdvanced.exe desde PowerShell, un símbolo del sistema o desde la tecla Windows + R para mostrar la pestaña Propiedades avanzadas del sistema. . Haga clic en el botón EnvironmentVariables, que está resaltado en la imagen a continuación.
El cuadro de diálogo Variables de entorno, que se muestra a continuación, le permite ver, crear y modificar variables de entorno de usuario y de máquina. Tenga en cuenta que el cuadro de diálogo se refiere a las variables de ámbito automático como variables de sistema.
Ahora que comprende las variables de entorno, vayamos a lo que está aquí: ¡administrarlas con PowerShell!
Hay algunas formas diferentes de interactuar con las variables de entorno mediante PowerShell.
- El
Env:PSDrive y Proveedor - basado en sesiones. Solo establece los valores de las variables de entorno para la sesión actual de PowerShell $env:variables - basado en sesión. Solo establece los valores de las variables de entorno para la sesión actual de PowerShell- La clase .NET
[System.Environment]: le permite conservar las variables de entorno del usuario y del sistema entre sesiones y reinicios.
El Env: PSDrive y proveedor
Una de las mejores formas de leer variables de entorno es un concepto de PowerShell conocido como unidades PowerShell (unidades PS). Una unidad PS le permite tratar las variables de entorno como si fueran un sistema de archivos a través de la unidad Env:.
Cambiar a la unidad Env:
Como todas las unidades PS, puede hacer referencia a ella a través de rutas como Env:\TEMP, Env:\COMPUTERNAME, etc. Pero para ahorrar algunas pulsaciones de teclas, cambie a Env. : unidad tal como lo haría con cualquier unidad de sistema de archivos, como se muestra a continuación.
PS51> cd Env:
PS51 Env:\>
## or
PS51> Set-Location Env:
PS Env:\>Completar tabulación con la unidad Env:
Puede utilizar los mismos comandos que utilizaría 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:.
Debido a que las variables de entorno se almacenan en una unidad PS, puede usar la función de finalización de pestañas de PowerShell para recorrer las variables disponibles, como se muestra a continuación.
Veamos ahora un par de ejemplos de cómo puede utilizar la unidad Env: PS para trabajar con variables de entorno.
Listado de variables de entorno con Env:
PS51> Get-Item -Path Env:
PS51> Get-Item -Path Env:USERNAMEListado de variables de entorno utilizando un comodín con Env:
PS51> Get-Item -Path Env:user*Encontrar valores de variables de entorno con Env:
Los resultados de estos comandos son objetos clave/valor [System.Collections.DictionaryEntry] .NET. Estos objetos contienen el nombre de la variable de entorno en la propiedad Name y el valor en la propiedad Value.
Puede 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:
PS51> (Get-Item -Path Env:computername).Value
MYCOMPUTERHOSTNAMEEn situaciones en las que solo necesita devolver determinadas variables de entorno, utilice cmdlets estándar de PowerShell como Select-Object y Where-Object para seleccionar y filtrar los objetos devueltos por Env: proveedor.
En el siguiente ejemplo, solo se devuelve la variable de entorno COMPUTERNAME.
PS51> Get-ChildItem -Path Env: | Where-Object -Property Name -eq 'COMPUTERNAME'Como método alternativo, utilice 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 devuelve solo el valor, en lugar de un objeto con las propiedades Name y Value.
PS51> Get-Content -Path Env:\COMPUTERNAMEDemostración: inserción de valores de entorno en una cadena
Usando Get-Content, puede encontrar el valor de una variable de entorno e insertar la variable de entorno COMPUTERNAME, por ejemplo, en una cadena de texto.
PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)
Computer Name is: MYCOMPUTEREstablecer una variable de entorno (y crear) con Env:
Cree nuevas variables de entorno con PowerShell utilizando el cmdlet New-Item. Proporcione el nombre de la variable de entorno en el formato Env:\ para el valor Name y el valor de la variable de entorno para Value parámetro como se muestra a continuación.
PS51> New-Item -Path Env:\MYCOMPUTER -Value MY-WIN10-PC
Name Value
---- -----
MYCOMPUTER MY-WIN10-PCUtilice el cmdlet Set-item para establecer una variable de entorno o cree una nueva si aún no existe. Puede ver a continuación usando el cmdlet Set-Item, puede crear o modificar una variable de entorno.
PS51> Set-Item -Path Env:testvariable -Value "Alpha"Copiar 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 a MYCOMPUTER, sobrescribiendo su valor existente.
PS51> Get-Item -Path Env:\MYCOMPUTER
Name Value
---- -----
MYCOMPUTER MY-WIN10-PC
PS51> Copy-Item -Path Env:\COMPUTERNAME -Destination Env:\MYCOMPUTER
PS51> Get-Item -Path Env:\MYCOMPUTER
Name Value
---- -----
MYCOMPUTER WIN10-1903Eliminar una variable de entorno con Env:
Surgirán situaciones en las que ya no se necesita una variable de entorno. Puede eliminar variables de entorno utilizando uno de tres métodos:
- Utilice el cmdlet
Set-Itempara establecer una variable de entorno en un valor vacío
PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''- Utilice el cmdlet
Remove-Item.
PS51> Remove-Item -Path Env:\MYCOMPUTER- Utilice el cmdlet
Clear-Item.
PS51> Clear-Item -Path Env:\MYCOMPUTERCambiar el nombre de una variable de entorno con Env:
En situaciones en las que es necesario cambiar el nombre de una variable de entorno, tiene la opción de cambiarle el nombre, en lugar de eliminarlo y volver a crearlo 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 cambia de nombre a OLDCOMPUTER conservando su valor.
PS51> Rename-Item -Path Env:\MYCOMPUTER -NewName OLDCOMPUTER
PS51> Get-Item -Path OLDCOMPUTER
Name Value
---- -----
OLDCOMPUTER WIN10-1903$Env: Variables
Habiendo 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 durante la sesión es mediante el analizador de expresiones de PowerShell. Esta característica le permite utilizar el alcance $Env: para acceder a las variables de entorno.
Obtener una variable de entorno con $Env:
Usando el alcance $Env, puede hacer referencia a variables de entorno directamente sin usar un comando como Get-Item como se muestra a continuación.
PS51> $env:computernameEste método facilita la inserción de variables de entorno en cadenas como se muestra a continuación:
PS51> "The Computer Name is {0}" -f $env:computername
The Computer Name is WIN10-1809
PS51> "The Computer Name is $env:computername"
The Computer Name is WIN10-1809Establecer o crear una variable de entorno con $Env:
Configurar una variable de entorno usando este método es sencillo. Esto también creará una nueva variable de entorno si aún no existe una como se muestra a continuación.
PS51> $env:testvariable = "Alpha"Utilice la sintaxis += para agregar un valor existente, en lugar de sobrescribirlo.
PS51> $env:testvariable = "Alpha"
PS51> $env:testvariable += ",Beta"
PS51> $env:testvariable
Alpha,BetaEliminar una variable de entorno con $Env:
Para eliminar una variable de entorno usando este método, simplemente establezca su valor en una cadena vacía.
PS51> $env:testvariable = ''Usando la clase .NET [System.Environment]
La clase .NET [System.Environment] también ofrece métodos para obtener y configurar variables de entorno. Este es el único método para acceder directamente a varios ámbitos del entorno y establecer variables de entorno que sobrevivan en las sesiones de PowerShell.
En todos los ejemplos siguientes, si no se proporciona ningún alcance, se asume el alcance del proceso.
Al utilizar [System.Environment], utilizará algunos métodos de clase estática .NET diferentes. No es necesario que comprenda qué es un método estático. Solo necesita comprender para utilizar cualquiera de las técnicas que está a punto de aprender, primero deberá hacer referencia a la clase ([System.Environment]) seguida de dos dos puntos (: :) seguido del método.
Listado de variables de entorno con [System.Environment]
Si desea ver todas las variables de entorno en un ámbito particular, utilizará el método GetEnvironmentVariables. Este método devuelve todas las variables de entorno según el alcance especificado como argumento del método (entre paréntesis).
PS51> [System.Environment]::GetEnvironmentVariables('User')
PS51> [System.Environment]::GetEnvironmentVariables('Machine')
PS51> [System.Environment]::GetEnvironmentVariables('Process')
# The same as Process
PS51> [System.Environment]::GetEnvironmentVariables()Obtener variables de entorno únicas con [System.Environment]
Si necesita encontrar una variable de entorno específica, puede hacerlo de dos maneras diferentes.
GetEnvironmentVariables().- no recomendado
GetEnvironmentVariable('<var name>','<scope>')GetEnvironmentVariables()
Al utilizar el método GetEnvironmentVariables(), se utiliza la notación de puntos para hacer referencia al valor. Encierre la clase [System.Environment] y la referencia del método estático entre paréntesis seguido de un punto y luego el nombre de la variable de entorno como se muestra a continuación:
PS51> ([System.Environment]::GetEnvironmentVariables()).APPDATATenga en cuenta que al hacer referencia a variables de entorno de esta manera, debe asegurarse de que coincidan las mayúsculas. En el ejemplo anterior, intente hacer referencia a la variable
APPDATAusandoappdata. UtiliceGetEnvironmentVariable()en su lugar.
GetEnvironmentVariable()
En lugar de utilizar el método GetEnvironmentVariables(), utilice GetEnvironmentVariable() para buscar variables de entorno únicas. Soluciona el problema de las mayúsculas y también le permite especificar el alcance.
Para utilizar este método, especifique el nombre de la variable de entorno y el alcance en el que le gustaría buscar esa variable separados por coma.
PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','User')
# Blank
PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','Machine')
# Blank
PS51> [System.Environment]::GetEnvironmentVariable('ComputerName','Process') WIN10-1903
# The same as Process
PS51> [System.Environment]::GetEnvironmentVariable('ComputerName')
WIN10-1903Establecer una variable de entorno con [System.Environment]
Utilice el método SetEnvironmentVariable() para establecer el valor de una variable de entorno para el alcance dado, o cree una nueva si aún no existe.
Al configurar variables en el alcance del proceso, encontrará que el alcance del proceso es volátil mientras que los cambios en los alcances del usuario y de la máquina son permanentes.
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','User')
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','Process')
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha','Machine')
# The same as Process
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable','Alpha')Nota: Llamar al método SetEnvironmentVariable con un nombre de variable o un valor de 32767 caracteres o más provocará que se genere una excepción.
Eliminar una variable de entorno con [System.Environment]
Utilice el método SetEnvironmentVariable() para eliminar una variable de entorno para el alcance dado estableciendo su valor en una cadena vacía.
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'User')
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'Process')
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '', 'Machine')
# The same as process
PS51> [System.Environment]::SetEnvironmentVariable('TestVariable', '')Variables de entorno útiles de PowerShell
Como muchas otras aplicaciones de Windows, PowerShell tiene algunas variables de entorno propias. Dos variables de entorno útiles que debe conocer son PSExecutionPolicyPreference y PSModulePath.
PSExecutionPolicyPreference
La variable de entorno PSExecutionPolicyPreference almacena la política de ejecución de PowerShell actual. Se crea si una política de ejecución de PowerShell específica de la sesión se establece mediante:
- Ejecutar el cmdlet
Set-ExecutionPolicycon un parámetroScopedeProcess - Ejecutar el ejecutable
powershell.exepara iniciar una nueva sesión, utilizando el parámetro de línea de comandoExecutionPolicypara 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 especifica una ruta completa. Tiene una forma muy parecida a la variable de entorno estándar PATH, con rutas de directorio individuales separadas por un punto y coma.
PS51> $env:PSModulePath
C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\ModulesConsejo rápido: divida 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 simplemente esté leyendo las variables de entorno predeterminadas del sistema operativo Windows y creando las suyas propias, ahora puede administrarlas de diversas maneras con PowerShell.
Otras lecturas
- acerca de las variables_ambientales
- La clase .NET [System.Environment] en Microsoft docs
- Aprenda el formato de cadena de PowerShell y las cadenas expandidas
