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