Some tips of wmi scripting in jscript (1)
更新時(shí)間:2007年04月03日 00:00:00 作者:
集合的概念在windows腳本中很常用,尤其是在wmi方面的腳本中基本都會遇到集合操作。
在vbscript里遍歷集合的方法很簡單,F(xiàn)or Each循環(huán)就可以達(dá)到目的。但是在jscript中
如何使用集合,卻困擾了我很長時(shí)間,連msdn中都找不到好的例子,令我一度悲觀的認(rèn)為
jscript不能進(jìn)行集合操作。
在我?guī)缀蹩煲艞壍臅r(shí)候,又翻出一本vbscript wmi的電子書看了看,竟然找到了jscript
使用集合的方法,那就是Enumerator對象,該對象專門用作枚舉集合??吹竭@個(gè)對象你會
想到什么?是不是覺得很眼熟?如果你用jscript調(diào)用過FSO的話,如何枚舉Drives Files
和Folders的?FSO的例子里寫的明明白白,當(dāng)時(shí)使用的時(shí)候是否行尸走肉般的把例子搬到
你的程序里?當(dāng)時(shí)也會覺得奇怪它為什么遍歷一個(gè)集合要寫這么麻煩,可是就是沒有深究
為什么要這樣寫,那時(shí)因?yàn)槟銓?shù)組的那套行不通,jscript中遍歷集合只能如此。
這時(shí)候你可能還是有疑問,集合和數(shù)組有什么差別?引用MS腳本幫助里的原話:集合與數(shù)
組的不同點(diǎn)在于集合的成員不能直接訪問。不像處理數(shù)組時(shí)使用下標(biāo),這只能將當(dāng)前項(xiàng)目
指針移動到集合下一或前一元素。這里你想的深入一點(diǎn),可以這樣理解,數(shù)組就相當(dāng)于c
語言中的數(shù)組概念,是線性存儲空間,可以通過下標(biāo)很方便的訪問,而集合則是一種復(fù)雜
的數(shù)據(jù)結(jié)構(gòu),比如是一個(gè)鏈表,你訪問的話只能通過結(jié)點(diǎn)之間的指向關(guān)系來訪問前一個(gè)或
者后一個(gè)元素。
Enumerator的用法很簡單,把你要遍歷集合作為參數(shù)傳遞給Enumerator對象的構(gòu)造函數(shù)后,
你可以枚舉集合的成員,atEnd方法判斷是否已經(jīng)到結(jié)尾,moveFirst方法可以把指針移動
到第一個(gè)元素,moveNext方法把當(dāng)前的指針位置移動到下一個(gè)元素,通過item方法返回集
合中的單個(gè)元素。
例1:枚舉所有的驅(qū)動器
/**//*
* 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枚舉所有的進(jìn)程
/**//*
* 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同學(xué)討論vbscript和jscript之間的優(yōu)劣,vbscript在語言功能和代碼風(fēng)
格上比jscript要差很多,但是jscript也有些功能實(shí)現(xiàn)上的缺憾,比如沒有辦法進(jìn)行字節(jié)
操作,但是總的來說jscript是一個(gè)聰明的語言,從Enumerator就可以看出這一點(diǎn),赫赫。
在vbscript里遍歷集合的方法很簡單,F(xiàn)or Each循環(huán)就可以達(dá)到目的。但是在jscript中
如何使用集合,卻困擾了我很長時(shí)間,連msdn中都找不到好的例子,令我一度悲觀的認(rèn)為
jscript不能進(jìn)行集合操作。
在我?guī)缀蹩煲艞壍臅r(shí)候,又翻出一本vbscript wmi的電子書看了看,竟然找到了jscript
使用集合的方法,那就是Enumerator對象,該對象專門用作枚舉集合??吹竭@個(gè)對象你會
想到什么?是不是覺得很眼熟?如果你用jscript調(diào)用過FSO的話,如何枚舉Drives Files
和Folders的?FSO的例子里寫的明明白白,當(dāng)時(shí)使用的時(shí)候是否行尸走肉般的把例子搬到
你的程序里?當(dāng)時(shí)也會覺得奇怪它為什么遍歷一個(gè)集合要寫這么麻煩,可是就是沒有深究
為什么要這樣寫,那時(shí)因?yàn)槟銓?shù)組的那套行不通,jscript中遍歷集合只能如此。
這時(shí)候你可能還是有疑問,集合和數(shù)組有什么差別?引用MS腳本幫助里的原話:集合與數(shù)
組的不同點(diǎn)在于集合的成員不能直接訪問。不像處理數(shù)組時(shí)使用下標(biāo),這只能將當(dāng)前項(xiàng)目
指針移動到集合下一或前一元素。這里你想的深入一點(diǎn),可以這樣理解,數(shù)組就相當(dāng)于c
語言中的數(shù)組概念,是線性存儲空間,可以通過下標(biāo)很方便的訪問,而集合則是一種復(fù)雜
的數(shù)據(jù)結(jié)構(gòu),比如是一個(gè)鏈表,你訪問的話只能通過結(jié)點(diǎn)之間的指向關(guān)系來訪問前一個(gè)或
者后一個(gè)元素。
Enumerator的用法很簡單,把你要遍歷集合作為參數(shù)傳遞給Enumerator對象的構(gòu)造函數(shù)后,
你可以枚舉集合的成員,atEnd方法判斷是否已經(jīng)到結(jié)尾,moveFirst方法可以把指針移動
到第一個(gè)元素,moveNext方法把當(dāng)前的指針位置移動到下一個(gè)元素,通過item方法返回集
合中的單個(gè)元素。
例1:枚舉所有的驅(qū)動器
/**//*
* 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枚舉所有的進(jìn)程
/**//*
* 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同學(xué)討論vbscript和jscript之間的優(yōu)劣,vbscript在語言功能和代碼風(fēng)
格上比jscript要差很多,但是jscript也有些功能實(shí)現(xiàn)上的缺憾,比如沒有辦法進(jìn)行字節(jié)
操作,但是總的來說jscript是一個(gè)聰明的語言,從Enumerator就可以看出這一點(diǎn),赫赫。
您可能感興趣的文章:
- ASP小貼士/ASP Tips javascript tips可以當(dāng)桌面
- JavaScript Tips 使用DocumentFragment加快DOM渲染速度
- javascript tips提示框組件實(shí)現(xiàn)代碼
- JavaScript Title、alt提示(Tips)實(shí)現(xiàn)源碼解讀
- 新鮮出爐的js tips提示效果
- jQuery懸停文字提示框插件jquery.tooltipster.js用法示例【附demo源碼下載】
- JavaScript調(diào)試的多個(gè)必備小Tips
- bootstrap tooltips在 angularJS中的使用方法
- 總結(jié)分享10個(gè)JavaScript代碼優(yōu)化小tips
相關(guān)文章
JavaScript中undefined和null的區(qū)別
這篇文章主要介紹了 JavaScript中undefined和null的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-05-05
BootStrap使用file-input插件上傳圖片的方法
這篇文章主要介紹了BootStrap使用file-input插件上傳圖片的方法,bootstrap的圖片上傳框架 file-input 插件非常不錯(cuò),下面小編通過本文介紹下這個(gè)插件的使用方法,感興趣的朋友一起看看吧2016-09-09
D3.js實(shí)現(xiàn)散點(diǎn)圖和氣泡圖的方法詳解
這篇文章將會給大家介紹了另外兩種可視化圖表,利用D3.js實(shí)現(xiàn)散點(diǎn)圖和氣泡圖,文章通過多個(gè)方面介紹的非常詳細(xì),下面來一起看看吧。2016-09-09
javascript for循環(huán)設(shè)法提高性能
讓你的for循環(huán)提升性能的寫法,需要的朋友可以參考下。2010-02-02
js下將字符串當(dāng)函數(shù)執(zhí)行的方法
js下將字符串當(dāng)函數(shù)執(zhí)行的方法,需要的朋友可以參考下。2011-07-07
JavaScript實(shí)現(xiàn)一個(gè)簡易的計(jì)算器實(shí)例代碼
這篇文章主要介紹了JavaScript實(shí)現(xiàn)一個(gè)簡易的計(jì)算器實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助,一起跟隨小編過來看看吧2018-05-05

