我在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-CimInstance
cmdlet,在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