6

考虑以下 WSH 片段:

var query = GetObject("winmgmts:").ExecQuery("SELECT Name FROM Win32_Printer", "WQL", 0);
var e = new 枚举器(查询);
for ( ; !e.atEnd(); e.moveNext ()) {
    var p = e.item();
    WScript.Echo(p.Name + " (" + p.Status + ")");
}

它在每一行打印一个打印机名称和括号中的单词“未定义”(因为对象Status中不存在p属性)。问题是:我如何列出所有可用的属性p?通常的技术for (var i in p) {...}不起作用——p对象中的属性似乎是不可枚举的。

提前致谢。

4

3 回答 3

10

JScript 的for...in语句与 WMI 对象不兼容,因为它们比原生 JScript 对象更复杂。WMI 对象通过特殊属性公开其属性集合Properties_,因此要列出对象的所有可用属性,您需要枚举此集合,就像枚举查询结果以访问单个 WMI 对象一样。每个对象属性都由一个SWbemProperty具有 和其他属性的对象表示NameValue这些属性提供有关适当对象属性的信息。

这个例子应该可以帮助你理解:

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类的关键属性,因此也会检索它以唯一标识类实例。

于 2009-06-10T07:22:07.543 回答
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);
    });
});
于 2010-11-16T06:59:04.753 回答
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,两者都有文本或至少为空。

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);
}
于 2009-06-10T00:10:24.607 回答