1. VBS介紹
VBS是一種Windows腳本,全稱是 : Microsoft Visual Basic ScriptEdition.
VBS是VisualBasic的的一個抽象子集,是系統內置的,用它編寫的腳本代碼不能編譯成二進制文件,直接由Windows系統執行(實際是一個叫做宿主host的解釋源代碼並執行),高效、易學,但是大部分高級語言能幹的事情,它基本上都具備,它可以使各種各樣的任務自動化,可以使你從重複瑣碎的工作中解脫出來,極大的提高工作效率。
Vbs腳本其實就是一種計算機編程語言,但是由於缺少計算機程序設計語言中的部分要素,對於事件的描述能力較弱,所以稱爲腳本,它最方便的地方就是提供了對COM對象的簡便支持。那麼什麼是COM對象呢?
COM對象就是一些具有特定函數功能項程序模塊,他們一般以ocx或者dll作爲擴展名,你只要找到包含有你需要的功能的模塊文件,並在腳本中規範的引用,就可以實現特定的功能,也就是說Vbs腳本就是調用現成的“控件”作爲對象,用對象的屬性和方法實現目的,完全免去了編寫代碼、設計算法等等麻煩
2. 如何開始編寫
Hello Word 程序
打開你的“記事本”程序,在編輯窗口填寫:
msgbox "Hello World!"
然後用鼠標單擊“文件”菜單,單擊“保存”,把“保存在”一欄設爲桌面,在“文件名”一欄中填寫kk.vbs,單擊“保存”就可以了。然後最小化“記事本”窗口,在桌面上尋找你剛剛保存的kk.vbs,雙擊打開執行
Msgbox語法:msgbox "對話框內容", , "對話框的標題"
name=Inputbox("請輸入你的名字:","名稱")
Msgbox name, ,"您的名字是"
變量定義:
Dim 變量1,變量2,…
Vbs只有一種變量類型,所以不用聲明變量類型。系統會自動分辨變量類型。
inputbox是VBS內建的函數,可以接受輸入的內容,其語法格式爲:
Inputbox("對話框內容","對話框標題")
3. VBScipt基本語法(牢記)
一. 變量
1、所有單引號後面的內容都被解釋爲註釋。
2、在VBScript中,變量的命名規則遵循標準的命名規則,需要注意的是:在VBScript中對變量、方法、函數和對象的引用是不區分大小寫的。在申明變量時,要顯式地申明一個變量,需要使用關鍵字Dim來告訴VBScript你要創建一個變量,並將變量名稱跟在其後。申明多個同類型變量,可以用逗號分隔。注意:VBScript中不允許在申明變量的時候同時給變量賦值。但是允許在一行代碼內同時對兩個變量進行賦值,中間用冒號分隔。
3、 你可以使用Option Explicit來告訴宿主變量必須先聲明後使用。
4、VBScript在定義時只有一種變量類型,在實際使用中需要使用類型轉換函數來將變量轉換成相應的變量類型。
Cbool函數將變量轉換成布爾值;
Cbyte函數將變量轉換爲0到255之間的整數。
Ccur函數、Cdbl函數和Csng函數將變量轉換爲浮點數值,前者只精確到小數點後四位,後兩者要更加精確,數值的範圍也要大的多。
Cdate函數將變量轉換爲日期值。
Cint函數和Clng函數將變量轉換爲整數,後者的範圍比前者要大的多。
Cstr函數將變量轉換爲字符串。
二、數組
數組的定義與變量非常類似,只需要在變量後描述這個數組的個數和維數。需要注意的是:數組的下標總是從0開始,而以數組定義中數值減一結束。也就是說你以要定義一個有十個數據的數組,將這樣書寫代碼:dImarray(9),同樣,當你要訪問第五個元素時,實際的代碼是array(4)。當然,你可以通過不指定數組的個數和維數來申明動態數組。等到數組的個數和維數固定後,使用關鍵字redim來改變數組。注意,在改變數組的大小時,數組的數據會被破壞,使用關鍵字preserve來保護數據。例如:
RedIm空格preserve空格array括號個數逗號維數括號
三、操作符
在VBScript運算符中,加減乘除都是我們常用的符號,乘方使用的是 ^ ,取模使用的Mod。
在比較操作符中,等於、小於、大於、小於等於、大於等於都與我們常用的符號是一致的,而不等於是小於和大於連用(<>)。
邏輯運算符爲:和操作—>AND 非操作—>NOT 或操作—>OR;
你可以使用操作符 + 和操作符 & 來連接字符串,一般使用&操作符;
另外還有一個比較特殊的操作符Is用來比較對象,例如按鈕對象,如果對象是同一類型,結果就是真,如果對象不是同一類型,結果就是假。
四、條件語句主要有if……then語句和select case語句兩種形式
在if……then語句中,其基本形式爲:
If 條件 then
處理條件的語句;
……
Endif
基本形式只能對單個條件進行驗證,如果有兩個條件,則需要在基本形式中添加單行語句else,如果還有更多的條件需要驗證,則需要添加語句
Elseif 條件 then
處理條件語句
在select case語句中,其基本形式爲:
Select case 變量
Case 條件值
處理條件語句
並對上兩句進行重複
最後一句應爲
case else
處理語句
當然不要忘記將條件結束語句End select放在最後一行
注意:在執行字符串比較時,需要特別注意大小寫,一般情況下,我們在比較前,使用lcase函數將字符串轉換成小寫,使用ucase函數將字符串轉換成大寫。
五、循環控制語句
循環控制語句有for……next循環、for……each循環、do……while循環、do……until循環、while循環五種形式。
在使用循環控制語句前,首先要對循環條件進行判斷,如果循環次數是有固定次數的,那麼使用For……next循環,其結構爲:
For 計數器變量=開始計數值 to 最後計數值
執行循環體
Next
如果是需要對數組或對象集合中的每一個元素進行判斷,則需要使用for……each循環,其結構爲:
For each 循環計數變量 in 要查看的對象或數組
執行處理語句
Next
注意:在上述兩種循環中隨時可以使用exit for來退出循環
如果你希望在條件滿足時執行一段代碼則使用do……while語句,結構爲:
Do while 條件
執行循環體
Loop
如果你希望在條件不滿足時執行代碼,則使用do……until語句,結構爲:
Do until 條件
執行循環體
Loop
當然,在這兩種循環語句中,你可以使用exit do來退出循環
最後一種循環語句是條件滿足時一直執行循環,
While 條件
執行循環體
Wend
六、使用過程
常用的過程有兩種,一種爲函數,給調用者返回值,一種爲子程序,無返回值,還有一種叫事件的特殊子程序,用的比較少。
函數的基本定義方法爲:
Function 函數名稱(參數列表)
函數代碼
函數名稱=某值 ‘用來返回值
end function
子程序一些都類似,不過沒有返回值
注意:儘管在定義子程序的時候,參數列表要加括號,但在調用子程序的時候,參數列表不加括號,括號只在函數中使用。另外,子程序不能在表達式中使用。
而函數只能出現在賦值語句的右邊,或者表達式中,函數不能直接使用,如果必須直接使用函數,則必須使用call語句調用,並取消返回值。
4. 如何利用VBS運行外部程序
Vbs只提供了編程的一個基本框架,用戶可以使用Vbs來定義變量、過程和函數,vbs也提供了一些內部函數和對象,但是Vbs沒有提供任何命令來訪問Windows系統內部的部件,但是值得慶幸的是,Vbs雖然不能自己完成這些任務,但是它提供了一條極爲方便、功能也相當強的命令——CreateObject,這條命令可以訪問windows系統內安裝的所有com對象,並且可以調用這些部件中存放的命令。
WSH也就是用來解析Vbs的宿主,本身包含了幾個個常用對象:
1、Scripting.FileSystemObject —> 提供一整套文件系統操作函數
2、Scripting.Dictionary —> 用來返回存放鍵值對的字典對象
3、Wscript.Shell —> 提供一套讀取系統信息的函數,如讀寫註冊表、查找指定文件的路徑、讀取DOS環境變量,讀取鏈接中的設置
4、Wscript.NetWork —> 提供網絡連接和遠程打印機管理的函數。(其中,所有Scripting對象都存放在SCRRUN.DLL文件中,所有的Wscript對象都存放在WSHOM.ocx文件中。)
Option Explicit
Dim objShell
Set objShell =CreateObject(“Wscript.Shell”)
objShell.Run “notepad”
Set是Vbs指令,凡是將一對象引用賦給變量,就需要使用set關鍵字。那麼什麼是對象引用呢?凡是字符串、數值、布爾值之外的變量都是對象引用。
Objshell是變量名,可以隨意修改。
凡是正確引用的對象,其本身內置有函數和變量,其引用方法爲在變量後加“. ”,後緊跟其實現功能的函數就可以了。Objshell.run的意思就是調用Wscript.shell中的運行外部程序的函數——run,notepad是記事本程序的文件名。當然你也可以改成“calc”,這是計算器的文件名,winword是word的文件名,等等吧,所有可執行文件的文件名都可以。但是需要注意的是,如果你要執行的可執行文件存放的地方不是程序安裝的常用路徑,一般情況下,需要提供合法的路徑名,但是run在運行解析時,遇到空格會停止,解決的方法是使用雙引號,
例如:在我的機器上運行qq,代碼爲
objshell.run """C:\ProgramFiles\QQ2006\QQ.exe""" ‘注:三個引
總結:run函數有三個參數,
第一個參數是你要執行的程序的路徑,
第二個程序是窗口的形式,0是在後臺運行;1表示正常運行;2表示激活程序並且顯示爲最小化;3表示激活程序並且顯示爲最大化;一共有10個這樣的參數我只列出了4個最常用的。
第三個參數是表示這個腳本是等待還是繼續執行,如果設爲了true,腳本就會等待調用的程序退出後再向後執行。
其實,run做爲函數,前面還有一個接受返回值的變量,一般來說如果返回爲0,表示成功執行,如果不爲0,則這個返回值就是錯誤代碼,可以通過這個代碼找出相應的錯誤。
5. 錯誤處理
引發錯誤的原因有很多,例如用戶輸入了錯誤類型的值,或者腳本找不到必需的文件、目錄或者驅動器,我們可以使用循環技術來處理錯誤,但是VBS本身也提供了一些基本技術來進行錯誤的檢測和處理。
1、最常見的錯誤是運行時錯誤,也就是說錯誤在腳本正在運行的時候發生,是腳本試圖進行非法操作的結果。例如零被作爲除數。在vbs中,任何運行時錯誤都是致命的,此時,腳本將停止運行,並在屏幕上顯示一個錯誤消息。你可以在腳本的開頭添加
On Error Resume Next
這行語句告訴vbs在運行時跳過發生錯誤的語句,緊接着執行跟在它後面的語句。
發生錯誤時,該語句將會把相關的錯誤號、錯誤描述和相關源代碼壓入錯誤堆棧。
2、雖然On Error Resume Next語句可以防止vbs腳本在發生錯誤時停止運行,但是它並不能真正處理錯誤,要處理錯誤,需要在腳本中增加一些語句,用來檢查錯誤條件並在錯誤發生時處理它。
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<>0then
wscript.echo err.number& err.description & err.source
end if
屬性
Description 錯誤信息的說明
HelpContext 幫助文件主題的上下文 ID,初始值 0
HelpFile 錯誤信息的幫助文件
Number 錯誤信息的代碼,。初始值 0
Source 錯誤信息的對象
方法
Clear 清除所有錯誤信息
Raise 主動設置一個錯誤信息
6. 修改註冊表
Vbs中修改註冊表的語句主要有:
1、讀註冊表的關鍵詞和值:
可以通過把關鍵詞的完整路徑傳遞給wshshell對象的regread方法。例如:
set ws=wscript.createobject("wscript.shell")
v=ws.regread("HKLM\Software\7-Zip\Path")
wscript.echo v
2、寫註冊表
使用wshshell對象的regwrite方法。例子:
path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"
setws=wscript.createobject("wscript.shell")
t=ws.regwrite(path& "jj","hello")
這樣就把
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\jj這個鍵值改成了hello.不過要注意:這個鍵值一定要預先存在。
如果要創建一個新的關鍵詞,同樣也是用這個方法。
path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\run\sssa2000\love\"
setws=wscript.createobject("wscript.shell")
val=ws.regwrite(path,"nenboy")
val=ws.regread(path)
wscript.echoval
3、刪除關鍵字和值
使用regdelete方法,把完整的路徑傳遞給regdelete就可以了
例如
val=ws.regdel(path)
注意,如果要刪除關鍵詞的值的話 一定要在路徑最後加上“\”,如果不加斜線,就會刪除整個關鍵詞。
7. FSO的常見對象和方法
文件系統是所有操作系統最重要的部分之一,腳本經常會需要對文件及文件夾進行訪問和管理,在Vbs中對桌面和文件系統進行訪問的頂級對象是FileSystemObject(FSO),這個對象特別複雜,是vbs進行文件操作的核心。此節內容應瞭如指掌。
FSO包含的常見對象有:
Drive對象:包含儲存設備的信息,包括硬盤、光驅、ram盤、網絡驅動器
Drives集合:提供一個物理和邏輯驅動器的列表
File 對象:檢查和處理文件
Files集合:提供一個文件夾中的文件列表
Folder對象:檢查和處理文件夾
Folders集合:提供文件夾中子文件夾的列表
Textstream對象:讀寫文本文件
FSO的常見方法有:
BulidPath:把文件路徑信息添加到現有的文件路徑上
CopyFile:複製文件
CopyFolder:複製文件夾
CreateFolder:創建文件夾
CreateTextFile:創建文本並返回一個TextStream對象
DeleteFile:刪除文件
DeleteFolder:刪除文件夾及其中所有內容
DriveExits:確定驅動器是否存在
FileExits:確定一個文件是否存在
FolderExists:確定某文件夾是否存在
GetAbsolutePathName:返回一個文件夾或文件的絕對路徑
GetBaseName:返回一個文件或文件夾的基本路徑
GetDrive:返回一個dreve對象
GetDriveName:返回一個驅動器的名字
GetExtensionName:返回擴展名
GetFile:返回一個file對象
GetFileName:返回文件夾中文件名稱
GetFolder:返回一個文件夾對象
GetParentFolderName:返回一個文件夾的父文件夾
GetSpecialFolder:返回指向一個特殊文件夾的對象指針
GetTempName:返回一個可以被createtextfile使用的隨機產生的文件或文件夾的名稱
MoveFile:移動文件
MoveFolder:移動文件夾
OpenTextFile:打開一個存在的文件並返回一個TextStream對象
8. FSO中文件夾的基本操作
1、 使用fso
由於fso不是wsh的一部分,所以我們需要建立他的模型
例如set fs=wscript.createobject(“scripting.filesystemobject”)
這樣就建立了fso的模型。如果要釋放的話也很簡單,setfs=nothing
2、使用文件夾
在創建前,我們一般需要檢查該文件夾是否存在例如:
dim fs,s //定義fs、s兩個變量
setfs=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”
我們可以使用通配符,來方便操作:
例如, fs.movefolder :c:\data\te*” , “d:\working”
注意:在目的路徑最後沒有使用“\” 也就是說我沒有這樣寫:
fs.movefolder c:\data\te*” ,“d:\working\”
這樣寫的話,如果d:\working 目錄不存在,windows就不會爲我們自動創建這個目錄。
注意:上面我們所舉的例子都是在利用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、特殊文件夾
一般指的就是系統文件夾:\windows\system32, 臨時文件夾,windows文件夾,在前幾篇的時候,我們提過一下:例如
setfs=wscript.createobject(“scripting.filesystemobject”)
setwshshell=wscript.createobject(“wscript.shell”)
osdir=wshshell.expandenvironmentstrings(“%systemroot%”)
set f =fs.getfolder(osdir)
wscript.echo f
當然,還有簡單的方法 那就是使用getspecialfolder()
這個方法使用3種值:
0 表示windows文件夾,相關常量是windowsfolder
1 系統文件夾,相關常量是systemfolder
2 臨時目錄,相關常量temporaryfolder
例如:
setfs=wscript.createobject(“scripting.filesystemobject”)
set wfolder=fs.getspecialfolder(0) ‘返回windows目錄
set wfolder=fs.getspecialfolder(1) ‘返回system32\
set wfolder=fs.getspecialfolder(2)'返回臨時目錄
Vbs腳本編程簡明教程之九——1
妙用SendKeys簡化重複操作1
每次開機的時候,你想自動登陸你的QQ或者博客嗎?巧妙使用VBS中的SendKeys命令(這個命令的作用就是模擬鍵盤操作,將一個或多個按鍵指令發送到指定Windows窗口來控制應用程序運行),可以極大的方便我們的常用操作。其使用格式爲:
Object.SendKeys string其中:
Object:爲WshShell對象,即腳本的第一行爲:
SetWshShell=WScript.CreateObject("WScript.Shell")
將Object替換爲WshShell
“string”:表示要發送的按鍵指令字符串,需要放在英文雙引號中。它包含如下內容:
1.基本鍵:
一般來說,要發送的按鍵指令都可以直接用該按鍵字符本身來表示,例如要發送字母“x”,使用“WshShell.SendKeys "x"”即可。當然,也可直接發送多個按鍵指令,只需要將按鍵字符按順序排列在一起即可,例如,要發送按鍵“cfan”,可以使用
“WshShell.SendKeys "cfan"”。
2.特殊功能鍵:
對於需要與Shift、Ctrl、Alt三個控制鍵組合的按鍵,SendKeys使用特殊字符來表示:
Shift —— +;
Ctrl —— ^;
Alt —— %
如要發送的組合按鍵是同時按下Ctrl+E,需要用“WshShell.SendKeys "^e"”表示,
如果要發送的組合按鍵是按住Ctrl鍵的同時按下E與C兩個鍵,這時應使用小括號把字母鍵括起來,書寫格式爲“WshShell.SendKeys "^(ec)"”,這裏要注意它與“WshShell.SendKeys "^ec"”的區別,後者表示組合按鍵是同時按住Ctrl和E鍵,然後鬆開Ctrl鍵,單獨按下“C”字母鍵。
由於“+”、“^”這些字符用來表示特殊的控制按鍵了,如何表示這些按鍵呢?
只要用大括號括住這些字符即可。例如,要發送加號“+”,可使用“WshShell.SendKeys "{+}"”。另外對於一些不會生成字符的控制功能按鍵,也同樣需要使用大括號括起來按鍵的名稱,例如要發送回車鍵,需要用“WshShell.SendKeys "{ENTER}"”表示,發送向下的方向鍵用
“WshShell.SendKeys "{DOWN}"”表示。
如果需要發送多個重複的單字母按鍵,不必重複輸入該字母,SendKeys允許使用簡化格式進行描述,使用格式爲“{按鍵 數字}”。例如要發送10個字母“x”,則輸入“WshShell.SendKeys "{x 10}"”即可。
例一:WshShell.SendKeys"^{ESC}u"
代碼的含義爲:按下Ctrl+Esc組合鍵(相當於按Win鍵)打開“開始”菜單,接着按U鍵打開“關機”菜單。
例二:讓VBS腳本自動在記事本中輸入一行文字“hello, welcome to cfan”。
Dim WshShell
Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "notepad"
WScript.Sleep 2000
//本行的含義爲是腳本暫停2秒,給notepad一個打開的時間,有時時間太短可能導致後面的字符無法進入編輯區
WshShell.AppActivate "無標題 - 記事本
"//AppActivate爲尋找可執行程序的標題框,”無標題-記事本”內容你的自己打開看一下
WshShell.SendKeys "hello, welcome to cfan"
Vbs腳本編程簡明教程之九——2
妙用SendKeys簡化重複操作2
例三:製作能自動定時存盤的記事本
我們最常用的記事本沒有Word、WPS那樣的自動定時存盤功能,其實利用VBS腳本再加上SendKeys命令,就能彌補這個遺憾。打開記事本,輸入以下內容(爲容易描述和分析,把代碼分爲四個部分):
'第一部分:定義變量和對象
Dim WshShell, AutoSaveTime,TXTFileName
AutoSaveTime=300000
SetWshShell=WScript.CreateObject("WScript.Shell")
TXTFileName=InputBox("請輸入你要創建的文件名(不能用中文和純數字):")
'第二部分:打開並激活記事本
WshShell.Run"notepad"
WScript.Sleep 200
WshShell.AppActivate "無標題 - 記事本"
'第三部分:用輸入的文件名存盤
WshShell.SendKeys"^s"
WScript.Sleep 300
WshShell.SendKeysTXTFileName
WScript.Sleep 300
WshShell.SendKeys"%s"
WScript.Sleep AutoSaveTime
'第四部分:自動定時存盤
While WshShell.AppActivate(TXTFileName)=True
WshShell.SendKeys"^s"
WScript.Sleep AutoSaveTime
Wend
WScript.Quit
將其保存爲記事本.vbs,以後要使用記事本時,都通過雙擊這個腳本文件來打開。
程序說明:這個腳本的基本思路是定時向記事本發送Ctrl+S這個存盤組合鍵。
第一部分:定義了腳本中需要用到的變量和對象。“AutoSaveTime”變量用來設置自動存盤間隔,單位爲毫秒,這裏設置爲5分鐘。“TXTFileName”變量通過輸入框取得你要創建的文本文件名稱。
第二部分:運行記事本,對於Windows本身提供的程序,比如計算器等,可直接在“WshShell.Run”後輸入程序名稱,如"calc",對於非系統程序,則可輸入完全路徑,但要注意使用8.3格式輸入,比如“"D:\Progra~1\Tencent\QQ.exe"”。
第三部分:這裏用SendKeys命令執行了這樣的操作流程(請注意每個操作之間延時命令的使用):在記事本中按Ctrl+S組合鍵→彈出保存文件的窗口→輸入文件名→按Alt+S組合鍵進行保存(默認保存在“我的文檔”目錄)。
第四部分:定時存盤的關鍵,通過“While……Wend”這個當條件爲“真”時循環命令,實現自動存盤代碼“WshShell.SendKeys "^s"”和定時代碼“WScript.Sleep AutoSaveTime”的重複執行。因爲不能讓這個定時存盤循環一直執行,退出記事本後,必須自動退出腳本並結束循環,所以設計了一個循環判斷條件“WshShell.AppActivate TXTFileName=True”,當記事本運行中時,可以激活記事本窗口,這個條件運行結果爲“True”,定時存盤循環一直執行,退出記事本後,腳本無法激活記事本窗口,就會跳出循環,執行“Wend”後面的“WScript.Quit”退出腳本。
例四:快速登陸QQ軟件。假設QQ號碼是:10001,密碼是:123456,隱身登陸:
setws=wscript.createobject("wscript.shell")
ws.run"C:\Progra~1\Tencent\QQ\QQ.exe",0
wscript.Sleep 2000
ws.AppActivate "QQ用戶登錄"
ws.SendKeys "7015247"
wscript.Sleep 200
ws.SendKeys "{TAB}"
ws.SendKeys "*********"
wscript.Sleep 200
ws.SendKeys"{ENTER}"
例五:關機菜單立刻顯身
打開記事本,輸入以下命令,並將其保存爲1.vbs:
set WshShell =CreateObject("WScript.Shell")
WshShell.SendKeys "^{ESC}u"
雙擊運行它,你會發現關機菜單立刻出現了。
將“WshShell.SendKeys"^{ESC}u"”改爲“WshShell.SendKeys "^+{ESC}"”,運行一下看看是否打開了任務管理器
Vbs腳本編程簡明教程之九——3
妙用SendKeys自動上網並登陸博客3
將下面的腳本複製到一個文本文件中,並將其文件名命名爲:自動登陸.vbs,然後將撥號軟件及本腳本一起復制到程序——啓動項中,就可以實現自動撥號上網,並登陸到博客上。
代碼如下:
Set wshshell=CreateObject("wscript.shell")
wshshell.AppActivate "連接 MAE-301U 撥號連接"
wscript.Sleep 20000
wshshell.SendKeys"{enter}"
wshshell.Run"iexplore"
WScript.Sleep 2000
wshshell.AppActivate"hao123網址之家---實用網址,搜索大全,盡在http://www.hao123.com/ - Microsoft Internet Explorer" '引號中的內容修改爲你的瀏覽器打開後標題欄中的內容
wshshell.SendKeys"%d"
wshshell.SendKeys"http://passport.baidu.com/?login"
wshshell.SendKeys"{enter}"
WScript.Sleep 2000
wshshell.SendKeys "此處修改爲博客帳號"
wshshell.SendKeys"{tab}"
wshshell.SendKeys "此處修改爲博客密碼"
wshshell.SendKeys"{enter}"
'wshshell.SendKeys"%d"
Vbs腳本常用的編輯器當然是notapad,不過這個編輯器的功能當然實在是太弱了一點,其實有很多的專用的腳本編輯器可以大大方便vbs腳本的編寫。我常用的有兩種:
1、VBSEDit漢化版
2、primalscript漢化版,可以對30多種腳本進行編輯
Vbs腳本編程簡明教程之十一
FSO中文件的基本操作
一、文件屬性:
在windows中,文件的屬性一般用數字來表示:
0代表normal,即普通文件未設置任何屬性。 1代表只讀文件。
2代表隱藏文件。 4代表系統文件。 16代表文件夾或目錄。
32代表存檔文件。 1024代表鏈接或快捷方式。例如:
setfs=wscript.createobject(“scripting.filesystemobject”)
setf=fs.getfile(“d:\index.txt”)
msgbox f.Attributes ‘attributes函數的作用是顯示文件屬性
需要說明的是:msgbox顯示的結果往往不是上面說明的數字,而是有關屬性代表數字的和
二、創建文件:object.createtextfile方法,注意創建前一般需要檢查文件是否存在。
例如:setfso=wscript.createobject(“scripting.filesystemobject”)
iffso.fileexists(“c:\kk.txt”) then
msgbox “文件已存在”
else
setf=fso.createtextfile(“c:\kk.txt”)
end if
如需要強制覆蓋已存在的文件,則在文件名後加true參數。
三、複製、移動、刪除文件:使用copyfile方法、movefile方法、deletefile方法。例如:
setfso=wscript.createobject(“scripting.filesystemobject”)
fso.copyfile “c:\kk.txt”,”d:\1\kk.txt”,true //如上文說述,true代表強制覆蓋
fso.movefile “c:\kk.txt”, “d:\” //移動文件
fso.deletefile “c:\kk.txt” //刪除文件
四、文件的讀寫:
1、打開文件:使用opentextfile方法
如:setts=fso.opentextfile(“c:\kk.txt”,1,true)
說明:第二個參數爲訪問模式1爲只讀、2寫入、8爲追加
第三個參數指定如文件不存在則創建。
2、讀取文件:read(x)讀x個字符;readline讀一行;readall全部讀取
如:setffile=fso.opentextfile(“c:\kk.txt”,1,true)
value=ffile.read(20)
line=ffile.readline
contents=ffile.readall
3、常見的指針變量:
atendofstream屬性:當處於文件結尾的時候這個屬性返回true。一般用循環檢測是否到達文件末尾。例如:
do whileffile.atendofstream<>true
ffile.read(10)
loop
atendofline屬性:如果已經到了行末尾,這個屬性返回true。
Column屬性(當前字符位置的列號)和line屬性(文件當前行號):在打開一個文件後,行和列指針都被設置爲1。
4、在文件中跳行:skip(x) 跳過x個字符;skipline 跳過一行
5、在文件中寫入字符:可以用2-寫入和8-追加的方式來寫入
其方法有:write(x)寫入x字符串;writeline(x)寫入x代表的一行
writeblanklines(n) 寫入n個空行
注意:最後一定要使用close方法關閉文件,讀文件後一定要關閉,才能以寫的方式打開。
Vbs腳本編程簡明教程之十二
使用系統對話框
在VBS腳本設計中,如果能使用windows提供的系統對話框,可以簡化腳本的使用難度,使腳本人性化許多,很少有人使用,但VBS並非不能實現這樣的功能,方法當然還是利用COM對象。
1、SAFRCFileDlg.FileSave對象:屬性有:FileName — 指定默認文件名;FileType — 指定文件擴展名;OpenFileSaveDlg — 顯示文件保存框體方法。
2、SAFRCFileDlg.FileOpen 對象:FileName — 默認文件名屬性;OpenFileOpenDlg — 顯示打開文件框體方法。
3、UserAccounts.CommonDialog對象:Filter — 擴展名屬性("vbs File|*.vbs|All Files|*.*");
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、在調用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 = "vbsFile|*.vbs"
objDialog.InitialDir ="c:\"
tfile=objDialog.ShowOpen
if tfile then
strLoadFile =objDialog.FileName
msgbox strLoadFile
else
wscript.quit
end if
說明:在腳本中加入 objDialog.Flags = &H020 看看會出現什麼結果
Vbs腳本編程簡明教程之十三——1
WMI基礎之一
WMI即Windows 管理規範,是用戶管理本地和遠程計算機的一種模型。通過它可以訪問、配置、管理和監視幾乎所有的 Windows 資源。WMI的語法十分簡單,基本上常見的命名空間、對象等用幾乎一模一樣。它對應的是Windows裏的WMI服務(winmgmt)。
一、WMI的起源
幾年前,幾家資深的計算機公司由於系統管理領域缺少標準,委託DMTF啓動了CIM(通用信息模型)項目,理想的CIM是一種不受限制於任何特定實現環境的管理工具。WMI是CIM的微軟實現,它有很多類是從CIM中派生出來的。
二、WMI的命名空間
那麼命名空間是做什麼作用的呢?我簡單這樣說,在同一段代碼中,如果有兩個變量或函數的名字完全相同,就會出現衝突。命名空間就是爲解決變量、函數的命名衝突而服務的。解決的辦法就是將你的變量定義在一個不同名字的命名空間中。就好像財政局有個張三,公安局也有個張三,但我們清楚,就是因爲他們分屬不同的單位。有些地方可能不太準確,但大致意思就是這樣了。
WMI的命名空間創建了一個層次結構,有點類似於我們的目錄文件結構。
1、 root-作爲所有其他名字的佔位符;
2、 root\default-與註冊表操作有關的類;
3、 root\security-與系統安全有關的類;
4、 root\cimv2-從CIM派生的類,代表我們最常用的工作環境。
三、WMI的對象路徑
WMI的對象路徑用來在CIM庫中定位類和它的事例,對象路徑用兩個反斜槓\\開頭,第一個元素是目標計算機的名字,第二個元素是相應的WMI命名空間,第三個元素是相應的類名,並用 : 將它與命名空間分隔開來。例如:\\..\root\cimv2:win32_service
其中那個 . 代表是本地系統。
四、WMI的查詢語言——WQL僅僅是ANSI SQL的一個子集,只能用於數據的提取。
數據、事件查詢的基本語法爲:
Select pro1 , pro2 ,pro3 from myclass(myclassevent)
例如:Select name, path from Win32_share 說明:列出所有共享的名稱和路徑
也可以使用通配符 * ,例如:Select * from Win32_share
關鍵字Where 用於限定查詢的範圍。
例如:Select *from Win32_share where name=”Admin”
五、WMI腳本中使用的三個步驟
步驟 1:連接到 WMI 服務
在任何 WMI 腳本中,第一個步驟都是建立一個到目標計算機上的 Windows 管理服務的連接。方法是調用 VBScript 的 Getobject 函數並將 WMI 腳本庫的名字對象的名稱(即“winmgmts:”,後跟目標計算機的名稱)傳遞到 Getobject,並返回一個對象的引用,此時,您就可以調用其提供的方法如:InstancesOf,正如方法名所示,InstancesOf 返回由資源的類名標識的託管資源的所有實例。
步驟 2:檢索 WMI 託管資源的實例
一般採用WQL來實現。
步驟 3:顯示 WMI 託管資源的屬性
最後一個步驟是枚舉 檢索得到集合的內容。一般採用
For each enum in myclass
……
Next 結構來實現。
六、WMI 測試器 (wbemtest.exe)驗證腳本執行結果
現在,您對可用於瀏覽和查看CIM 的工具已經有了一些認識,讓我們使用 WMI 測試器 (wbemtest.exe) 來檢查 Win32_Process 類定義,以便從在您的本地計算機上運行的進程檢索一些屬性。
1.打開一個命令提示,鍵入 C:\>wbemtest.exe,按下 Enter 來開始 WMI 測試器工具。請注意,大部分按鈕在主 WMI 測試器窗口上是被禁用的,這說明此時您沒有連接到 WMI。
2.單擊 “連接”按鈕 連接到本地或遠程計算機上的 WMI 服務。顯示“連接”對話框,它提供一個標記爲 名稱空間 的文本輸入區域,該區域默認值爲 root\default。將 名稱空間 區域的值更改爲 root\cimv2,單擊“連接”對話框的 連接 按鈕返回到主 WMI 測試器窗口。
3.主窗口中左上角的命名空間標識符應該顯示爲 root\cimv2。請注意,所有的按鈕現在都已啓用,這說明在當前憑據環境下,您已經成功連接到本地主機上的 WMI。單擊 枚舉類別 打開“超類信息”對話框。
4.在“超類信息”對話框中,不要填寫 輸入超類別名稱 區域,單擊 遞歸 選項,單擊 確定 以枚舉 root\cimv2 名稱空間中定義的所有 CIM 類。
請注意,列於“查詢結果”對話框頂部的類是以兩個下劃線爲開頭的。這些是系統類。系統類是預定義的 CIM 類,支持內部 WMI 配置與操作,例如提供程序註冊、命名空間安全性及事件通知等。現在,忽略系統類,向下滾動“查詢結果”對話框直至看到以 CIM_ 開頭的類。名稱以 CIM_ 開頭的類是由 DMTF 維護的核心與公共基類。繼續向下滾動直至到達以 Win32_ 開頭的類。 名稱以 Win32_ 開頭的類是 Microsoft 擴展類,表示 Windows 特定的託管資源。如果這是您第一次檢查 root\cimv2 命名空間,您可能希望熟悉root\cimv2 命名空間中的類的完整集合,尤其是有 Win32_ 前綴的類。
5.向下滾動“查詢結果”對話框直至到達 Win32_Process 類,雙擊該類名打開 Win32_Process 對話框的對象編輯器。
6.“對象編輯器”對話框顯示被選定類的定義和實現的詳細信息(屬性和方法)。選擇 Hide System Properties 複選框隱藏系統屬性。剩餘的 Win32_Process 屬性表示您可以從在本地或遠程計算機上運行的進程檢索的信息。
運行如下代碼:
strComputer ="."
Set wbemServices =Getobject("winmgmts:\\" & strComputer)
Set wbemObjectSet =wbemServices.InstancesOf("Win32_Process")
For Each wbemObject InwbemObjectSet
WScript.Echo "Name: " & wbemObject.Name & vbCrLf & _
" Handle: " & wbemObject.Handle & vbCrLf & _
" Process ID: " &wbemObject.ProcessID
Next
7.在運行腳本之後,您可以用 WIMI 測試器驗證腳本的結果。在 Win32_Process 對話框的對象編輯器中,單擊 Instances。產生的查詢結果對話框列出在計算機上運行的進程的實例。雙擊一個指定的進程實例,查看該實例的詳細信息。
Vbs腳本編程簡明教程之十三——2
WMI基礎之二—阻止客人運行你不想運行的程序
很多人都有這樣的經驗,剛剛裝好的系統,讓人運行了一些你不想他運行的程序,比如說QQ,又是聊天,又是下載表情,不過一會,流氓插件、病毒、木馬已經盤踞了你的計算機,常常是忍痛將這個程序卸載,可是不知情的人很自覺的下載安裝,使整個系統無法正常運行。
其實用vbs和wmi結合起來,使你的計算機上有相應的程序安裝,別人又無法運行起來太容易了,現在給出代碼:
On Error Resume Next '忽略所有的錯誤
Dim bag,pipe,honker,good
Do
good="." '定義爲本地計算機
setbag=getobject("winmgmts:\\"& good&"\root\cimv2") 'l連接到cimv2命名空間
setpipe=bag.execquery("select * from win32_process where name='qq.exe' orname='qqgame.exe' or name='winmine.exe'") '看,這是我的計算機上不允許運行的程序,qq、qqgame、winmine(掃雷)如果你還有其他的程序不允許運行,很簡單,在其中添加 or name='你不允許運行的程序名'
for each i in pipe
i.terminate()
msgbox "發現盜版系統,現已進行功能限制!" & vbcrlf & "請使用正版軟件!",,"微軟提示" '此行其實可有可無,有這行只是爲了免去懷疑
next
wscript.sleep 60000 '每1分鐘檢測一次
loop
那麼如果我自己想運行這些程序該怎麼辦呢,很簡單,Ctrl+Alt+Del三個鍵齊按,打開windows任務管理器,在進程中結束Wscript.exe和wmiprvse.exe進程的運行就可以了
Vbs腳本編程簡明教程之十四
使用dictionary對象
VBS中存在一個特殊的對象-dictionnary,是一個集合對象。一般情況霞,我把這個特殊的集合想象爲數組,可以使用其中內建的函數完成存儲和操縱數據等基本任務,無須擔心數據是在哪些行列,而是使用唯一的鍵進行訪問或者是一個只能運行在內存中的數據庫,並只有兩個字段分別是:key和item,在使用中,字段key是索引字段。
setsdict=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,並加入了三條數據,然後對每一條數據進行了枚舉,最後,將對象的實例清空。
Dictionary 對象的成員概要
屬性和說明
CompareMode 設定或返回鍵的字符串比較模式
Count 只讀。返回 Dictionary 裏的鍵/條目對的數量
Item(key) 設定或返回指定的鍵的條目值
Key(key) 設定鍵值
方法和說明
Add(key,item) 增加鍵/條目對到 Dictionary
Exists(key) 如果指定的鍵存在,返回 True,否則返回 False
Items() 返回一個包含 Dictionary 對象中所有條目的數組
Keys() 返回一個包含 Dictionary 對象中所有鍵的數組
Remove(key) 刪除一個指定的鍵/條目對
RemoveAll() 刪除全部鍵/條目對
Vbs腳本編程簡明教程之十五——1
VBS內置函數之一
Abs 函數:返回數的絕對值。
Array 函數:返回含有數組的變體。
Asc 函數:返回字符串首字母的 ANSI 字符碼。
Atn 函數:返回數值的反正切。
CBool 函數:返回已被轉換爲 Boolean 子類型的變體的表達式。
CByte 函數:返回已被轉換爲字節子類型的變體的表達式。
CCur 函數:返回已被轉換爲貨幣子類型的變體的表達式。
CDate 函數:返回已被轉換爲日期子類型的變體的表達式。
CDbl 函數:返回已被轉換爲雙精度子類型的變體的表達式。
Chr 函數:返回與指定的 ANSI 字符碼相關的字符。
CInt 函數:返回已被轉換爲整形子類型的變體的表達式。
CLng 函數;返回已被轉換爲Long子類型的變體的表達式。
Cos 函數:返回角度的餘弦。
CreateObject 函數:創建並返回對“自動”對象的引用。
CSng 函數:返回已被轉換爲單精度子類型的變體的表達式。
CStr 函數:返回已被轉換爲字符串子類型的變體的表達式。
Date 函數:返回當前系統日期。
DateAdd 函數:返回的日期已經加上了指定的時間間隔。
DateDiff 函數:返回兩個日期之間的間隔。
DatePart 函數:返回給定日期的指定部分。
DateSerial 函數:返回指定年月日的日期子類型的變體。
Datevalue 函數:返回日期子類型的變體。
Day 函數:返回日期,取值範圍爲 1 至 31。
Eval 函數:計算表達式並返回結果。
Exp 函數:返回 e (自然對數的底) 的多少次方。
Filter 函數:根據指定的篩選條件,返回含有字符串數組子集的、下限爲 0 的數組。
Fix 函數:返回數的整數部分。
FormatCurrency 函數:返回的表達式爲貨幣值格式,其貨幣符號採用系統控制面板中定義的。
FormatDateTime 函數:返回的表達式爲日期和時間格式。
FormatNumber 函數:返回的表達式爲數字格式。
FormatPercent 函數:返回的表達式爲百分數(乘以 100)格式,後面有 % 符號。
GetObject 函數:返回從文件對“自動”對象的引用。
GetRef 函數:返回對能夠綁定到一事件的過程的引用。
Hex 函數:返回一字符串,代表一個數的十六進制值。
Hour 函數:返回表示鐘點的數字,取值範圍爲 0 至 23。
InputBox 函數:在對話框中顯式一提示,等待用戶輸入文本或單擊按鈕,並返回文本框的內容。
InStr 函數:返回一個字符串在另一個字符串中首次出現的位置。
InStrRev 函數;返回一個字符串在另一個字符串中出現的位置,但是從字符串的尾部算起。
VBS內置函數之二
Int 函數:返回數的整數部分。
IsArray 函數:返回 Boolean 值,反映變量是否爲數組。
IsDate 函數:返回 Boolean 值,反映表達式能否轉換爲日期。
IsEmpty 函數:返回 Boolean 值,反映變量是否已被初始化。
IsNull 函數:返回 Boolean 值,反映表達式是否含有無效數據(Null)。
IsNumeric 函數:返回 Boolean 值,反映表達式能否轉換爲數字。
IsObject 函數:返回 Boolean 值,反映表達式是否引用了有效的“自動”對象。
Join 函數:返回通過連接許多含有數組的子串而創建的字符串。
LBound 函數;返回指定維數數組的最小有效下標。
LCase 函數:返回的字符串已被轉換爲小寫字母。
Left 函數:返回字符串最左邊的指定數量的字符。
Len 函數:返回字符串中的字符數或存儲變量所需的字節數。
LoadPicture 函數:返回圖片對象。只用於 32 位平臺。
Log 函數:返回數的自然對數。
LTrim 函數;返回去掉前導空格的字符串。
Mid 函數:從字符串中返回指定數量的字符。
Minute 函數:返回分鐘數,取值範圍爲 0 至 59。
Month 函數:返回表示月份的數,取值範圍爲 1 至 12。
MonthName 函數:返回表示月份的字符串。
MsgBox 函數:在對話框中顯示消息,等待用戶單擊按鈕,並返回表示用戶所擊按鈕的數值。
Now 函數:返回計算機的當前系統日期和時間。
Oct 函數:返回表示該數八進制數值的字符串。
Replace 函數:返回一字符串,其中指定的子串已被另一個子串替換了規定的次數。
RGB 函數:返回代表 RGB 顏色值的數字。
Right 函數:返回字符串最右邊的指定數量的字符。
Rnd 函數:返回隨機數。
Round 函數:返回指定位數、四捨五入的數。
RTrim 函數:返回去掉尾部空格的字符串副本。
ScriptEngine 函數:返回反映使用中的腳本語言的字符串。
ScriptEngineBuildVersion 函數:返回使用中的腳本引擎的編譯版本號。
ScriptEngineMajorVersion 函數:返回使用中的腳本引擎的主版本號。
ScriptEngineMinorVersion 函數:返回使用中的腳本引擎的次版本號。
Second 函數:返回秒數,取值範圍爲 0 至 59。
VBS內置函數之三
Sgn 函數:返回反映數的符號的整數。
Sin 函數:返回角度的正弦值。
Space 函數:返回由指定數量的空格組成的字符串。
Split 函數:返回下限爲 0 的、由指定數量的子串組成的一維數組。
Sqr 函數:返回數的平方根。
StrComp 函數:返回反映字符串比較結果的數值。
String 函數:返回指定長度的重複字符串。
StrReverse 函數:返回一字符串,其中字符的順序與指定的字符串中的順序相反。
Tan 函數:返回角度的正切值。
Time 函數:返回表示當前系統時間的“日期”子類型的“變體”。
Timer 函數:返回時經子夜 12:00 AM 後的秒數。
TimeSerial 函數:返回含有指定時分秒時間的日期子類型的變體。
Timevalue 函數:返回含有時間的日期子類型的變體。
Trim 函數:返回去掉前導空格或尾部空格的字符串副本。
TypeName 函數:返回一字符串,它提供了關於變量的變體子類型信息。
UBound 函數:返回指定維數數組的最大有效下標。
UCase 函數:返回的字符串已經被轉換爲大寫字母。
VarType 函數:返回標識變體子類型的數值。
Weekday 函數:返回表示星期幾的數值。
WeekdayName 函數:返回表示星期幾的字符串。
Year 函數:返回表示年份的數值。