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 会话中允许的内容 .
值 4
到 7
导致 PowerShell 在 constrained 语言模式下运行,其中只有少数预先批准的 . NET 类型,这会阻止加载包含 Install-Module
的 PowerShellGet
模块 - 请参阅概念性 about_Language Modes 帮助主题。
您可以通过执行 $ExecutionContext.SessionState.LanguageMode
检查给定会话中有效的语言模式;在约束模式下,结果是 ConstrainedLanguage
; FullLanguage
表示没有 语言限制。
查看 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
的机器级定义以包含适用的目录。
如果您的计算机不满足这些条件,您有两个选择:
如果可以的话,upgrade the Windows PowerShell version to v5.1 or switch to PowerShell (Core).
或者 - 如果您的 Windows PowerShell 版本是 3 或 4 - 安装 PowerShellGet
手动 ,根据 official instructions.
- 注意:您可能需要至少 一台 台计算机,该计算机已经具有
PowerShellGet
的正常运行副本,才能从中获取手动安装。
我正在尝试利用需要 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 会话中允许的内容 .
值 4
到 7
导致 PowerShell 在 constrained 语言模式下运行,其中只有少数预先批准的 . NET 类型,这会阻止加载包含 Install-Module
的 PowerShellGet
模块 - 请参阅概念性 about_Language Modes 帮助主题。
您可以通过执行 $ExecutionContext.SessionState.LanguageMode
检查给定会话中有效的语言模式;在约束模式下,结果是 ConstrainedLanguage
; FullLanguage
表示没有 语言限制。
查看 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
的机器级定义以包含适用的目录。
- 通过
如果您的计算机不满足这些条件,您有两个选择:
如果可以的话,upgrade the Windows PowerShell version to v5.1 or switch to PowerShell (Core).
或者 - 如果您的 Windows PowerShell 版本是 3 或 4 - 安装
PowerShellGet
手动 ,根据 official instructions.- 注意:您可能需要至少 一台 台计算机,该计算机已经具有
PowerShellGet
的正常运行副本,才能从中获取手动安装。
- 注意:您可能需要至少 一台 台计算机,该计算机已经具有