PowerShell Invoke-CimMethod直接调用报类型不匹配管道调用正常原因咨询
两种CIM方法调用模式的差异底层原因
管道传入实例调用的自动类型转换逻辑
当你通过Get-CimInstance获取CIM实例后通过管道传给Invoke-CimMethod时,返回的实例对象本身已经携带了所属类的完整元数据,包含目标方法的所有参数类型定义信息。Invoke-CimMethod会基于这些元数据,自动把你传入Arguments哈希表中的PowerShell默认类型值(比如不带类型声明的数字默认是Int32类型),隐式转换为方法要求的对应CIM类型,比如Port要求的UInt16、OverrideExisting要求的UInt32,因此不会出现类型不匹配问题。直接指定类名调用的类型处理逻辑
当你直接给Invoke-CimMethod指定-Namespace和-ClassName参数调用时,cmdlet默认不会主动向CIM服务请求拉取对应类的方法元数据,只会将Arguments哈希表中值的原生.NET类型直接序列化后发送给CIM服务。PowerShell中无类型声明的数字字面量默认都是Int32类型,和Port要求的UInt16、OverrideExisting要求的UInt32类型不匹配,因此会连续抛出类型不匹配错误。
如果你需要直接指定类名调用,只需要将所有数字类型的参数都显式转换为方法要求的对应类型即可,示例如下:
Invoke-CimMethod -Namespace "root/CIMV2/TerminalServices" -ClassName "Win32_TSGatewayServerSettings" -MethodName "SetIPAndPort" -Arguments @{ TransportType = [uint32]1 IPAddress = "*" Port = [uint16]4443 OverrideExisting = [uint32]1 }
内容的提问来源于stack exchange,提问作者me1299
相关产品推荐
相关产品推荐

