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 相关文章推荐
JavaScript 对象、函数和继承
Jul 07 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
Oct 11 Javascript
js获取客户端外网ip的简单实例
Nov 21 Javascript
jQuery中:nth-child选择器用法实例
Dec 31 Javascript
浅析JS运动
Dec 28 Javascript
JQuery 设置checkbox值二次无效的解决方法
Jul 22 Javascript
原生js编写焦点图效果
Dec 08 Javascript
Vue中的v-cloak使用解读
Mar 27 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
Apr 26 Javascript
微信小程序自定义组件实现tabs选项卡功能
Jul 14 Javascript
vue实现输入一位数字转汉字功能
Dec 13 Javascript
关于vue-cli3打包代码后白屏的解决方案
Sep 02 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函数func_num_args用法实例分析
2015/12/07 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
prototype Element学习笔记(篇一)
2008/10/26 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
js查错流程归纳
2012/05/04 Javascript
在jQuery中 关于json空对象筛选替换
2013/04/15 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
谷歌地图打不开的解决办法
2014/08/07 Javascript
jquery处理json对象
2014/11/03 Javascript
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
2018/09/14 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
Python 合并多个TXT文件并统计词频的实现
2019/08/23 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
咖啡馆创业计划书
2014/01/26 职场文书
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
初中学校军训方案
2014/05/09 职场文书
就职演讲稿范文
2014/05/19 职场文书
求职信模板
2014/05/23 职场文书
美食节策划方案
2014/05/26 职场文书
2015年司法所工作总结
2015/04/27 职场文书
2015年库房工作总结
2015/04/30 职场文书