Compartir por


about_PSModulePath

Descripción breve

En este artículo se describe el propósito y el uso de la variable de entorno $Env:PSModulePath.

Descripción larga

La variable de entorno $Env:PSModulePath 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 de CurrentUser de:
    • En Windows, estos módulos se almacenan en $HOME\Documents\PowerShell\Modules. La ubicación específica de la carpeta Documents 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 carpeta Documents. Para comprobar la ubicación de la carpeta Documents, ejecute el comando siguiente: [Environment]::GetFolderPath('MyDocuments').
    • En sistemas que no son Windows, estos módulos se almacenan en la carpeta $HOME/.local/share/powershell/Modules.
  • Módulos instalados en el ámbito de 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.
  • 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 carpeta Program Files. Es posible que el paquete del instalador no anexe la ubicación al $Env:PSModulePath.

Las ubicaciones predeterminadas de Windows PowerShell 5.1 son diferentes de PowerShell 7.

  • Los módulos instalados en el ámbito de CurrentUser se almacenan en $HOME\Documents\WindowsPowerShell\Modules.
  • Los módulos instalados en el ámbito de AllUsers se almacenan en $Env:ProgramFiles\WindowsPowerShell\Modules.
  • Módulos que se envían 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 en el inicio:

  • Si no existe PSModulePath, combine currentUser, AllUsersy las rutas de acceso de los módulos de $PSHOME
  • Si PSModulePath existe:
    • Si PSModulePath contiene $PSHOME ruta de acceso de módulos:
      • ruta de acceso de los módulos AllUsers se inserta antes de $PSHOME ruta de acceso de los módulos
    • más:
      • Solo tiene que usar PSModulePath tal como se define, ya que el usuario quitó deliberadamente la ubicación de $PSHOME

La ruta de acceso del módulo CurrentUser solo tiene el prefijo si el ámbito de usuario $Env:PSModulePath no existe. De lo contrario, el ámbito de usuario $Env:PSModulePath 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. La ruta de acceso variables de entorno se tratan de forma diferente.

En Windows, PSModulePath se trata de forma similar a cómo se trata la variable de entorno Path. Path se trata de forma diferente de otras variables de entorno. Cuando se inicia un proceso, Windows combina el Path de ámbito de usuario con el ámbito de máquina Path.

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

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 powershell.exe como powershell_ise.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 módulo de $PSHOME

Las rutas de acceso de PS7 se quitan para que los módulos PS7 no se carguen en Windows PowerShell. El valor WinPSModulePath se usa al iniciar Windows PowerShell.

Inicio de PowerShell 7 desde Windows PowerShell

El inicio de PowerShell 7 continúa as-is 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 de 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, vea 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 variable de entorno PSModulePath.

Por ejemplo, para agregar temporalmente el directorio C:\Program Files\Fabrikam\Modules 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 valores de PSModulePath. Los valores de PSModulePath se almacenan en el Registro como cadenas no expandidas. Para evitar guardar permanentemente los valores de PSModulePath como cadenas de expandidas, use el método GetValue() en la subclave y edite el valor directamente.

En el ejemplo siguiente se agrega la ruta de acceso C:\Program Files\Fabrikam\Modules al valor de la variable de entorno PSModulePath 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)

Consulte también