t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

JScriptでfor eachの代わりになるEnumeratorオブジェクト

【注意】JScript限定です。JavaScriptでは使えません。

先日、JScriptで起動中のIEからURLを取得するコードを書いた。
thom.hateblo.jp

本当はVBSのFor Eachみたいなもので数を意識せずにループしたかったが、色々調べながらやってみたものの同じような処理はできず、結局sh.Windows().Countを取って0番目のアイテムからループさせた。

以下、うまくいかなかっった方法。

for each (var i in sh.Windows()) { 
for (var i in sh.Windows()) { 
for (var i of sh.Windows()) {

ところが今日別の調べものをしていて偶然そのEnumeratorオブジェクトというものを見つけた。
Enumerator オブジェクト (JavaScript)

読み方は、イニュメレーター。

For Eachのようにとはいかないが、これを使えば数がいくつあるかを意識せずにループを回せる。
これはMicrosoftJScript独自の実装のようで、一般的なWebページのJavaScriptなどでは使用するとIE以外のブラウザではうまく動かない。

ただ今回のようにWSHで使うにはうってつけだった。

使い方はMSDNよりも以下の記事が分かりやすい。
d.hatena.ne.jp


できたコードはこちら。

ie();

function ie() {
    var sh = WScript.CreateObject("Shell.Application");
    var e = new Enumerator(sh.Windows());
    e.moveFirst();
    while(e.atEnd() == false) {
        var a = "";
        try {
            a = e.item().document.URL;
        } catch(er) {
        }
        if(a) WScript.echo(a);
        e.moveNext();
    }
}

もともとWSH自体、本来のWebで使用するJavaScriptとは違う分野の処理なので、こうしたJScriptならではの機能は嬉しい。
まあ、そういうのはVBSでやれよって話なんだろうけど。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。