Abr*_*ala 2 powershell wmi cim powershell-5.1
可能是一个愚蠢的问题,但我只是好奇。
为该类下的应用程序调用卸载时Get-CIMInstance和调用卸载时有区别吗?我问的唯一原因是:Get-WMIObjectWin32_Product
Get-CIMInstance卸载应用程序时,将使用某些程序重新启动我的计算机。Get-WMIObject卸载应用程序无需重新启动即可运行。另外,将 a 管道连接Get-Member到任何Get-CIMInstance产品,并没有给我卸载的方法,但它确实使用Get-WMIObject. 开发者就是这么写的吗?虽然,Invoke-CIMMethod -Name Uninstall仍然有效。
Get-CIMInstance这是我使用/卸载多个应用程序时所做的操作Invoke-CIMMethod -Name Uninstall:
Get-CimInstance -ClassName win32_product | Where-Object Name -Match "Visual" |
ForEach-Object -Process {
Invoke-CimMethod -InputObject $_ -Name Uninstall
}
#Methods Returned
<#
Get-CimInstance -ClassName win32_product | Where-Object Name -Match "Visual" | Get-Member -MemberType Method
TypeName: Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_Product
Name MemberType Definition
---- ---------- ----------
Clone Method System.Object ICloneable.Clone()
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
GetCimSessionComputerName Method string GetCimSessionComputerName()
GetCimSessionInstanceId Method guid GetCimSessionInstanceId()
GetHashCode Method int GetHashCode()
GetObjectData Method void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Ser...
GetType Method type GetType()
ToString Method string ToString()
#>
Run Code Online (Sandbox Code Playgroud)
Get-WMIObject -ClassName win32_product | Where-Object Name -Match "Visual" |
ForEach-Object -Process {
Invoke-WMIMethod -InputObject $_ -Name Uninstall
}
#Methods Returned
<#
Get-WMIObject -Class win32_product | Where-Object Name -Match "Visual" | Get-Member -MemberType Method
TypeName: System.Management.ManagementObject#root\cimv2\Win32_Product
Name MemberType Definition
---- ---------- ----------
Configure Method System.Management.ManagementBaseObject Configure(System.UInt16 InstallState, System.UInt16 InstallLevel, S...
Reinstall Method System.Management.ManagementBaseObject Reinstall(System.UInt16 ReinstallMode)
Uninstall Method System.Management.ManagementBaseObject Uninstall()
Upgrade Method System.Management.ManagementBaseObject Upgrade(System.String PackageLocation, System.String Options)
#>
Run Code Online (Sandbox Code Playgroud)
请原谅这篇长文,只是出于好奇。
如果不允许,请删除/关闭。
使用 WMI cmdlet 和较新的 CIM cmdlet 之间存在很多差异。 Get-WMIObject在 Windows PowerShell 中已弃用,并已从 PowerShell Core 中删除,因此一般建议使用 CIM。不过,这些方法的行为不应有所不同,因此我无法解释您提到的重新启动行为。
Get-CimInstance don't have the methods, but you can pass them to Invoke-CimMethod`返回的对象。
$instance = Get-CimInstance win32_process -Filter "Name = 'powershell_ise.exe'"
$instance | Invoke-CimMethod -MethodName 'Terminate'
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法发现方法Get-CimClass
(Get-CimClass win32_process ).CimClassMethods
Run Code Online (Sandbox Code Playgroud)
-Arguments如果您需要给定方法的参数,则可以使用哈希表作为参数通过参数传递它们。您可以在帮助文件或此处找到示例
您也可以直接使用 Invoke-WMIMethod:
Invoke-CimMethod -Query "SELECT * FROM Win32_Process WHERE Name = 'powershell_ise.exe'" -MethodName Terminate
Run Code Online (Sandbox Code Playgroud)
我通常不会这样做,因为-Filter与 一起使用会稍微不那么冗长-CLassName,并且-Filter与 一起使用时丢失不可用Invoke-CimMethod但是,这些只是个人喜好。
我建议您也阅读CIM Cmdlet 简介
此外,Win32_Product 的声誉也很差。如果你用谷歌搜索,你可以获得更多信息,但这是我通过一些问题很快找到的一篇文章:Why Win32_Product is Bad News
作为一般规则,您应该将过滤移到命令中的左侧。使用-Query或-Filter参数,而不是获取所有实例并Where{}随后使用 a 。特别是考虑 Win32_Product 的已知性能问题。
| 归档时间: |
|
| 查看次数: |
6055 次 |
| 最近记录: |