安装模块不可用 - 未被识别为 cmdlet 的名称

时间:2021-02-15 15:08:28

标签: powershell powershell-7.0

我正在尝试利用需要安装模块的 PowerShell 库。由于某种原因,我无法在我有权访问的任何计算机上使用它:

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\7\Modules

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

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

删除该环境变量后,它似乎可以工作。

1 个答案:

答案 0 :(得分:1)

正如您自己发现的那样,是机器级环境变量 __PSLockDownPolicy 的存在阻止了 Install-Module 运行(有关一般先决条件,请参见下文)。< /p>

这个未记录环境变量,仅在Windows上有效,出于安全原因,只有在机器上定义时才会受到尊重 em> 级别通过注册表(而不是作为每个用户或特定于进程的变量)并且可用于限制 PowerShell 会话中允许的内容

47 导致 PowerShell 在受限语言模式下运行,其中只能使用少数预先批准的 .NET 类型 strong>,因此会阻止加载包含 PowerShellGetInstall-Module 模块 - 请参阅概念性 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 向您展示了真正的问题不是{{1 }} 命令不存在,但它的封闭模块加载失败

这样做表明问题是另一个模块,即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. 报告 {{ 1}}:

$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 是 Windows PowerShell 5.0 和 5.1 以及所有版本的 PowerShell (Core) (v6+) 附带的(基于函数的)cmdlet,作为 PowerShellGet 模块的一部分。< /p>

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

  • Install-Module get 模块已从其默认位置移除(或重命名)
    PowerShellGet 在 Windows PowerShell 中,
    PowerShell 在 Windows 上的 PowerShell (Core) 7.x 中。

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

    • 通过 C:\Program Files\PowerShell\7\Modules、选项卡 PowerShellGet、按钮 PSModulePath 手动更新环境变量 sysdm.cpl 的机器级定义以包含适用的目录。

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