17

尝试get-WmiObject在 PowerShell(版本 6)中使用该命令时出现以下错误:

PS C:\Users\zsofi> Get-WmiObject Win32_product | select name, packagecache

Get-WmiObject : The term 'Get-WmiObject' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ Get-WmiObject Win32_product | select name, packagecache
+ ~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (Get-WmiObject:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException`
4

2 回答 2

30

Gert Jan Kraaijeveld 的有用答案为真正仅在Windows PowerShell中可用的 cmdlet 提供了解决方案(在 PowerShell [Core] 6+ 中也不可用)。

然而,在这种特殊情况下,正如 Lee_Daily 在评论中指出的那样,您可以使用
Get-CimInstancecmdlet
,它在 PowerShell [Core] 6+ 中也可用

Get-CimInstance CIM_Product | Select-Object Name, PackageCache

注意CIM_Product类名;CIM 类通常具有与其对应的 WMI 相同的属性Win32_*

为什么通常应该使用 CIM cmdlet 而不是 WMI cmdlet:

在 PowerShell Core中,CIM cmdlet 是您唯一的选择,但即使在Windows PowerShell中也建议使用 CIM (*-Cim* ) cmdlet ,因为WMI ( *-Wmi*) cmdlet在 PowerShell 版本 3(已发布2012 年 9 月),当时引入了 CIM cmdlet;来自Get-CimInstance文档

从 Windows PowerShell 3.0 开始,此 cmdlet 已被Get-CimInstance.

至于为什么CIM cmdlet 是更好的选择(引自TechNet 博客文章):

WMI cmdlet 的最大缺点是它们使用 DCOM 来访问远程计算机。DCOM 对防火墙不友好,可能会被网络设备阻止,并且在出现问题时会给出一些神秘的错误。

同一篇博文还描述了 CIM cmdlet 如何:

  • 使用与PowerShell 本身相同的基于标准的远程处理机制(WS-Management,通过其 Windows 实现WinRM

    • 也就是说,为 PowerShell 远程处理设置的计算机(请参阅about_Remote_Requirements)隐式支持通过 CIM cmdlet 进行定位。

    • 但是,您仍然可以使用New-CimSessionOption cmdlet 在选择加入的基础上使用 DCOM 协议(就像 WMI cmdlet 所做的那样)。

  • 支持会话

  • 功能与过时的 WMI 对应物略有不同,因为返回的对象没有直接的方法;方法必须通过调用Invoke-CimMethod

于 2019-02-03T21:59:09.657 回答
6

据我所知,唯一的方法是兼容性模块。这是 Microsoft 的一个非常简洁的模块,它实际上通过隐式远程处理到同一台机器上的 Windows Powershell 5.1 会话,使 Windows PS cmdlet 在 PS Core 中可用。https://github.com/PowerShell/WindowsCompatibility

于 2019-02-02T18:44:06.107 回答