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


about_PSModulePath

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

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

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

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

Install-Module имеет параметр Scope , позволяющий указать, установлен ли модуль для текущего пользователя или для всех пользователей. Дополнительные сведения см. в разделе Install-Module.

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

  • Расположения на уровне системы. Эти папки содержат модули, поставляемые с PowerShell. Эти модули хранятся в папке $PSHOME\Modules .

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

    В системах, отличных от Windows, модули, установленные в область CurrentUser, хранятся в папке $HOME/.local/share/powershell/Modules .

  • Модули для конкретных приложений. Программы установки могут устанавливать модули в других каталогах, например в папке Program Files в Windows. Пакет установщика может добавить расположение в $env:PSModulePath.

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

Значение $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 для большинства переменных среды, если существует переменная уровня пользователя, новый процесс использует это значение только в том случае, если существует переменная области компьютера с таким же именем.

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

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

В системах Unix нет разделения переменных среды User и System. PSModulePath наследуется, и пути, относящиеся к PS7, имеют префикс, если они еще не определены.

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

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

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

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

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

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

Запуск PowerShell 7 продолжается "как есть" с добавлением наследуемых путей, которые 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').OpenSubKey('Environment', $true)
$path = $key.GetValue('PSModulePath','','DoNotExpandEnvironmentNames')
$path += ';%ProgramFiles%\Fabrikam\Modules'
$key.SetValue('PSModulePath',$path,[Microsoft.Win32.RegistryValueKind]::ExpandString)

Чтобы добавить путь к параметру пользователя, измените поставщик реестра с HKLM:\ на 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)

См. также раздел