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关闭当前页面(窗口)的几种方式总结
Mar 05 Javascript
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
May 16 Javascript
JavaScript 继承详解(六)
Oct 11 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
Dec 06 Javascript
JS实现淡入淡出图片效果的方法分析
Dec 20 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
Feb 27 Javascript
Javascript之图片的延迟加载的实例详解
Jul 24 Javascript
详解React 在服务端渲染的实现
Nov 16 Javascript
vue实现购物车抛物线小球动画效果的方法详解
Feb 13 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
Apr 11 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 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
JS动态调用方法名示例介绍
2013/12/18 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
Node.js进阶之核心模块https入门
2018/05/23 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
使用JavaScript解析URL的方法示例
2019/03/01 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
python如何把嵌套列表转变成普通列表
2018/03/20 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
python制作图片缩略图
2019/04/30 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
python中wx模块的具体使用方法
2020/05/15 Python
Python 多进程、多线程效率对比
2020/11/19 Python
Linux文件系统类型
2012/09/16 面试题
如何用JQuery进行表单验证
2013/05/29 面试题
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
公司委托书格式范文
2014/04/04 职场文书
欢迎横幅标语
2014/06/17 职场文书
推普周活动总结
2014/08/28 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书