这是一个复杂的想法,我希望你能忍受我,因为它的表达很困难。
似乎某些 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_Processor
类DeviceID
列一样,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 类是否具有可查询的原始值,以及哪一列包含该值?