Powershell 6的哪个库包含get-wmiobject命令



我在PowerShell(版本6)中尝试使用get-WmiObject命令时收到以下错误:

PS C:Userszsofi> 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`

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

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

Get-CimInstance CIM_Product | Select-Object Name, PackageCache

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

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

在PowerShellCore中,所有未来的开发工作都将进行,CIM cmdlet是您唯一的选择,但即使在Windows PowerShell中也建议使用CIM(*-Cim*)cmdlet,因为WMI(*-Wmi*)cmdlet在引入CIM cmdlet的PowerShell版本3(2012年9月发布)中已被弃用;来自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调用,删除实例需要Remove-CimInstance

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

最新更新