acerca de_about_PSModulePath
Descripción breve
En este artículo se describe el propósito y el uso de la $env:PSModulePath
variable de entorno.
Descripción larga
La $env:PSModulePath
variable de entorno contiene una lista de ubicaciones de carpetas. PowerShell busca recursivamente cada carpeta para los archivos de módulo (.psd1
o .psm1
).
De forma predeterminada, las ubicaciones efectivas asignadas a $env:PSModulePath
son:
- Módulos instalados en el ámbito CurrentUser :
- En Windows, estos módulos se almacenan en
$HOME\Documents\PowerShell\Modules
. La ubicación específica de laDocuments
carpeta varía según la versión de Windows y cuando se usa el redireccionamiento de carpetas. Además, Microsoft OneDrive puede cambiar la ubicación de laDocuments
carpeta. Para comprobar la ubicación de laDocuments
carpeta, ejecute el comando siguiente:[Environment]::GetFolderPath('MyDocuments')
. - En sistemas que no son windows, estos módulos se almacenan en la
$HOME/.local/share/powershell/Modules
carpeta .
- En Windows, estos módulos se almacenan en
- Módulos instalados en el ámbito AllUsers :
- En Windows, estos módulos se almacenan en
$env:ProgramFiles\PowerShell\Modules
. - En sistemas que no son windows, estos módulos se almacenan en
/usr/local/share/powershell/Modules
.
- En Windows, estos módulos se almacenan en
- Los módulos que se envían con PowerShell se almacenan en
$PSHOME\Modules
.
Nota:
Las aplicaciones que incluyen módulos de PowerShell pueden instalar módulos en otros directorios de Windows, como la Program Files
carpeta . Es posible que el paquete del instalador no anexe la ubicación a $env:PSModulePath
.
Las ubicaciones predeterminadas de Windows PowerShell 5.1 son diferentes de PowerShell 7.
- Los módulos instalados en el ámbito CurrentUser se almacenan en
$HOME\Documents\WindowsPowerShell\Modules
. - Los módulos instalados en el ámbito AllUsers se almacenan en
$env:ProgramFiles\WindowsPowerShell\Modules
. - Módulos que se incluyen con Windows PowerShell almacenados en
$PSHOME\Modules
, que es$env:SystemRoot\System32\WindowsPowerShell\1.0\Modules
.
Construcción de PSModulePath de PowerShell
El valor de $env:PSModulePath
se construye cada vez que se inicia PowerShell.
El valor varía según la versión de PowerShell y cómo la ha iniciado.
Inicio de Windows PowerShell
Windows PowerShell usa la siguiente lógica para construir el PSModulePath
objeto en el inicio:
- Si
PSModulePath
no existe, combine CurrentUser, AllUsers y las rutas de acceso de$PSHOME
los módulos. - Si
PSModulePath
existe:- Si
PSModulePath
contiene$PSHOME
la ruta de acceso de los módulos:- La ruta de acceso de los módulos AllUsers se inserta antes de
$PSHOME
la ruta de acceso de los módulos
- La ruta de acceso de los módulos AllUsers se inserta antes de
- más:
- Solo tiene que usar
PSModulePath
como se define, ya que el usuario quitó deliberadamente la$PSHOME
ubicación
- Solo tiene que usar
- Si
La ruta de acceso del módulo CurrentUser solo tiene el prefijo si el ámbito $env:PSModulePath
de usuario no existe. De lo contrario, el ámbito $env:PSModulePath
de usuario se usa como se define.
Inicio de PowerShell 7
En Windows, para la mayoría de las variables de entorno, si existe la variable de ámbito de usuario, un nuevo proceso solo usa ese valor, incluso cuando existe una variable de ámbito de máquina con el mismo nombre. Las variables de entorno de ruta de acceso se tratan de forma diferente.
En Windows, PSModulePath
se trata de forma similar a cómo se trata la Path
variable de entorno. Path
se trata de forma diferente de otras variables de entorno. Cuando se inicia un proceso, Windows combina el ámbito Path
de usuario con el ámbito Path
de máquina .
- Recuperar el ámbito de usuario
PSModulePath
- Comparación con la variable de entorno heredada del
PSModulePath
proceso- Si es lo mismo:
- Anexe AllUsers
PSModulePath
al final siguiendo la semántica de laPath
variable de entorno. - La ruta de acceso de Windows
System32
procede de la máquina definidaPSModulePath
, por lo que no es necesario agregar explícitamente
- Anexe AllUsers
- Si es diferente, trate como si el usuario lo modificara explícitamente y no anexe AllUsers.
PSModulePath
- Si es lo mismo:
- Prefijo con el usuario, el sistema y
$PSHOME
las rutas de acceso de PS7 en ese orden- Si
powershell.config.json
contiene un usuario conPSModulePath
ámbito , úselo en lugar del valor predeterminado para el usuario. - Si
powershell.config.json
contiene un ámbitoPSModulePath
del sistema, úselo en lugar del valor predeterminado para el sistema.
- Si
Los sistemas que no son Windows no tienen una separación de las variables de entorno de usuario y sistema. PSModulePath
se hereda y las rutas de acceso específicas de PS7 tienen el prefijo si aún no están definidos.
Inicio de Windows PowerShell desde PowerShell 7
Para esta explicación, Windows PowerShell significa tanto como powershell_ise.exe
powershell.exe
.
El valor de $env:PSModulePath
se copia en WinPSModulePath
con las siguientes modificaciones:
- Eliminación de PS7 en la ruta de acceso del módulo de usuario
- Eliminación de PS7 en la ruta de acceso del módulo del sistema
- Eliminación de PS7 en la ruta de acceso del
$PSHOME
módulo
Las rutas de acceso de PS7 se quitan para que los módulos PS7 no se carguen en Windows PowerShell. El WinPSModulePath
valor se usa al iniciar Windows PowerShell.
Inicio de PowerShell 7 desde Windows PowerShell
El inicio de PowerShell 7 continúa tal como está con la adición de rutas de acceso heredadas que agregó Windows PowerShell. Dado que las rutas de acceso específicas de PS7 tienen el prefijo , no hay ningún problema funcional.
Comportamiento de búsqueda de módulos
PowerShell busca recursivamente cada carpeta en los archivos PSModulePath para los archivos de módulo (.psd1
o .psm1
). Este patrón de búsqueda permite instalar varias versiones del mismo módulo en carpetas diferentes. Por ejemplo:
Directory: C:\Program Files\WindowsPowerShell\Modules\PowerShellGet
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 8/14/2020 5:56 PM 1.0.0.1
d---- 9/13/2019 3:53 PM 2.1.2
De forma predeterminada, PowerShell carga el número de versión más alto de un módulo cuando se encuentran varias versiones. Para cargar una versión específica, use Import-Module
con el parámetro FullyQualifiedName . Para obtener más información, consulte Import-Module.
Modificación de PSModulePath
En la mayoría de las situaciones, debe instalar módulos en las ubicaciones predeterminadas del módulo. Sin embargo, es posible que tenga que cambiar el valor de la PSModulePath
variable de entorno.
Por ejemplo, para agregar temporalmente el C:\Program Files\Fabrikam\Modules
directorio a $env:PSModulePath
para la sesión actual, escriba:
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
El punto y coma (;
) del comando separa la nueva ruta de acceso de la ruta de acceso que la precede en la lista. En plataformas que no son de Windows, los dos puntos (:
) separan las ubicaciones de ruta de acceso en la variable de entorno.
Modificación de PSModulePath en elementos que no son de Windows
Para cambiar el valor de PSModulePath
para cada sesión en un entorno que no es de Windows, agregue el comando anterior al perfil de PowerShell.
Modificación de PSModulePath en Windows
Para cambiar el valor de PSModulePath
en cada sesión, edite la clave del Registro que almacena los PSModulePath
valores. Los PSModulePath
valores se almacenan en el Registro como cadenas no expandidas . Para evitar guardar permanentemente los PSModulePath
valores como cadenas expandidas , use el GetValue()
método en la subclave y edite el valor directamente.
En el ejemplo siguiente se agrega la C:\Program Files\Fabrikam\Modules
ruta de acceso al valor de la PSModulePath
variable de entorno sin expandir las cadenas no expandidas.
$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)
Para agregar una ruta de acceso a la configuración del usuario, use el código siguiente:
$key = (Get-Item 'HKCU:\Environment')
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)