问题描述
我已使用以下内容永久更改 PSModulePath:
[Environment]::SetEnvironmentvariable('PSModulePath',"ABC","Machine")
[Environment]::GetEnvironmentvariable('PSModulePath',"Machine")
但是在我运行的任何 Powershell 会话中:
$env:PSModulePath
我明白了:
C:\Users\myname\Documents\WindowsPowerShell\Modules;ABC
这条路从何而来,是PS5的魔法吗?我已经检查了“用户”目标,这是空白的。好像有什么东西在 PSModulePath 前面加上这个默认路径?
解决方法
环境驱动器 Env:
包含特定于当前用户会话 (source) 的环境变量。它等效于 Process
范围。所以
[Environment]::GetEnvironmentVariable('PSModulePath','Process')
应该等价于
$env:PSModulePath
Process
范围包含特定进程的环境变量。它的构造如下 (source):
这个变量列表是从父进程继承的,并且是根据Machine和User范围内的变量构造的。
由于您检查了 Machine
和 User
范围,但未找到路径,因此它必须来自父进程,即 PowerShell 本身。这确实是这种情况,可以阅读here:
CurrentUser 模块路径仅在用户范围 $env:PSModulePath
不存在时才带有前缀。否则,将按照定义使用用户范围 $env:PSModulePath
。
正如您在问题中所确认的那样,
[Environment]::GetEnvironmentVariable('PSModulePath','User')
为空,因此 $env:PSModulePath
以 CurrentUser 模块路径为前缀,根据您的 Windows version 是 $HOME\Documents\PowerShell\Modules
或 $HOME\Documents\WindowsPowerShell\Modules
。
您可以在我的回答 here 中阅读有关环境变量的更多信息。