这是一个复杂的想法,我希望您能接受,因为它的发音很困难。
似乎有些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类是否具有可以查询的原始值,以及包含该值的列?
最佳答案
您要查找的是“密钥”属性。
http://blogs.msdn.com/b/powershell/archive/2008/04/15/wmi-object-identifiers-and-keys.aspx