Поделиться через


about_PSModulePath

Краткое описание

В этой статье описывается назначение и использование переменной $env:PSModulePath среды.

Подробное описание

Переменная $env:PSModulePath среды содержит список расположений папок. PowerShell рекурсивно ищет каждую папку для файлов модулей (.psd1 или .psm1) .

По умолчанию назначены действующие расположения $env:PSModulePath :

  • Модули, установленные в области CurrentUser , хранятся в $HOME\Documents\WindowsPowerShell\Modules.
  • Модули, установленные в области AllUsers , хранятся в $env:ProgramFiles\WindowsPowerShell\Modules.
  • Модули, которые поставляются с Windows PowerShell, хранящиеся $PSHOME\Modulesв $env:SystemRoot\System32\WindowsPowerShell\1.0\Modules.

Построение PowerShell PSModulePath

Значение $env:PSModulePath создается при каждом запуске PowerShell. Значение зависит от версии PowerShell и способа ее запуска.

Запуск Windows PowerShell

Windows PowerShell использует следующую логику для создания PSModulePath при запуске:

  • Если PSModulePath не существует, объедините CurrentUser, AllUsers и $PSHOME пути модулей
  • Если PSModulePath существует:
    • Если PSModulePath содержится путь к модулям $PSHOME :
      • Путь к модулям AllUsers вставляется перед $PSHOME путем модулей
    • еще:
      • Просто используйте PSModulePath как определено, так как пользователь намеренно удалил $PSHOME расположение

Путь модуля CurrentUser префиксируется только в том случае, если область $env:PSModulePath пользователя не существует. В противном случае область $env:PSModulePath пользователя используется в соответствии с определенными параметрами.

Поведение поиска модуля

PowerShell рекурсивно выполняет поиск каждой папки в файлах PSModulePath для модулей (.psd1 или .psm1) . Этот шаблон поиска позволяет устанавливать несколько версий одного модуля в разных папках. Например:

    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

По умолчанию PowerShell загружает наибольшее число версий модуля при обнаружении нескольких версий. Чтобы загрузить определенную версию, используйте Import-Module параметр ПолностьюQualifiedName . Дополнительные сведения см. в разделе Import-Module.

Изменение PSModulePath

В большинстве случаев следует устанавливать модули в расположениях модулей по умолчанию. Однако может потребоваться изменить значение переменной PSModulePath среды.

Например, чтобы временно добавить каталог C:\Program Files\Fabrikam\Modules в текущий $env:PSModulePath сеанс, введите:

$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"

Чтобы изменить значение каждого сеанса PSModulePath , измените раздел реестра, в котором хранятся PSModulePath значения. Значения PSModulePath хранятся в реестре как необъяснимые строки. Чтобы избежать постоянного сохранения PSModulePath значений в виде развернутых строк, используйте GetValue() метод в подразделе и измените значение напрямую.

В следующем примере путь к значению переменной C:\Program Files\Fabrikam\Modules среды добавляется PSModulePath без расширения необъясненных строк.

$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)

Чтобы добавить путь к параметру пользователя, используйте следующий код:

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

См. также