Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Краткое описание
В этой статье описывается назначение и использование переменной $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.
- В Windows эти модули хранятся в
- Модули, установленные в области AllUsers:
- В Windows эти модули хранятся в
$Env:ProgramFiles\PowerShell\Modules. - В системах, отличных от Windows, эти модули хранятся в
/usr/local/share/powershell/Modules.
- В Windows эти модули хранятся в
- Модули, которые отправляются с помощью 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путем модулей
-
Путь к модулям AllUsers вставляется перед
- еще:
- Просто используйте
PSModulePathкак определено, так как пользователь намеренно удалил$PSHOMEрасположение
- Просто используйте
- Если
Путь модуля CurrentUser префиксируется только в том случае, если область $Env:PSModulePath пользователя не существует. В противном случае область $Env:PSModulePath пользователя используется в соответствии с определенными параметрами.
Запуск PowerShell 7
В Windows для большинства переменных среды, если переменная с областью действия пользователя существует, новый процесс использует это значение только, даже если переменная с областью действия компьютера имеет то же имя. Путь переменных среды обрабатываются иначе.
В Windows PSModulePath обрабатывается аналогично тому, как обрабатывается переменная среды Path.
Path обрабатывается по-разному от других переменных среды. При запуске процесса Windows объединяет область действия пользователя Path с областью Pathдействия компьютера.
- Получение области действия пользователя
PSModulePath - Сравнение с наследуемой
PSModulePathпеременной среды- Если то же самое:
-
Добавьте AllUsers
PSModulePathв конец после семантики переменнойPATHсреды. - Путь
System32Windows поступает с компьютера, определенногоPSModulePath, поэтому не нужно явно добавлять
-
Добавьте AllUsers
- Если он отличается, обработайте его явным образом и не добавляйте AllUsers.
PSModulePath
- Если то же самое:
- Префикс с пользовательскими, системными и
$PSHOMEпутями PS7 в этом порядке- Если
powershell.config.jsonпользователь содержит областьPSModulePathдействия пользователя, используйте его вместо значения по умолчанию для пользователя. - Если
powershell.config.jsonсодержит системнуюPSModulePathобласть, используйте ее вместо значения по умолчанию для системы.
- Если
В системах, отличных от Windows, нет разделения переменных среды пользователей и систем.
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.
Например, чтобы временно добавить каталог 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)
См. также
PowerShell