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.

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

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

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

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

Изменение PSModulePath

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

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

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

См. также