这是一个复杂的想法,我希望您能接受,因为它的发音很困难。

似乎有些WMI类具有可以查询的原始值,而另一些则不能。这具有实际意义。

演示1

Win32_Processor类为例。据我所知,它的原始值是其实例的DeviceID列的值。例如,这允许使用整齐的单行查询正在运行的操作系统的体系结构(32位/ 64位),例如以下JScript示例:

var arch = GetObject("winmgmts:root\\cimv2:Win32_Processor='cpu0'").AddressWidth

在该示例中,GetObject充当一种select instance where primitive value="cpu0"并返回单个实例,而不是集合。这按预期工作。

演示2

另一方面,Win32_OperatingSystem类没有我能够找到的原始值。与Win32_ProcessorDeviceID列相似,MSDN文档Win32_OperatingSystem声称CreationClassName列是表的key字段。

假定是可预测的CreationClassName=="Win32_OperatingSystem"。因此,可以推断出这样可以写出类似的单行代码:
var arch = GetObject("winmgmts:root\\cimv2:Win32_OperatingSystem='Win32_OperatingSystem'").OSArchitecture

但是,这会导致错误。 我尝试使用其他列值的尝试同样失败了。在类名和.columname之间追加=也会导致语法错误。

据我所知,即使不枚举所有实例,也无法标识Win32_OperatingSystem类的单个实例。
var wmi = GetObject("winmgmts:");
var os = wmi.ExecQuery("select OSArchitecture from Win32_OperatingSystem");
for (var res = new Enumerator(os); !res.atEnd(); res.moveNext()) {
    var arch = res.item().OSArchitecture;
}

这些行可以进行一些组合:
var os = GetObject("winmgmts:").ExecQuery("select OSArchitecture from Win32_OperatingSystem");
var arch = new Enumerator(os).item().OSArchitecture;

...但是直接在Win32_OperatingSystem中查询实例仍然很不错,而不必枚举令人讨厌的残留层次结构。

问题

如何预测WMI类是否具有可以查询的原始值,以及包含该值的列?

最佳答案

您要查找的是“密钥”属性。

http://blogs.msdn.com/b/powershell/archive/2008/04/15/wmi-object-identifiers-and-keys.aspx

10-07 23:08