Сведения о PSModulePath
Переменная $env:PSModulePath
среды содержит список расположений папок, в которых выполняется поиск модулей и ресурсов. PowerShell рекурсивно выполняет поиск в каждой папке файлов модуля (.psd1
или .psm1
).
По умолчанию назначенные $env:PSModulePath
действующие расположения:
Расположения на уровне системы. Эти папки содержат модули, поставляемые с PowerShell. Эти модули хранятся в папке
$PSHOME\Modules
. Это также расположение, где установлены модули управления Windows.Модули, установленные пользователем. Это модули, установленные пользователем.
Install-Module
имеет параметр Scope , позволяющий указать, установлен ли модуль для текущего пользователя или для всех пользователей. Дополнительные сведения см. в разделе Install-Module.- В Windows расположением область CurrentUser является
$HOME\Documents\PowerShell\Modules
папка. Расположение область AllUsers —$env:ProgramFiles\PowerShell\Modules
. - В системах, отличных от Windows, расположением область Пользователя является
$HOME/.local/share/powershell/Modules
папка. Расположение область AllUsers —/usr/local/share/powershell/Modules
.
- В Windows расположением область CurrentUser является
Кроме того, программы установки, устанавливающие модули в других каталогах, таких как каталог Program Files, могут добавлять свои расположения к значению $env:PSModulePath
.
Примечание
В Windows расположением пользователя является PowerShell\Modules
папка, расположенная в папке Документы в профиле пользователя. Конкретный путь к этой папке зависит от версии Windows и от того, используется ли перенаправление папок. Microsoft OneDrive также может изменить расположение папки "Документы ". Расположение папки "Документы" можно проверить с помощью следующей команды: [Environment]::GetFolderPath('MyDocuments')
.
Изменение PSModulePath
Чтобы изменить каталоги модулей по умолчанию для текущего сеанса, используйте следующий формат команды, чтобы изменить значение переменной PSModulePath
среды.
Например, чтобы добавить C:\Program Files\Fabrikam\Modules
каталог к значению переменной среды PSModulePath, введите:
$Env:PSModulePath = $Env:PSModulePath+";C:\Program Files\Fabrikam\Modules"
Точка с запятой (;
) в команде отделяет новый путь от пути, который предшествует ему в списке. На платформах, отличных от Windows, двоеточие (:
) разделяет расположения пути в переменной среды.
Чтобы изменить значение PSModulePath
в каждом сеансе, добавьте предыдущую команду в профиль PowerShell или используйте метод SetEnvironmentVariable класса Environment .
Следующая команда использует метод GetEnvironmentVariable для получения параметра PSModulePath
компьютера и метод SetEnvironmentVariable для добавления C:\Program Files\Fabrikam\Modules
пути к значению.
$path = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine')
$newpath = $path + ';C:\Program Files\Fabrikam\Modules'
[Environment]::SetEnvironmentVariable('PSModulePath', $newpath, 'Machine')
Чтобы добавить путь к параметру пользователя, измените целевое значение на User.
$path = [Environment]::GetEnvironmentVariable('PSModulePath', 'User')
$newpath = $path + ';C:\Program Files\Fabrikam\Modules'
[Environment]::SetEnvironmentVariable('PSModulePath', $newpath, 'User')
Дополнительные сведения о методах класса System.Environment см. в разделе Методы среды.
Построение 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 Core 6
PowerShell Core 6 не использует содержимое , $env:PSModulePath
если обнаруживает, что он был запущен из PowerShell. Он перезаписывает его следующими:
- CurrentUser modules path + AllUsers modules path +
$PSHOME
modules path + Windows PowerShell$PSHOME
modules paths.
Запуск 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 6 из PowerShell 7
PowerShell Core 6 перезаписывает $env:PSModulePath
. Внесение изменений не требуется.
Запуск PowerShell 7 из PowerShell 6
Запуск PowerShell 7 продолжается как есть с добавлением наследуемых путей, добавленных в PowerShell Core 6. Так как пути, относящиеся к PS7, имеют префикс, функциональные проблемы не возникают.
Поведение поиска модуля
PowerShell рекурсивно выполняет поиск файлов модуля (.psd1
или .psm1
) в каждой папке в PSModulePath. Этот шаблон поиска позволяет устанавливать несколько версий одного модуля в разных папках. Пример:
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.