似乎无法识别类型



Get-Help about_Type_Operators 中的示例为模型:

PS C:> (get-culture) -is [System.Globalization.CultureInfo]
True

我正在尝试用不同类型的方法做同样的事情。为什么会失败?我从 Get-TypeData 的输出中复制了类型名称。

(对于使用is而不是-is的原始问题,我深表歉意。

这个建议没有奏效。

PS C:> (Get-WMIObject -Class Win32_BIOS) -is [System.Management.ManagementObject#rootcimv2Win32_BIOS]
Unable to find type [System.Management.ManagementObject#rootcimv2Win32_BIOS].
At line:1 char:1
+ (Get-WMIObject -Class Win32_BIOS) -is [System.Management.ManagementOb ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Manageme...imv2Win32_BIOS:TypeName)
    [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

与此相关的是,这些的目的是什么?

PS C:> Get-TypeData | Where-Object {$_.TypeName -like '*Win32_BIOS' }
TypeName                                                              Members
--------                                                              -------
System.Management.ManagementObject#rootcimv2Win32_BIOS              {}
Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_BIOS {}

假设...

PS> $bios = Get-WmiObject -Class Win32_BIOS

。可以使用 __CLASS 系统属性来测试对象的特定 WMI 类,如下所示...

PS> $bios.__CLASS -eq 'Win32_BIOS'
True

。或者这个...

PS> $bios.SystemProperties['__CLASS'].Value -eq 'Win32_BIOS'
True

你也可以测试命名空间,以确保你得到了正确的类:

PS> $bios.__NAMESPACE -eq 'rootcimv2' -and $bios.__CLASS -eq 'Win32_BIOS'
True

请注意,上面的比较与-is不完全相同,因为您正在测试确切的类,而-is考虑了类层次结构。 也就是说,即使从CIM_BIOSElement继承Win32_BIOS,以下内容也会失败:

PS> $bios.__CLASS -eq 'CIM_BIOSElement'
False

$bios | Get-Member之所以将System.Management.ManagementObject#rootcimv2Win32_BIOS显示为类型名称,是因为Win32_BIOS及其继承链已添加到TypeNames属性中......

PS> $bios.PSObject.TypeNames
System.Management.ManagementObject#rootcimv2Win32_BIOS
System.Management.ManagementObject#rootcimv2CIM_BIOSElement
System.Management.ManagementObject#rootcimv2CIM_SoftwareElement
System.Management.ManagementObject#rootcimv2CIM_LogicalElement
System.Management.ManagementObject#rootcimv2CIM_ManagedSystemElement
System.Management.ManagementObject#Win32_BIOS
System.Management.ManagementObject#CIM_BIOSElement
System.Management.ManagementObject#CIM_SoftwareElement
System.Management.ManagementObject#CIM_LogicalElement
System.Management.ManagementObject#CIM_ManagedSystemElement
System.Management.ManagementObject
System.Management.ManagementBaseObject
System.ComponentModel.Component
System.MarshalByRefObject
System.Object

实际类型仍在ManagementObject...

PS> $bios.GetType().FullName
System.Management.ManagementObject
您使用

字符串is作为比较运算符;但是,所有比较运算符都以连字符开头,因此您应该使用 -is(Get-WMIObject -Class Win32_BIOS) -is [System.Management.ManagementObject...]

最新更新