我正在尝试利用需要安装模块的 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
模块来解决这个问题,这产生了暗示这一点的错误。
删除该环境变量后,它似乎可以工作。
答案 0 :(得分:1)
正如您自己发现的那样,是机器级环境变量 __PSLockDownPolicy
的存在阻止了 Install-Module
运行(有关一般先决条件,请参见下文)。< /p>
这个未记录环境变量,仅在Windows上有效,出于安全原因,只有在机器上定义时才会受到尊重 em> 级别通过注册表(而不是作为每个用户或特定于进程的变量)并且可用于限制 PowerShell 会话中允许的内容。
值 4
到 7
导致 PowerShell 在受限语言模式下运行,其中只能使用少数预先批准的 .NET 类型 strong>,因此会阻止加载包含 PowerShellGet
的 Install-Module
模块 - 请参阅概念性 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
向您展示了真正的问题不是{{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 中。
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
的机器级定义以包含适用的目录。如果您的计算机不满足这些条件,您有两个选择:
如果可以,upgrade the Windows PowerShell version to v5.1 或切换到 PowerShell (Core)。
或者 - 如果您的 Windows PowerShell 版本是 3 或 4 - 根据 official instructions 安装Advanced
手动。
Environment Variables...
副本的计算机才能进行手动安装。