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的2种继承方式详解
Mar 04 Javascript
JQuery弹出层示例可自定义
May 19 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 Javascript
jquery无限级联下拉菜单简单实例演示
Nov 23 Javascript
jquery实现树形菜单完整代码
Dec 29 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
Jul 07 Javascript
浅谈在koa2中实现页面渲染的全局数据
Oct 09 Javascript
JS实现带导航城市列表以及输入搜索功能
Jan 04 Javascript
Vue Prop属性功能与用法实例详解
Feb 23 Javascript
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
记录几个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
php与Mysql的一些简单的操作
2015/02/26 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
js识别不同浏览器基于userAgent做判断
2014/07/29 Javascript
jquery实现submit提交表单
2015/02/03 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
python获取图片颜色信息的方法
2015/03/18 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
python爬取抖音视频的实例分析
2021/01/19 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
教育专业个人求职信
2013/12/02 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书