質問

次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 + ")");
}
Statusプロパティがpオブジェクト内に存在しないため)

これは、括弧内のすべての行にプリンタ名と単語「未定義」を印刷します。質問です:私はpから利用可能なすべてのプロパティを一覧表示することができますか? for (var i in p) {...}との通常の手法は動作しません - pオブジェクトのプロパティが列挙されないようです。

事前に感謝します。

役に立ちましたか?

解決

まあ、彼らはネイティブのJScriptオブジェクトよりも複雑です、ので、

のJScriptのfor...inステートメントは、WMIオブジェクトと互換性がありません。 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プロパティ値を表示することに注意してください。

他のヒント

あなたが明示的に列挙子を使用すると、1つを必要とするコレクションオブジェクトを反復処理する必要があるたびに使用する必要性を回避したい場合は、あなたがこのような小さなヘルパー関数を定義することができます:

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

私はこの問題は、あなただけの名前のために求めているクエリであると思います。名前とステータスの両方を求めてみます:

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);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top