2009-06-09 10 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 बयान है, क्योंकि अच्छी तरह से, वे देशी JScript वस्तुओं की तुलना में अधिक जटिल हैं, WMI वस्तुओं के साथ संगत नहीं है। 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 वर्ग का एक प्रमुख संपत्ति है, तो यह भी विशिष्ट करने के लिए लिया गया है कक्षा के उदाहरणों की पहचान करें।

+0

Класс। Спасибо! –

+0

@ हेनरीफ्लॉवर जितना मुझे लगता है कि उन सिरिलिक अक्षरों को यहां अंग्रेजी में लिखना सबसे अच्छा है :) वैसे, मुझे नहीं लगता कि रूस से "हेनरी फ्लॉवर" होगा! –

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 और टिप्पणी के लिए पूछताछ की और दोनों में टेक्स्ट या कम से कम एक शून्य थी।

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 कथन के बावजूद, पी ऑब्जेक्ट के गुणों को नहीं खोज योग्य और ("के लिए" के साथ) यह हास्यास्पद है :( –

+0

"हाँ, मैंने एफ से चयन * की कोशिश की रॉम Win32_Printer "और फिर (i में पी) और मुद्रण I और p.i के लिए कर रहा है और कुछ भी नहीं मिला। लेकिन मेरे द्वारा पोस्ट किए गए लिंक में आपके द्वारा इच्छित सभी विशेषताओं में से एक है, इसलिए शायद उन्हें बाहर निकालने के लिए उन्हें एक सरणी में रखें। मैंने जो परीक्षण किया वह सब वहां थे। http://msdn.microsoft.com/en-us/library/aa394363(VS.85).aspx – artlung

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); 
    }); 
}); 
संबंधित मुद्दे