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


about_PSModulePath

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

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

Длинное описание

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

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

  • Модули, установленные в области CurrentUser:
    • В Windows эти модули хранятся в $HOME\Documents\PowerShell\Modules. Конкретное расположение папки Documents зависит от версии Windows и при использовании перенаправления папок. Кроме того, Microsoft OneDrive может изменить расположение папки Documents. Чтобы проверить расположение папки Documents, выполните следующую команду: [Environment]::GetFolderPath('MyDocuments').
    • В системах, отличных от Windows, эти модули хранятся в папке $HOME/.local/share/powershell/Modules.
  • Модули, установленные в области AllUsers:
    • В Windows эти модули хранятся в $Env:ProgramFiles\PowerShell\Modules.
    • В системах, отличных от Windows, эти модули хранятся в /usr/local/share/powershell/Modules.
  • Модули, которые отправляются с помощью PowerShell, хранятся в $PSHOME\Modules.

Заметка

Приложения, включающие модули PowerShell, могут устанавливать модули в других каталогах в Windows, например папку Program Files. Пакет установщика может не добавлять расположение в $Env:PSModulePath.

Расположения по умолчанию для Windows PowerShell 5.1 отличаются от PowerShell 7.

  • Модули, установленные в области 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 7

В Windows для большинства переменных среды, если переменная с областью действия пользователя существует, новый процесс использует это значение только, даже если переменная с областью действия компьютера имеет то же имя. Путь переменных среды обрабатываются иначе.

В Windows PSModulePath обрабатывается аналогично тому, как обрабатывается переменная среды Path. Path обрабатывается по-разному от других переменных среды. При запуске процесса Windows объединяет Path с Pathс областью действия компьютера.

  • Получение PSModulePath с областью действия пользователя
  • Сравнение с наследуемой PSModulePath переменной среды
    • Если то же самое:
      • Добавьте AllUsersPSModulePath в конец после семантики переменной среды PATH
      • Путь System32 Windows поступает с компьютера, определенного PSModulePath, поэтому не нужно явно добавлять
    • Если он отличается, обработайте его явным образом и не добавляйте AllUsersPSModulePath
  • Префикс с путями пользователя, системы и $PSHOME PS7 в этом порядке
    • Если powershell.config.json содержит PSModulePathпользователя, используйте его вместо значения по умолчанию для пользователя.
    • Если powershell.config.json содержит системный PSModulePath, используйте его вместо значения по умолчанию для системы.

В системах, отличных от Windows, нет разделения переменных среды пользователей и систем. PSModulePath наследуется, и путь, зависящий от PS7, префиксируется, если он еще не определен.

Запуск Windows PowerShell из PowerShell 7

Для этого обсуждения Windows PowerShell означает как powershell.exe, так и powershell_ise.exe.

Значение $Env:PSModulePath копируется в WinPSModulePath со следующими изменениями:

  • Удаление путь к модулю PS7
  • Удаление PS7 пути к системным модулям
  • Удаление PS7 пути модуля $PSHOME

Пути PS7 удаляются, чтобы модули PS7 не загружались в Windows PowerShell. Значение WinPSModulePath используется при запуске Windows PowerShell.

Запуск PowerShell 7 из Windows PowerShell

Запуск PowerShell 7 продолжает as-is с добавлением наследуемых путей, добавленных Windows PowerShell. Так как пути, относящиеся к PS7, префиксируются, функциональные проблемы отсутствуют.

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

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 с параметром FullyQualifiedName. Дополнительные сведения см. в разделе Import-Module.

Изменение PSModulePath

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

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

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

Точка с запятой (;) в команде отделяет новый путь от пути, который предшествует ему в списке. На платформах, отличных от Windows, двоеточие (:) отделяет расположения пути в переменной среды.

Изменение PSModulePath в windows

Чтобы изменить значение PSModulePath для каждого сеанса в среде, отличной от Windows, добавьте предыдущую команду в профиль PowerShell.

Изменение PSModulePath в Windows

Чтобы изменить значение 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)

См. также