1

我正在尝试利用需要安装模块的 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模块来解决这个问题,这会产生一个暗示这一点的错误。

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

4

1 回答 1

2

正如您自己发现的那样,阻止运行的是机器级环境变量__PSLockDownPolicyInstall-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 PowerShellGetInstall-Module

这样做揭示了另一个模块是问题,即依赖的PackageManagement模块;最后揭示:,这意味着(受约束的)语言模式是问题所在。PowerShellGetImport-Module PackageManagementCannot 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.LanguageModeConstrainedLanguage

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 安装已因以下一种或两种方式损坏:

  • PowerShellget 模块已从其默认位置(在 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\ModulesPowerShellGet

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

如果您的计算机符合这些条件,您有两种选择:

于 2021-02-15T16:15:15.117 回答