Zso*_*nar 13 powershell wmi cim powershell-core
尝试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`
Run Code Online (Sandbox Code Playgroud)
mkl*_*nt0 21
Gert Jan Kraaijeveld 的有用回答为真正仅在Windows PowerShell中可用(不在 PowerShell [Core] 6+ 中)的cmdlet 提供了解决方案。
但是,在这种特殊情况下,正如 Lee_Daily 在评论中指出的,您可以使用Get-CimInstance
cmdlet,它也 可以在 PowerShell [Core] 6+ 中使用:
Get-CimInstance CIM_Product | Select-Object Name, PackageCache
Run Code Online (Sandbox Code Playgroud)
注意CIM_Product
类名;CIM 类通常具有与其Win32_*
对应的 WMI 类相同的属性。
在 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
.
据我所知,唯一的方法是兼容性模块。这是微软的一个非常简洁的模块,它实际上通过隐式远程处理到同一台机器上的 Windows Powershell 5.1 会话,使 Windows PS cmdlet 在 PS Core 中可用。https://github.com/PowerShell/WindowsCompatibility
归档时间: |
|
查看次数: |
6778 次 |
最近记录: |