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 que se buscan para buscar módulos y recursos. PowerShell busca recursivamente cada carpeta para los archivos de módulo (.psd1 o .psm1).

Install-Module tiene un parámetro Scope que permite especificar si el módulo está instalado para el usuario actual o para todos los usuarios. Para obtener más información, vea Install-Module.

De forma predeterminada, las ubicaciones efectivas asignadas a $env:PSModulePath son:

  • Ubicaciones para todo el sistema: estas carpetas contienen módulos que se incluyen con PowerShell. Estos módulos se almacenan en la $PSHOME\Modules carpeta .

    • En Windows, los módulos instalados en el ámbito AllUsers se almacenan en $env:ProgramFiles\WindowsPowerShell\Modules.
    • En sistemas que no son Windows, los módulos instalados en el ámbito AllUsers se almacenan en /usr/local/share/powershell/Modules.
  • Módulos instalados por el usuario: en Windows, los módulos instalados en el ámbito CurrentUser se almacenan normalmente en la $HOME\Documents\WindowsPowerShell\Modules carpeta. La ubicación específica de la Documents 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 la Documents carpeta. Puede comprobar la ubicación de la Documents carpeta mediante el siguiente comando: [Environment]::GetFolderPath('MyDocuments').

    En sistemas que no son Windows, los módulos instalados en el ámbito CurrentUser se almacenan en la $HOME/.local/share/powershell/Modules carpeta .

  • Módulos específicos de la aplicación: los programas de instalación pueden instalar módulos en otros directorios, como la Program Files carpeta en Windows. El paquete del instalador puede anexar o no la ubicación a $env:PSModulePath.

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 se inicia.

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
    • Más:
      • Solo tiene que usar PSModulePath como se define, ya que el usuario quitó deliberadamente la $PSHOME ubicación

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 usa ese valor solo aunque exista una variable con ámbito de máquina con el mismo nombre.

En PowerShell 7, PSModulePath se trata de forma similar a cómo se trata la Path variable de entorno en Windows. En Windows, 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 Pathde máquina .

  • Recuperar el ámbito de usuario PSModulePath
  • Comparación con la variable de entorno heredada del PSModulePath proceso
    • Si es lo mismo:
      • Anexe AllUsersPSModulePath al final siguiendo la semántica de la Path variable de entorno.
      • La ruta de acceso de Windows System32 procede de la máquina definida PSModulePath , por lo que no es necesario agregar explícitamente
    • Si es diferente, trate como si el usuario lo modificara explícitamente y no anexe AllUsers.PSModulePath
  • Prefijo con el usuario, el sistema y $PSHOME las rutas de acceso de PS7 en ese orden
    • Si powershell.config.json contiene un usuario con PSModulePathámbito , úselo en lugar del valor predeterminado para el usuario.
    • Si powershell.config.json contiene un ámbito PSModulePathdel sistema, úselo en lugar del valor predeterminado para el sistema.

Los sistemas Unix no tienen una separación de 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.exepowershell.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 método GetValue 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 sin expandir.

$key = (Get-Item 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').OpenSubKey('Environment', $true)
$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 de usuario, cambie el proveedor del Registro de HKLM:\ a HKCU:\.

$key = (Get-Item 'HKCU:\').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Consulte también