考虑以下WSH代码段:
var query = GetObject("winmgmts:").ExecQuery("SELECT Name FROM Win32_Printer", "WQL", 0); var e = new Enumerator(query); for ( ; !e.atEnd(); e.moveNext ()) { var p = e.item(); WScript.Echo(p.Name + " (" + p.Status + ")"); }
它在每一行打印一个打印机名称和括号中的“undefined”一词(因为Status
对象中不存在p
属性。问题是:如何列出p
的所有可用属性?使用for (var i in p) {...}
的常用技术不起作用 - 似乎p
对象中的属性不可枚举。
提前致谢。
答案 0 :(得分:10)
JScript的for...in
语句与WMI对象不兼容,因为它们比本机JScript对象更复杂。 WMI对象通过特殊的Properties_
属性公开其属性集合,因此要列出对象的所有可用属性,您需要枚举此集合,就像枚举查询结果以访问单个WMI对象一样。每个对象属性由SWbemProperty
对象表示,该对象具有Name
,Value
和其他属性,提供有关相应对象属性的信息。
这个例子可以帮助你理解:
var query = GetObject("winmgmts:").ExecQuery("SELECT Name, Status FROM Win32_Printer");
var colPrinters = new Enumerator(query);
var oPrinter, colProps, p;
// Enumerate WMI objects
for ( ; !colPrinters.atEnd(); colPrinters.moveNext()) {
oPrinter = colPrinters.item();
// Enumerate WMI object properties
colProps = new Enumerator(oPrinter.Properties_);
for ( ; !colProps.atEnd(); colProps.moveNext()) {
p = colProps.item();
WScript.Echo(p.Name + ": " + p.Value);
}
}
请注意,此脚本还将显示DeviceID
属性值,因为它是Win32_Printer
类的关键属性,因此也会检索它以便唯一标识类实例。
答案 1 :(得分:6)
如果您希望每次需要迭代需要迭代的集合对象时都不需要使用显式枚举器,那么您可以定义一个小辅助函数,如下所示:
function forEach(collection, func) {
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
func(e.item());
}
}
对集合的迭代变得不那么笨拙了:
var queryResult = GetObject("winmgmts:").ExecQuery("SELECT Name, Status FROM Win32_Printer");
// Enumerate WMI objects
forEach (queryResult, function (oPrinter) {
// Enumerate WMI object properties
forEach (oPrinter.Properties_, function (p) {
WScript.Echo(p.Name + ": " + p.Value);
});
});
答案 2 :(得分:1)
我认为问题出在您的查询中,您只需要提供名称。尝试询问姓名和状态:
var query = GetObject("winmgmts:").ExecQuery("SELECT Name, Status FROM Win32_Printer", "WQL", 0);
var e = new Enumerator(query);
for ( ; !e.atEnd(); e.moveNext ()) {
var p = e.item();
WScript.Echo(p.Name + " (" + p.Status + ")" );
}
我从http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx获得了更多属性,还有一些属性。我查询了DriverName和Comment,并且都有文本或至少为null。
var query = GetObject("winmgmts:").ExecQuery("SELECT Name, Status, DriverName, Comment FROM Win32_Printer", "WQL", 0);
var e = new Enumerator(query);
for ( ; !e.atEnd(); e.moveNext ()) {
var p = e.item();
WScript.Echo(p.Name + " (" + p.Status + ") " + p.DriverName + " " + p.Comment);
}