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 модули, установленные в область AllUsers, хранятся в
Модули, установленные пользователем. В 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
путем модулей
- Путь к модулям AllUsers вставляется перед
- Еще:
- Просто используйте
PSModulePath
, как определено, так как пользователь намеренно удалил$PSHOME
расположение
- Просто используйте
- Если
Путь к модулю CurrentUser имеет префикс только в том случае, если область $env:PSModulePath
пользователя не существует. В противном случае используется область $env:PSModulePath
пользователя в соответствии с определенными параметрами.
Запуск PowerShell 7
В Windows для большинства переменных среды, если существует переменная уровня пользователя, новый процесс использует это значение только в том случае, если существует переменная области компьютера с таким же именем.
В PowerShell 7 обрабатывается аналогично тому, PSModulePath
как Path
переменная среды обрабатывается в Windows. В Windows обрабатывается иначе, Path
чем в других переменных среды. При запуске процесса Windows объединяет область пользователя Path
с областью компьютера Path
.
- Получение области пользователя
PSModulePath
- Сравнение с наследуемой
PSModulePath
переменной среды процесса- Если то же самое:
- Добавьте AllUsers
PSModulePath
в конец после семантики переменнойPath
среды. - Путь к Windows
System32
поступает от определенногоPSModulePath
компьютера, поэтому его не нужно добавлять явным образом.
- Добавьте AllUsers
- Если это отличается, то пользователь явно изменил его и не добавляйте AllUsers.
PSModulePath
- Если то же самое:
- Префикс с пользовательскими, системными и
$PSHOME
путями PS7 в этом порядке- Если
powershell.config.json
содержит область действияPSModulePath
пользователя , используйте вместо значения по умолчанию для пользователя. - Если
powershell.config.json
содержит системную областьPSModulePath
, используйте ее вместо значения по умолчанию для системы.
- Если
В системах Unix нет разделения переменных среды User и System.
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 продолжается "как есть" с добавлением наследуемых путей, которые 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)