尝试在PowerShell(版本6)中使用get-WmiObject
命令时出现以下错误:
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`
答案 0 :(得分:2)
据我所知,唯一的方法是兼容性模块。这是微软一个非常整洁的模块,实际上隐含远程在同一台机器上的Windows PowerShell 5.1会话的方式使得PS核心可用的Windows PS的cmdlet。 https://github.com/PowerShell/WindowsCompatibility
答案 1 :(得分:1)
Gert Jan Kraaijeveld's helpful answer为cmdlet提供了解决方案,这些cmdlet仅在 Windows PowerShell 中才可用(在PowerShell Core 中也不可用)。
但是,在这种特殊情况下,正如Lee_Daily在评论中指出的那样,您可以使用Get-CimInstance
cmdlet , 在PowerShell Core(v6 + ):
Get-CImInstance CIM_Product | Select-Object Name, PackageCache
注意CIM_Product
类名; CIM类通常与WMI Win32_*
对应类具有相同的属性。
实际上,即使在Windows PowerShell中也建议使用CIM(*-Cim*
)cmdlet ,因为自引入以来,WMI(*-Wmi*
)cmdlet已被弃用。版本3中的CIM cmdlet;来自Get-CimInstance
docs:
从Windows PowerShell 3.0开始,此cmdlet已被
Get-CimInstance
取代。
对于 为什么 CIM cmdlet是更好的选择(引自this TechNet blog post):
WMI cmdlet的最大缺点是它们使用DCOM访问远程计算机。 DCOM对防火墙不友好,可以被网络设备阻止,并在出现问题时发出一些不可思议的错误。
同一篇博客文章还介绍了CIM cmdlet的方式:
使用与PowerShell本身(WS-Management)相同的基于基于标准的远程处理机制
已支持会话
功能与过时的WMI同行略有不同,因为他们没有直接的方法; 方法必须使用Invoke-CimMethod
来调用。