Acerca de las variables de entorno
- 09/22/2020
- 8 minutos de lectura
-
- S
- r
- s
- d
- c
-
+1
.
CORTA DESCRIPCIÓN
Describe cómo acceder a las variables de entorno de Windows en PowerShell.
DESCRIPCIÓN LARGA
Las variables de entorno almacenan información sobre el entorno del sistema operativo. Esta información incluye detalles como la ruta del sistema operativo, el número de procesadores utilizados por el sistema operativo y la ubicación de las carpetas temporales.
Las variables de entorno almacenan datos que son utilizados por el sistema operativo y otros programas. Por ejemplo, la variable de entorno WINDIR
contiene la ubicación del directorio de instalación de Windows. Los programas pueden consultar el valor de esta variable para determinar dónde se encuentran los archivos del sistema operativo Windows.
PowerShell puede acceder y gestionar las variables de entorno en cualquiera de las plataformas de sistemas operativos compatibles. El proveedor de entorno de PowerShell simplifica este proceso facilitando la visualización y el cambio de las variables de entorno.
Las variables de entorno, a diferencia de otros tipos de variables en PowerShell, son heredadas por los procesos hijos, como los trabajos de fondo locales y las sesiones en las que se ejecutan los miembros del módulo. Esto hace que las variables de entorno sean muy adecuadas para almacenar valores que se necesitan tanto en los procesos padre como en los hijos.
Uso y cambio de variables de entorno
En Windows, las variables de entorno pueden definirse en tres ámbitos:
- Ámbito de la máquina (o del sistema)
- Ámbito del usuario
- Ámbito del proceso
El ámbito del proceso contiene las variables de entorno disponibles en el proceso actual, o en la sesión de PowerShell. Esta lista de variables se hereda del proceso padre y se construye a partir de las variables de los ámbitos Machine yUser. Las plataformas basadas en Unix sólo tienen el ámbito Process.
Puede mostrar y cambiar los valores de las variables de entorno sin usar acmdlet utilizando una sintaxis de variable con el proveedor de entorno. Para mostrar el valor de una variable de entorno, utilice la siguiente sintaxis:
$Env:<variable-name>
Por ejemplo, para mostrar el valor de la variable de entorno WINDIR
, escriba el siguiente comando en el símbolo del sistema de PowerShell:
$Env:windir
En esta sintaxis, el signo de dólar ($
) indica una variable, y el nombre de la unidad(Env:
) indica una variable de entorno seguida del nombre de la variable(windir
).
Cuando se cambian las variables de entorno en PowerShell, el cambio afecta sólo a la sesión actual. Este comportamiento se asemeja al del comando Set
en la Shell de comandos de Windows y el comando Setenv
en entornos basados en UNIX. Para cambiar los valores en los ámbitos Máquina o Usuario, debe utilizar los métodos de la clase System.Environment.
Para realizar cambios en las variables de ámbito Máquina, también debe tener permiso. Si intenta cambiar un valor sin el permiso suficiente, el comando falla yPowerShell muestra un error.
Puede cambiar los valores de las variables sin utilizar un cmdlet utilizando la siguiente sintaxis:
$Env:<variable-name> = "<new-value>"
Por ejemplo, para añadir ;c:\temp
al valor de la variable de entorno Path
, utilice la siguiente sintaxis:
$Env:Path += ";c:\temp"
En Linux o macOS, los dos puntos (:
) en el comando separan la nueva ruta de la que la precede en la lista.
$Env:PATH += ":/usr/local/temp"
También puede utilizar los cmdlets Item, como Set-Item
Remove-Item
, yCopy-Item
para cambiar los valores de las variables de entorno. Por ejemplo, para utilizar el cmdlet Set-Item
para añadir ;c:\temp
al valor de la variable de entorno Path
, utilice la siguiente sintaxis:
Set-Item -Path Env:Path -Value ($Env:Path + ";C:\Temp")
En este comando, el valor se encierra entre paréntesis para que seinterprete como una unidad.
Variables de entorno que almacenan preferencias
Las funciones de PowerShell pueden utilizar variables de entorno para almacenar las preferencias del usuario.Estas variables funcionan como las variables de preferencia, pero son heredadas por las sesiones hijas de las sesiones en las que se crean. Para obtener más información sobre las variables de preferencia, consulte about_preference_variables.
Las variables de entorno que almacenan preferencias incluyen:
-
PSExecutionPolicyPreference
Almacena la política de ejecución establecida para la sesión actual. Esta environmentvariable sólo existe cuando se establece una política de ejecución para una sola sesión.Puede hacerlo de dos maneras diferentes.
-
Iniciar una sesión desde la línea de comandos utilizando el parámetro ExecutionPolicy para establecer la política de ejecución para la sesión.
-
Utilizar el cmdlet
Set-ExecutionPolicy
. Utilice el parámetro Scope conun valor de «Process».Para obtener más información, consulte about_Execution_Policies.
-
-
PSModuleAnalysisCachePath
PowerShell proporciona control sobre el archivo que se utiliza para almacenar en caché los datos sobre los módulos y sus cmdlets. La caché se lee al inicio mientras se busca un comando y se escribe en un hilo de fondo en algún momento después de importar un módulo.
La ubicación predeterminada de la caché es:
- Windows PowerShell 5.1:
$env:LOCALAPPDATA\Microsoft\Windows\PowerShell
- PowerShell 6.0 y superior:
$env:LOCALAPPDATA\Microsoft\PowerShell
- PowerShell 6.0 y superior:
~/.cache/powershell
-
PSModulePath
La variable de entorno
$env:PSModulePath
contiene una lista de ubicaciones de carpetas que se buscan para encontrar módulos y recursos.Por defecto, las ubicaciones efectivas asignadas a
$env:PSModulePath
son: -
Localizaciones de todo el sistema: Estas carpetas contienen los módulos que se envían conPowerShell. Los módulos se almacenan en la ubicación
$PSHOME\Modules
. Además,Esta es la ubicación donde se instalan los módulos de gestión de Windows. - En Windows, la ubicación del ámbito CurrentUser específico del usuario es la carpeta
$HOME\Documents\PowerShell\Modules
. La ubicación del ámbitoAllUsers es$env:ProgramFiles\PowerShell\Modules
. - En sistemas que no sean Windows, la ubicación del ámbito CurrentUsers específico del usuario es la carpeta
$HOME/.local/share/powershell/Modules
. La ubicación del ámbito AllUsers es/usr/local/share/powershell/Modules
. - La unidad Environment provider
- Los cmdlets Item
- La clase .NET System.Environment class
- En Windows, el Panel de Control del Sistema
- Environment (provider)
- about_Modules
El nombre de archivo por defecto para la caché es
ModuleAnalysisCache
. Si tiene varias instancias de PowerShell instaladas, el nombre de archivo incluye un sufijo hexadecimal para que haya un nombre de archivo único por instalación.Nota
Si el descubrimiento de comandos no funciona correctamente, por ejemplo, Intellisenses muestra comandos que no existen, puede eliminar el archivo de caché. La caché se vuelve a crear la próxima vez que inicie PowerShell.
Para cambiar la ubicación predeterminada de la caché, establezca la variable de entornoantes de iniciar PowerShell. Los cambios en esta variable de entorno sólo afectan a los procesos infantiles. El valor debe nombrar una ruta completa (incluyendo el nombre del archivo)que PowerShell tenga permiso para crear y escribir archivos.Para desactivar la caché de archivos, establezca este valor en una ubicación no válida, por ejemplo:
# `NUL` here is a special device on Windows that cannot be written to,# on non-Windows you would use `/dev/null`$env:PSModuleAnalysisCachePath = 'NUL'
Esto establece la ruta en el dispositivo NUL. PowerShell no puede escribir en la ruta pero no se devuelve ningún error. Puedes ver los errores reportados usando el atracer:
Trace-Command -PSHost -Name Modules -Expression { Import-Module Microsoft.PowerShell.Management -Force }
PSDisableModuleAnalysisCacheCleanup
Cuando se escribe la caché de análisis de módulos, PowerShell comprueba los módulos que ya no existen para evitar una caché innecesariamente grande. A veces estas comprobaciones no son deseables, en cuyo caso puede desactivarlas estableciendo el valor de esta variable de entorno a
1
.El establecimiento de esta variable de entorno tiene efecto inmediato en el proceso actual.
Módulos instalados por el usuario: Son módulos instalados por el usuario.
Install-Module
tiene un parámetro Scope que permite especificarsi el módulo se instala para el usuario actual o para todos los usuarios. Para más información, consulte Install-Module.Además, los programas de configuración que instalan módulos en otros directorios, como el directorio Archivos de programa, pueden añadir sus ubicaciones al valor de
$env:PSModulePath
.Para obtener más información, consulte about_PSModulePath.
Gestión de variables de entorno
PowerShell proporciona varios métodos diferentes para la gestión de environmentvariables.
Usando el proveedor de Entorno
Cada variable de entorno está representada por una instancia de la claseSystem.Collections.DictionaryEntry. En cada objeto DictionaryEntry, el nombre de la variable de entorno es la clave del diccionario. El valor de la variable es el valor del diccionario.
Para mostrar las propiedades y los métodos del objeto que representa una variable de entorno en PowerShell, utilice el cmdlet
Get-Member
. Por ejemplo, para mostrar los métodos y las propiedades de todos los objetos de la unidadEnv:
, escriba:Get-Item -Path Env:* | Get-Member
El proveedor de entorno de PowerShell le permite acceder a las variables de entorno de una unidad dePowerShell (la unidad
Env:
). Esta unidad se parece mucho a una unidad de sistema de archivos. Para ir a la unidadEnv:
, escriba:Set-Location Env:
Utilice los cmdlets de contenido para obtener o establecer los valores de una variable de entorno.
PS Env:\> Set-Content -Path Test -Value 'Test value'PS Env:\> Get-Content -Path TestTest value
Puede ver las variables de entorno en la unidad
Env:
desde cualquier otra unidad dePowerShell, y puede entrar en la unidadEnv:
para ver y cambiar las variables de entorno.Uso de los cmdlets de elementos
Cuando haga referencia a una variable de entorno, escriba el
Env:
nombre de la unidad seguido del nombre de la variable. Por ejemplo, para mostrar el valor de la variable de entornoCOMPUTERNAME
, escriba:Get-ChildItem Env:Computername
Para mostrar los valores de todas las variables de entorno, escriba:
Get-ChildItem Env:
Debido a que las variables de entorno no tienen elementos hijos, la salida de
Get-Item
yGet-ChildItem
es la misma.Por defecto, PowerShell muestra las variables de entorno en el orden en que las recupera. Para ordenar la lista de variables de entorno por nombre de variable, canalice la salida de un comando
Get-ChildItem
al cmdletSort-Object
. Forexample, desde cualquier unidad de PowerShell, escribe:Get-ChildItem Env: | Sort Name
También puedes entrar en la unidad
Env:
utilizando el cmdletSet-Location
:Set-Location Env:
Cuando estés en la unidad
Env:
, puedes omitir elEnv:
nombre de la unidad en la ruta. Por ejemplo, para mostrar todas las variables de entorno, escriba:PS Env:\> Get-ChildItem
Para mostrar el valor de la variable
COMPUTERNAME
dentro de laEnv:
unidad, escriba:PS Env:\> Get-ChildItem ComputerName
Guardar cambios en las variables de entorno
Para realizar un cambio persistente en una variable de entorno en Windows, utilice elPanel de control del sistema. Seleccione Configuración avanzada del sistema. En la pestaña Avanzado, haga clic en Variable de entorno…. Puede añadir o editar variables de entorno existentes en los ámbitos de Usuario y Sistema (Máquina). Windows escribe estos valores en el Registro para que persistan a través de las sesiones y los reinicios del sistema.
Alternativamente, puede añadir o cambiar las variables de entorno en su perfil de PowerShell. Este método funciona para cualquier versión de PowerShell en cualquier plataforma soportada.
Uso de los métodos System.Environment
La clase System.Environment proporciona los métodos GetEnvironmentVariable y SetEnvironmentVariable que permiten especificar el ámbito de la variable.
El siguiente ejemplo utiliza el método GetEnvironmentVariable para obtener la configuración de la máquina de
PSModulePath
y el método SetEnvironmentVariablepara añadir la rutaC:\Program Files\Fabrikam\Modules
al valor.$path = ::GetEnvironmentVariable('PSModulePath', 'Machine')$newpath = $path + ';C:\Program Files\Fabrikam\Modules'::SetEnvironmentVariable("PSModulePath", $newpath, 'Machine')
Para más información sobre los métodos de la clase System.Environment, consulteMétodosEnvironment.
SEE ALSO
.
- Windows PowerShell 5.1: