Install-Module 不可用 - 未识别为 cmdlet 的名称

Install-Module not available - not recognized as a name of a cmdlet

我正在尝试利用需要 Install-Module 的 PowerShell Gallery。出于某种原因,我无法在我有权访问的任何计算机上运行它:

Install-Module: The term 'Install-Module' is not recognized as a name of a cmdlet, function, script file, or executable program.

我在 Windows 8.1、Windows 10 上试过,甚至在 Windows 10 计算机上安装了 PowerShell 7.1。我看到很多人有这个问题,但除了安装 WMF(似乎已经包含在 Win10 中)之外,我没有看到任何有用的建议。

我没有太多使用 PowerShell 的经验,而且绝对不会管理它,所以我很好奇是否有人知道为什么这不起作用。

编辑 1: 我似乎在以下目录中有 PowerShellGet 模块:

C:\Program Files\WindowsPowerShell\Modules
C:\Program Files\PowerShell\Modules

并且 $env:PSModulePath 变量包含 C:\Program Files\PowerShell\Modules;c:\program files\powershell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

编辑 2: 这可能与 __PSLockDownPolicy 环境变量有关,该变量在所有受影响的计算机上都设置为 4。我能够通过尝试手动加载 PowerShellGet 模块来解决这个问题,该模块产生了一个暗示这一点的错误。

删除那个环境变量后,它似乎工作了。

正如您自己发现的那样,正是 机器级环境变量 __PSLockDownPolicy 的存在阻止了 Install-Module 从 运行 (请参阅下面的一般先决条件)。

这个未记录环境变量,仅对Windows有效,是出于安全原因,只有在机器级别通过注册表定义(而不是每个用户 或特定于进程的变量)和 可用于限制 PowerShell 会话中允许的内容 .

47 导致 PowerShell 在 constrained 语言模式下运行,其中只有少数预先批准的 . NET 类型,这会阻止加载包含 Install-ModulePowerShellGet 模块 - 请参阅概念性 about_Language Modes 帮助主题。

您可以通过执行 $ExecutionContext.SessionState.LanguageMode 检查给定会话中有效的语言模式;在约束模式下,结果是 ConstrainedLanguageFullLanguage 表示没有 语言限制。

查看 PowerShell 的源代码,在名为 GetDebugLockdownPolicy() 的方法中检查此变量的事实表明它 不受官方支持

有关详细信息,请参阅 this archived blog post

删除此限制的最简单方法删除 环境变量,通过运行以下来自 提升 PowerShell 提示符:

Remove-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment' __PSLockdownPolicy

还有一个谜:

正如您所说,PowerShellGet 模块 显式导入 Import-Module PowerShellGet 表明真正的问题是 而不是 Install-Module 命令 不存在 ,但其 封闭模块加载失败

这样做表明 另一个 模块是问题所在,即 PowerShellGet 所依赖的 PackageManagement 模块; 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'.

此错误消息使问题更加明显,并且可能会导致更快的诊断。


以下包含与上述内容无关的一般信息:

提供Install-Module命令的PowerShellGet模块的安装/故障排除:

Install-Module 是 Windows PowerShell 5.0 和 5.1 以及所有版本的 PowerShell (Core) (v6+) 附带的(基于函数的)cmdlet,作为 PowerShellGet模块。

如果您的计算机确实满足这些条件,这意味着您的 PowerShell 安装已通过以下一种或两种方式损坏:

  • PowerShell get 模块已从其默认位置删除(或重命名)
    C:\Program Files\WindowsPowerShell\Modules\PowerShellGet 在 Windows PowerShell 中,
    C:\Program Files\Powershell\Modules\PowerShellGet 在 PowerShell(核心)7.x 上 Windows)。

    • 重新安装 PowerShell 或尝试下面链接的手动安装说明。
  • $env:PSModulePath 环境变量缺少相应默认位置的 父目录 的条目(即,
    C:\Program Files\WindowsPowerShell\Modules /
    C:\Program Files\PowerShell\Modules)。如果没有此条目,PowerShell 将无法找到 PowerShellGet 模块(仅通过 名称 )。

    • 通过 sysdm.cpl、选项卡 Advanced、按钮 Environment Variables... 手动更新环境变量 PSModulePath 的机器级定义以包含适用的目录。

如果您的计算机满足这些条件,您有两个选择: