Some tips of wmi scripting in jscript (1)


Posted in Javascript onApril 03, 2007

集合的概念在windows脚本中很常用,尤其是在wmi方面的脚本中基本都会遇到集合操作。
在vbscript里遍历集合的方法很简单,For Each循环就可以达到目的。但是在jscript中
如何使用集合,却困扰了我很长时间,连msdn中都找不到好的例子,令我一度悲观的认为
jscript不能进行集合操作。

在我几乎快要放弃的时候,又翻出一本vbscript wmi的电子书看了看,竟然找到了jscript
使用集合的方法,那就是Enumerator对象,该对象专门用作枚举集合。看到这个对象你会
想到什么?是不是觉得很眼熟?如果你用jscript调用过FSO的话,如何枚举Drives Files
和Folders的?FSO的例子里写的明明白白,当时使用的时候是否行尸走肉般的把例子搬到
你的程序里?当时也会觉得奇怪它为什么遍历一个集合要写这么麻烦,可是就是没有深究
为什么要这样写,那时因为你对数组的那套行不通,jscript中遍历集合只能如此。

这时候你可能还是有疑问,集合和数组有什么差别?引用MS脚本帮助里的原话:集合与数
组的不同点在于集合的成员不能直接访问。不像处理数组时使用下标,这只能将当前项目
指针移动到集合下一或前一元素。这里你想的深入一点,可以这样理解,数组就相当于c
语言中的数组概念,是线性存储空间,可以通过下标很方便的访问,而集合则是一种复杂
的数据结构,比如是一个链表,你访问的话只能通过结点之间的指向关系来访问前一个或
者后一个元素。

Enumerator的用法很简单,把你要遍历集合作为参数传递给Enumerator对象的构造函数后,
你可以枚举集合的成员,atEnd方法判断是否已经到结尾,moveFirst方法可以把指针移动
到第一个元素,moveNext方法把当前的指针位置移动到下一个元素,通过item方法返回集
合中的单个元素。

例1:枚举所有的驱动器

/**//*
* cscript ListDrive.js
*/
var oFSO = new ActiveXObject("Scripting.FileSystemObject");
var enDrives = new Enumerator(oFSO.Drives);
var oDrive;
while (! enDrives.atEnd()) {
    oDrive = enDrives.item();

    if (oDrive.IsReady) {
        WScript.Echo(oDrive.DriveLetter + ":");
    }

    enDrives.moveNext();
}
例2:通过wmi枚举所有的进程

/**//*
* cscript ListProcess.js
*/
var sComputerName = ".";
var oLoc = new ActiveXObject("WbemScripting.SWbemLocator");
var oSvc = oLoc.ConnectServer(sComputerName, "root\\cimv2");
var colItems = oSvc.ExecQuery("SELECT * FROM Win32_Process");
var enProcesses = new Enumerator(colItems);

while (! enProcesses.atEnd()) {
    WScript.Echo(enProcesses.item().Name);
    enProcesses.moveNext();
}

前几天还和Long同学讨论vbscript和jscript之间的优劣,vbscript在语言功能和代码风
格上比jscript要差很多,但是jscript也有些功能实现上的缺憾,比如没有办法进行字节
操作,但是总的来说jscript是一个聪明的语言,从Enumerator就可以看出这一点,赫赫。

Javascript 相关文章推荐
浅析js封装和作用域
Jul 09 Javascript
jquery二级导航内容均分的原理及实现
Aug 13 Javascript
用JS实现3D球状标签云示例代码
Dec 01 Javascript
JavaScript中的原始值和复杂值
Jan 07 Javascript
使用Javascript监控前端相关数据的代码
Oct 27 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
Nov 21 Javascript
基于Vue插入视频的2种方法小结
Apr 02 Javascript
详解小程序input框失焦事件在提交事件前的处理
May 05 Javascript
js实现录音上传功能
Nov 22 Javascript
JavaScript实现简单计算器
Mar 19 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
Jul 22 Javascript
详解CocosCreator消息分发机制
Apr 16 Javascript
记录几个javascript有关的小细节
Apr 02 #Javascript
新浪刚打开页面出来的全屏广告代码
Apr 02 #Javascript
js prototype 格式化数字 By shawl.qiu
Apr 02 #Javascript
JXTree对象,读取外部xml文件数据,生成树的函数
Apr 02 #Javascript
新浪中用来显示flash的函数
Apr 02 #Javascript
我也种棵OO树JXTree[js+css+xml]
Apr 02 #Javascript
javascript中获取选中对象的类型
Apr 02 #Javascript
You might like
一个查看session内容的函数
2006/10/09 PHP
PHP4实际应用经验篇(3)
2006/10/09 PHP
MYSQL环境变量设置方法
2007/01/15 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
Aster vs Newbee BO3 第二场2.18
2021/03/10 DOTA
理解JavaScript的prototype属性
2012/02/11 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
Javascript复制实例详解
2016/01/28 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
js实现图片360度旋转
2017/01/22 Javascript
jQuery事件详解
2017/02/23 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
webpack+vue+express(hot)热启动调试简单配置方法
2018/09/19 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python生成随机验证码(中文验证码)示例
2014/04/03 Python
Python中常见的数据类型小结
2015/08/29 Python
python中实现k-means聚类算法详解
2017/11/11 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
篮球社团活动总结
2014/06/27 职场文书
关于教师节的广播稿
2014/09/10 职场文书
期末个人总结范文
2015/02/13 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
建国大业观后感800字
2015/06/01 职场文书
工作证明格式范文
2015/06/15 职场文书
重阳节活动主持词
2015/07/04 职场文书