2009-06-09 218 views
6

列表考慮以下WSH片段:JScript中枚舉和屬性

 
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 + ")"); 
} 

它打印在每行的打印機名稱,並在括號中的字「未定義」(因爲Status屬性沒有在p對象存在) 。問題是:如何列出p的所有可用屬性?與for (var i in p) {...}通常的技術不起作用 - 似乎p對象中的屬性不可枚舉。

在此先感謝。

回答

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

我認爲問題出在您的查詢中,您只需要提供姓名。試着問兩個名稱和狀態:

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); 
} 
+0

感謝您的回答,但我的問題是不是在查詢:)不管SELECT語句中,對對象的屬性是不可發現(與「爲」)和這是荒謬的:( – 2009-06-10 01:06:23

+0

「是的,我試着從F的SELECT * ROM Win32_Printer「,然後爲(我在p上)和打印我和p.i而沒有任何東西。但是我發佈的鏈接確實有你想要的所有屬性,所以也許只是把它們放在一個數組中以便讓它們出來。所有我測試過的都在那裏。 http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung 2009-06-10 01:47:46

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); 
    }); 
});