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


Сведения о PSModulePath

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

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

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

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

    • В Windows расположением область CurrentUser является $HOME\Documents\PowerShell\Modules папка. Расположение область AllUsers$env:ProgramFiles\PowerShell\Modules.
    • В системах, отличных от Windows, расположением область Пользователя является $HOME/.local/share/powershell/Modules папка. Расположение область AllUsers/usr/local/share/powershell/Modules.

Кроме того, программы установки, устанавливающие модули в других каталогах, таких как каталог Program Files, могут добавлять свои расположения к значению $env:PSModulePath.

Примечание

В Windows расположением пользователя является PowerShell\Modules папка, расположенная в папке Документы в профиле пользователя. Конкретный путь к этой папке зависит от версии Windows и от того, используется ли перенаправление папок. Microsoft OneDrive также может изменить расположение папки "Документы ". Расположение папки "Документы" можно проверить с помощью следующей команды: [Environment]::GetFolderPath('MyDocuments').

Изменение PSModulePath

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

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

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

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

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

Следующая команда использует метод GetEnvironmentVariable для получения параметра PSModulePath компьютера и метод SetEnvironmentVariable для добавления C:\Program Files\Fabrikam\Modules пути к значению.

$path = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine')
$newpath = $path + ';C:\Program Files\Fabrikam\Modules'
[Environment]::SetEnvironmentVariable('PSModulePath', $newpath, 'Machine')

Чтобы добавить путь к параметру пользователя, измените целевое значение на User.

$path = [Environment]::GetEnvironmentVariable('PSModulePath', 'User')
$newpath = $path + ';C:\Program Files\Fabrikam\Modules'
[Environment]::SetEnvironmentVariable('PSModulePath', $newpath, 'User')

Дополнительные сведения о методах класса System.Environment см. в разделе Методы среды.

Построение 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 Core 6

PowerShell Core 6 не использует содержимое , $env:PSModulePath если обнаруживает, что он был запущен из PowerShell. Он перезаписывает его следующими:

  • CurrentUser modules path + AllUsers modules path + $PSHOME modules path + Windows PowerShell $PSHOME modules paths.

Запуск 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 6 из PowerShell 7

PowerShell Core 6 перезаписывает $env:PSModulePath. Внесение изменений не требуется.

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

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

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

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

    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.

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