似乎无法识别类型

时间:2017-05-18 19:04:04

标签: powershell

模仿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#root\cimv2\Win32_BIOS]
Unable to find type [System.Management.ManagementObject#root\cimv2\Win32_BIOS].
At line:1 char:1
+ (Get-WMIObject -Class Win32_BIOS) -is [System.Management.ManagementOb ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Manageme...imv2\Win32_BIOS:TypeName)
    [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

在相关的说明中,每个目的的目的是什么?

PS C:\> Get-TypeData | Where-Object {$_.TypeName -like '*Win32_BIOS' }

TypeName                                                              Members
--------                                                              -------
System.Management.ManagementObject#root\cimv2\Win32_BIOS              {}
Microsoft.Management.Infrastructure.CimInstance#root/cimv2/Win32_BIOS {}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

...假设

PS> $bios = Get-WmiObject -Class Win32_BIOS

...您可以使用__CLASS system property来测试像这样的对象的特定WMI类...

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

......或者......

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

您也可以测试命名空间只是为了确实确保您拥有合适的类:

PS> $bios.__NAMESPACE -eq 'root\cimv2' -and $bios.__CLASS -eq 'Win32_BIOS'
True

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

,以下内容也会失败
PS> $bios.__CLASS -eq 'CIM_BIOSElement'
False

$bios | Get-Member显示System.Management.ManagementObject#root\cimv2\Win32_BIOS作为类型名称的原因是因为Win32_BIOS及其继承链已添加到TypeNames property ...

PS> $bios.PSObject.TypeNames
System.Management.ManagementObject#root\cimv2\Win32_BIOS
System.Management.ManagementObject#root\cimv2\CIM_BIOSElement
System.Management.ManagementObject#root\cimv2\CIM_SoftwareElement
System.Management.ManagementObject#root\cimv2\CIM_LogicalElement
System.Management.ManagementObject#root\cimv2\CIM_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