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 相关文章推荐
浅谈tudou土豆网首页图片延迟加载的效果
Jun 23 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
Jul 31 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
Jan 16 Javascript
js 控制下拉菜单刷新的方法
Mar 03 Javascript
Javascript中获取对象的原型对象的方法小结
Feb 25 Javascript
jQuery简单实现图片预加载
Apr 20 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
Jul 02 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
vue中实现在外部调用methods的方法(推荐)
Feb 08 Javascript
JavaScript中严格判断NaN的方法
Feb 16 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
Aug 10 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
用PHP调用数据库的存贮过程
2006/10/09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
浅说js变量
2011/05/25 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
Python守护进程(daemon)代码实例
2015/03/06 Python
python访问抓取网页常用命令总结
2017/04/11 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
医护人员英文求职信范文
2013/11/26 职场文书
创业计划书——互联网商机
2014/01/12 职场文书
新浪微博实习心得体会
2014/01/27 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
手把手教你导入Go语言第三方库
2021/08/04 Golang