Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Краткое описание
В этой статье описывается назначение и использование переменной среды $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
- Если то же самое:
- Префикс с путями пользователя, системы и
$PSHOMEPS7 в этом порядке- Если
powershell.config.jsonсодержитPSModulePathпользователя, используйте его вместо значения по умолчанию для пользователя. - Если
powershell.config.jsonсодержит системныйPSModulePath, используйте его вместо значения по умолчанию для системы.
- Если
В системах, отличных от Windows, нет разделения переменных среды пользователей и систем.
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 продолжает as-is с добавлением наследуемых путей, добавленных 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\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