简短说明
本文介绍了 $Env:PSModulePath 环境变量的用途和用法。
详细说明
$Env:PSModulePath 环境变量包含文件夹位置的列表。 PowerShell 以递归方式搜索每个文件夹中的模块(.psd1 或 .psm1)文件。
默认情况下,分配给 $Env:PSModulePath 的有效位置为:
-
CurrentUser 范围中安装的模块存储在
$HOME\Documents\WindowsPowerShell\Modules中。 - 安装在 AllUsers 范围内的模块存储在
$Env:ProgramFiles\WindowsPowerShell\Modules中。 - 随存储在
$PSHOME\Modules($Env:SystemRoot\System32\WindowsPowerShell\1.0\Modules)中存储的 Windows PowerShell 附带的模块。
PowerShell PSModulePath 构造
每次 PowerShell 启动时都会构造 $Env:PSModulePath 的值。
该值因 PowerShell 版本及其启动方式而异。
Windows PowerShell 启动
Windows PowerShell 使用以下逻辑在启动时构造 PSModulePath:
- 如果
PSModulePath不存在,请合并 CurrentUser、AllUsers 和$PSHOME模块路径 - 如果
PSModulePath存在:- 如果
PSModulePath包含$PSHOME模块路径:- AllUsers 模块路径插入到
$PSHOME模块路径之前
- AllUsers 模块路径插入到
- 否则:
- 由于用户故意删除了
PSModulePath位置,因此只需按定义使用$PSHOME
- 由于用户故意删除了
- 如果
仅当 User 范围 不存在时,才会为 CurrentUser$Env:PSModulePath 模块路径添加前缀。 否则,将按定义使用 User 范围 $Env:PSModulePath。
模块搜索行为
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"
若要更改每个会话中的 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)