Adam el Automatizador

Utilizar 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 aprenderás 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 $env: PSDrive. el registro, y la clase .NET. Aprenderás sobre cada método, incluyendo la comprensión del alcance de las variables de entorno en este recorrido paso a paso.

Tabla de contenidos

Supuestos

A lo largo de este artículo, utilizaré Windows PowerShell 5.1 en Windows 10. Pero si tienes cualquier versión de Windows PowerShell posterior a la v3 en Windows 7 SP1 o posterior, las técnicas que voy a mostrarte deberían funcionar perfectamente.

¿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 el cmd.exe y PowerShell.

El uso de variables de entorno le ayuda a evitar la codificación dura de las rutas de los archivos, los nombres de usuario o del equipo y mucho más en sus scripts o módulos de PowerShell.

Variables de entorno comunes

A medida que comience a aprender más sobre cómo trabajar con las variables de entorno en PowerShell, se encontrará con muchas variables diferentes. Algunas son más útiles que otras. A continuación hay una lista de algunas de las variables de entorno más comunes y su uso como referencia.

Variable Uso
ClientName El nombre del ordenador remoto conectado a través de una sesión de Escritorio Remoto.
SessionName Esto ayuda a identificar si la sesión actual de Windows es considerada por el sistema operativo como ejecutada en la consola. Para las sesiones de consola SessionName será ‘Console’. Las conexiones de sesiones mejoradas a máquinas virtuales Hyper-V no informan de SessionName como ‘Console’, mientras que las sesiones estándar sí lo hacen.
Nombre del ordenador El nombre del ordenador. SystemRoot y Windir La ruta de acceso a la instalación actual de Windows.
ArchivosDePrograma y ArchivosDePrograma(x86) Las ubicaciones por defecto para los programas x64 y x86.
ProgramaW6432 La ubicación por defecto para los programas, evitando la redirección a 32/64 bits. Esta variable sólo se aplica a los procesos de 32 bits que se ejecutan en una plataforma de 64 bits. Esto significa que se puede utilizar para identificar cuando una instancia de 32 bits de PowerShell se está ejecutando en un sistema de 64 bits.
UserDNSDomain El nombre de dominio totalmente cualificado del dominio de Active Directory en el que ha iniciado la sesión el usuario actual. Sólo está presente para los inicios de sesión en el dominio.
UserDomain El nombre de estilo NETBIOS del dominio en el que ha iniciado sesión el usuario actual. Puede ser un nombre de ordenador si no hay dominio.
UserDomainRoamingProfile La ubicación de la copia central del perfil de itinerancia para el usuario, si existe. Sólo está presente para los inicios de sesión en el dominio.
UserName El nombre del usuario que ha iniciado la sesión actualmente.
UserProfile La ubicación del perfil del usuario actual en el equipo local.

Ámbitos de las variables de entorno

Hay tres ámbitos de las variables de entorno. Piensa en los ámbitos como capas de variables que se acumulan para dar una imagen total. Combinadas, estas «capas» proporcionan muchas variables de entorno diferentes a cualquier proceso que se ejecute en Windows.

«Jerarquía» de los ámbitos de las variables de entorno

Cada una de estas «capas» se combina o sobrescribe a las demás. Se definen en una jerarquía como: máquina -> usuario -> proceso con cada variable de ámbito sobrescribiendo la variable padre si existe una 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:

Si no hay ninguna TEMP variable de entorno establecida en el ámbito del usuario entonces el resultado final será C:\WINDOWS\TEMP.

Tipos de ámbito de la variable de entorno

Hay tres ámbitos diferentes de la variable de entorno en Windows.

Máquina

Las variables de entorno en el ámbito de la máquina se asocian con la instancia en ejecución de Windows. Cualquier cuenta de usuario puede leerlas, pero para establecerlas, cambiarlas o eliminarlas es necesario hacerlo con privilegios elevados.

Usuario

Las variables de entorno en el ámbito del usuario están asociadas al 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 de ámbito 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 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 son creadas dinámicamente.

  • ALLUSERSPROFILE
  • APPDATA
  • COMPUTERNAME
  • HOMEDRIVE
  • .
  • 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 del usuario y otra para el ámbito de la máquina.

No utilice el registro para gestionar las variables de entorno

Hay un problema cuando se realizan cambios en las variables dentro del registro. Cualquier proceso en ejecución no verá los cambios de las variables en el registro. Los procesos sólo 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 en su lugar. La clase .NET puede modificar las variables de entorno de la máquina y del usuario y manejar el registro por usted.

Modificar las variables de entorno en el registro directamente, aunque es posible, no tiene sentido. La clase .NET ofrece un enfoque más simple, apoyado por Microsoft. Aprenderás a usar la clase .NET más adelante en este artículo.

Ubicación de las variables de entorno en el registro y consulta

Espero que te hayas convencido de no modificar el registro directamente, pero si quieres echar un vistazo a lo que hay allí, puedes encontrar todas las variables de entorno del usuario en la clave HKEY_CURRENT_USER\Environment. Las variables de entorno de máquina se almacenan en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.

Dentro de cualquiera de estas claves se encuentran los valores del 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. Se trata de una pequeña utilidad de línea de comandos incluida con Windows.

Consulte la variable de entorno TEMP como se ve a continuación. Ejecuta REG con el parámetro QUERY para recuperar el valor de la variable TEMP.

> REG QUERY HKCU\Environment /V TEMPHKEY_CURRENT_USER\Environment TEMP REG_EXPAND_SZ %USERPROFILE%\AppData\Local\Temp

A veces verás que las variables de entorno se muestran rodeadas de símbolos de porcentaje (%COMPUTERNAME%) como en el caso anterior. Esta es la forma de la vieja escuela de mostrar las variables de entorno a través de cmd.exe y archivos por lotes. Sabed 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 establecer las variables de entorno de Windows a través de la GUI

Para ver una vista de la GUI de las variables de entorno del usuario y del sistema, ejecute SystemPropertiesAdvanced.exe desde PowerShell, un símbolo del sistema o desde Windows Key+R para mostrar la pestaña System Properties Advanced. Haga clic en el botón EnvironmentVariables, que aparece resaltado en la siguiente imagen.

El cuadro de diálogo Propiedades del sistema, pestaña Avanzadas

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 diálogo se refiere a las variables de alcance de la máquina como variables del Sistema.

El diálogo de Variables de Entorno

Ahora que tienes una comprensión de las variables de entorno, vamos a llegar a lo que estás aquí, ¡a administrarlas con PowerShell!

Hay unas cuantas formas diferentes en las que puedes interactuar con las variables de entorno usando PowerShell.

  • El Env: PSDrive y el Proveedor – basado en la sesión. Sólo establece los valores de las variables de entorno para la sesión actual de PowerShell
  • $env: variables – basadas en la sesión. Sólo establece los valores de las variables de entorno para la sesión actual de PowerShell
  • La clase .NET – permite persistir las variables de entorno del usuario y del sistema a través de las sesiones y los reinicios
    • El Env: PSDrive y Proveedor

      Una de las mejores formas de leer las variables de entorno es un concepto de PowerShell conocido como unidades de PowerShell (unidades PS). Una unidad PS permite tratar las variables de entorno como si fueran un sistema de archivos a través de la unidad Env:.

      Cambiando a la Env: Unidad

      Como todas las unidades PS, se hace referencia a ella mediante rutas como Env:\TEMPEnv:\COMPUTERNAME, etc. Pero para ahorrar algunas pulsaciones, cambie a la unidad Env: como lo haría con cualquier unidad del sistema de archivos, como se muestra a continuación.

PS51> cd Env:PS51 Env:\>## orPS51> Set-Location Env:PS Env:\>

Completar con pestañas la Env: Unidad

Puedes usar los mismos comandos que usarí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:.

Debido a que las variables de entorno se almacenan en una unidad PS, puedes utilizar la función de finalización de pestañas de PowerShell para recorrer las variables disponibles, como se muestra a continuación.

Env: tabulador – encontrando variables de entorno que empiezan por la letra C

Saltemos ahora a un par de ejemplos de cómo se puede utilizar el Env: accionamiento del PS para trabajar con variables de entorno.

Listado de variables de entorno con Env:

PS51> Get-Item -Path Env:PS51> Get-Item -Path Env:USERNAME

Listado de variables de entorno utilizando un comodín con Env:

PS51> Get-Item -Path Env:user*

Encontrar los valores de las variables de entorno con Env:

Los resultados de estos comandos son objetos clave/valor .NET. 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:

PS51> (Get-Item -Path Env:computername).ValueMYCOMPUTERHOSTNAME

En situaciones en las que necesite devolver sólo determinadas variables de entorno, utilice 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, sólo 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 que contiene el valor de la variable de entorno. Este objeto es más sencillo de tratar ya que devuelve sólo el valor, en lugar de un objeto con Name y Value propiedades.

PS51> Get-Content -Path Env:\COMPUTERNAME

Demo: Insertar valores de entorno en una cadena

Usando Get-Content, puedes encontrar el valor de una variable de entorno e insertar la COMPUTERNAME variable de entorno, por ejemplo, en una cadena de texto.

PS51> 'Computer Name is: {0}' -f (Get-Content -Path Env:COMPUTERNAME)Computer Name is: MYCOMPUTER

Configurar una variable de entorno (y crearla) con Env:

Cree nuevas variables de entorno con PowerShell utilizando el cmdlet New-Item. Proporcione el nombre de la variable de entorno en la forma Env:\<EnvVarName> para el valor Name y el valor de la variable de entorno para el parámetro Value como se muestra a continuación.

PS51> New-Item -Path Env:\MYCOMPUTER -Value MY-WIN10-PCName Value---- -----MYCOMPUTER MY-WIN10-PC

Utiliza el cmdlet Set-item para establecer una variable de entorno, o crea una nueva si no existe ya. Puedes ver a continuación que usando el cmdlet Set-Item, puedes tanto crear como modificar una variable de entorno.

PS51> Set-Item -Path Env:testvariable -Value "Alpha"

Copiar una variable de entorno con Env:

A veces se da la situación de que necesitas replicar el valor de una variable de entorno. Para ello se puede utilizar el cmdlet Copy-Item.

Abajo se puede ver que el valor de la variable COMPUTERNAME se copia en MYCOMPUTER, sobrescribiendo su valor existente.

Eliminar una variable de entorno con Env:

Surgirán situaciones en las que una variable de entorno ya no sea necesaria. Puede eliminar las variables de entorno utilizando uno de los tres métodos:

  • Utilice el cmdlet Set-Item para establecer una variable de entorno con un valor vacío
PS51> Set-Item -Path Env:\MYCOMPUTER -Value ''
  • Utilice el cmdlet Remove-Item.
PS51> Remove-Item -Path Env:\MYCOMPUTER
  • Utiliza el cmdlet Clear-Item
    PS51> Clear-Item -Path Env:\MYCOMPUTER

    Cambiar el nombre de una variable de entorno con Env:

    En situaciones en las que es necesario cambiar el nombre de una variable de entorno, tienes la opción de renombrar, en lugar de eliminar y volver a crear con el proveedor Env:.

    Usa el cmdlet Rename-Item para cambiar el nombre de una variable de entorno manteniendo su valor. A continuación puedes ver que la variable MYCOMPUTER es renombrada a OLDCOMPUTER conservando su valor.

    $Env: Variables

    Habiendo dominado el Env: manejo para tratar las variables de entorno como archivos, esta sección te muestra cómo tratarlas como variables. Otra forma de gestionar las variables de entorno en sesión es utilizando el analizador de expresiones de PowerShell. Esta función le permite utilizar el ámbito $Env: para acceder a las variables de entorno.

    Obtención de una variable de entorno con $Env:

    Usando el $Env scope, puedes referenciar variables de entorno directamente sin usar un comando como Get-Item como se muestra a continuación.

    PS51> $env:computername

    Este método facilita la inserción de variables de entorno en cadenas como las que se muestran a continuación:

    Establecimiento o creación de 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 no existe ya una como la de abajo.

    PS51> $env:testvariable = "Alpha"

    Usa la sintaxis += para añadir a un valor existente, en lugar de sobrescribirlo.

    PS51> $env:testvariable = "Alpha"PS51> $env:testvariable += ",Beta"PS51> $env:testvariableAlpha,Beta

    Eliminar una variable de entorno con $Env:

    Para eliminar una variable de entorno usando este método, simplemente establece su valor a una cadena vacía.

    PS51> $env:testvariable = ''

    Usando la clase .NET

    La clase .NET ofrece métodos para obtener y establecer variables de entorno también. Este es el único método para acceder a varios ámbitos de entorno directamente y establecer variables de entorno que sobreviven a través de las sesiones de PowerShell.

    En todos los ejemplos siguientes, si no se proporciona ningún ámbito, se asume el ámbito del proceso.

    Cuando se utiliza el , se utilizan algunos métodos de clase estática de .NET diferentes. No necesitas entender qué es un método estático. Sólo necesitas entender que para usar cualquiera de las técnicas que vas a aprender, tendrás que referenciar primero la clase () seguida de dos dos puntos (::) y después el método.

    Listado de Variables de Entorno con

    Si quieres ver todas las variables de entorno en un ámbito concreto, utilizarás el método GetEnvironmentVariables. Este método devuelve todas las variables de entorno por el ámbito especificado como argumento del método (entre paréntesis).

    Obteniendo Variables de Entorno Individuales con

    Si necesitas encontrar una variable de entorno específica puedes hacerlo de dos maneras diferentes.

    • GetEnvironmentVariables().<var name> – no se recomienda
    • GetEnvironmentVariable('<var name>','<scope>')
      • GetEnvironmentVariables()

        Usando el método GetEnvironmentVariables(), se utiliza la notación de puntos para referenciar el valor. Encierra la clase y la referencia al método estático entre paréntesis, seguido de un punto y luego el nombre de la variable de entorno, como se indica a continuación:

    PS51> (::GetEnvironmentVariables()).APPDATA

    ¡Tenga en cuenta que al hacer referencia a las variables de entorno de esta manera, debe asegurarse de que las mayúsculas coincidan! En el ejemplo anterior, intenta referenciar la variable APPDATA utilizando appdata. Utiliza el GetEnvironmentVariable() en su lugar.

    GetEnvironmentVariable()

    En lugar de usar el método GetEnvironmentVariables(), usa GetEnvironmentVariable() para encontrar variables de entorno individuales. Evita el problema de las mayúsculas y también te permite especificar el ámbito.

    Para utilizar este método, especifica el nombre de la variable de entorno y el ámbito en el que quieres buscar esa variable separados por comas.

    Configuración de una variable de entorno con

    Utiliza el método SetEnvironmentVariable() para establecer el valor de una variable de entorno para el ámbito dado, o crea una nueva si no existe ya.

    Al establecer variables en el ámbito del proceso, verás que el ámbito del proceso es volátil mientras que los cambios en los ámbitos del usuario y de la máquina son permanentes.

    Nota: Llamar al método SetEnvironmentVariable con un nombre o valor de variable de 32767 caracteres o más provocará una excepción.

    Eliminar una variable de entorno con

    Utiliza el método SetEnvironmentVariable() para eliminar una variable de entorno para el ámbito dado estableciendo su valor a una cadena vacía.

    Variables de entorno útiles de PowerShell

    Como 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 de PowerShell específica de la sesión por:

    • Al ejecutar el cmdlet Set-ExecutionPolicy con un parámetro Scope de Process
    • Al ejecutar el ejecutable powershell.exe para iniciar una nueva sesión, utilizando el parámetro de línea de comandos ExecutionPolicy para establecer una política para la sesión.

    PSModulePath

    La variable de entorno PSModulePath contiene la ruta en la que PowerShell busca los módulos si no se especifica una ruta completa. Se forma de forma muy parecida a la variable de entorno estándar PATH, con las rutas de los directorios individuales separadas por un punto y coma.

    PS51> $env:PSModulePathC:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

    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 para almacenar información entre sesiones y reinicios. Ya sea leyendo las variables de entorno del sistema operativo Windows por defecto o creando las tuyas propias, ¡ahora puedes gestionarlas usando una variedad de formas con PowerShell!

    Lectura adicional

    • acerca de_Environment_Variables
    • La clase .NET en Microsoft docs
    • Aprende el formato de cadena de PowerShell y la expansión de cadenas

    .

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *