正如您自己发现的那样,阻止运行的是机器级环境变量__PSLockDownPolicy
Install-Module
的存在(有关一般先决条件,请参见下文)。
这个未记录的环境变量,仅在 Windows上有效,出于安全原因,仅在通过注册表在机器级别定义(而不是作为每个用户或特定于进程的变量)时才受到尊重,并且可用于限制允许的内容PowerShell 会话。
4
通过值7
导致 PowerShell 在受限语言模式下运行,其中只能使用少数预先批准的 .NET 类型,因此会阻止加载PowerShellGet
包含 .NET 的模块Install-Module
- 请参阅概念about_Language Modes帮助主题。
您可以通过执行来检查给定会话中有效的语言模式$ExecutionContext.SessionState.LanguageMode
;在约束模式下,结果是ConstrainedLanguage
; FullLanguage
表示没有语言限制。
查看 PowerShell 的源代码,在名为的方法中检查此变量的事实GetDebugLockdownPolicy()
表明它不受官方支持。
有关详细信息,请参阅此归档博客文章。
删除此限制的最简单方法是删除环境变量,方法是在提升的PowerShell 提示符下运行以下命令:
Remove-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' __PSLockdownPolicy
一个谜仍然存在:
正如您所说,显式导入PowerShellGet
模块向您展示了真正的问题不是该命令不存在,而是其封闭模块无法加载。Import-Module PowerShellGet
Install-Module
这样做揭示了另一个模块是问题,即依赖的PackageManagement
模块;最后揭示:,这意味着(受约束的)语言模式是问题所在。PowerShellGet
Import-Module PackageManagement
Cannot set property. Property setting is supported only on core types in this language mode
神秘的是您的问题中报告的错误消息:Install-Module: The term 'Install-Module' is not recognized as a name of a cmdlet, function, script file, or executable program.
当受限语言模式生效时,即 报告时,我在 Windows PowerShell 5.1 和 PowerShell (Core) 7.1.2 中看到了不同的错误消息:$ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
Install-Module: The 'Install-Module' command was found in the module 'PowerShellGet', but the module could not be loaded. For more information, run 'Import-Module PowerShellGet'.
此错误消息使问题更加明显,并且可能会导致更快的诊断。
以下包含与上述无关的一般信息:
PowerShellGet
提供Install-Module
命令的模块的安装/故障排除:
Install-Module
是一个(基于函数的)cmdlet,它作为模块的一部分随 Windows PowerShell 5.0 和 5.1 以及所有版本的 PowerShell (Core) (v6+) 一起提供PowerShellGet
。
如果您的计算机确实满足这些条件,则意味着您的 PowerShell 安装已因以下一种或两种方式损坏:
PowerShell
get 模块已从其默认位置(在 Windows PowerShell、PowerShell (Core) 7.x、Windows 上)中删除(或重
命名C:\Program Files\WindowsPowerShell\Modules\PowerShellGet
)
C:\Program Files\Powershell\7\Modules\PowerShellGet
。
- 重新安装 PowerShell 或尝试下面链接的手动安装说明。
$env:PSModulePath
环境变量缺少相应默认位置(即/ )的父目录的条目。如果没有此条目,PowerShell 将无法找到该模块(仅按名称)。
C:\Program Files\WindowsPowerShell\Modules
C:\Program Files\PowerShell\7\Modules
PowerShellGet
PSModulePath
通过sysdm.cpl
、 tab Advanced
、 按钮手动更新环境变量的机器级定义Environment Variables...
以包含适用的目录。
如果您的计算机不符合这些条件,您有两种选择: