VBS--基礎語法整理
前言
當初學VBS主要是為了使用一個指令碼檔案直接啟動可執行jar包,所以就簡單學了一下VBS的使用,淺嘗輒止,需求達到了也就不再深入學習了。至於為什麼不用bat之類的其他指令碼語言或者打包成exe,只是當初有需要,剛好看見VBS可以實現功能,就學了。當然各位有更好的推薦,請不吝賜教!
如果您是想嘗試學習使用VBS指令碼,那麼本文章可供參考,寫的不好的地方,多多包涵!
1、VBS不區分大小寫
vbs所有程式碼均
不區分大小寫
。
2、語句結束
vbs不可以使用;作為語句結尾,會報錯,
直接換行
則表示一條語句。
3、程式碼註釋
VBS就一種註釋方式,使用
一個英文單引號
進行註釋,註釋內容為
當前行單引號後的所有內容
option
explicit
dim
var1
,
var2
‘
多個變數宣告用逗號隔開
4、變數宣告
顯式宣告:Dim、Public、Private語句進行宣告
隱式宣告:不宣告直接使用,相當於Dim
強制宣告:Option Explicit語句強制顯式宣告所有變數
如果沒有宣告option explicit,vbs在使用變數前不一定宣告變數,可直接使用。但這樣容易帶來一些潛在的問題,不建議這樣使用。
使用建議
:無腦在指令碼開頭寫上
option explicit
即可
5、變數賦值
一個語句中可以同時宣告多個變數,也可以同時賦值多個變數。但不可以宣告變數的同時賦值
option explicit
dim var1,var2 ’多個變數宣告用逗號隔開
var1=1:var2=2 ‘多個變數賦值用冒號隔開
’dim var3=3 ‘宣告的同時賦值是錯誤的
使用建議
:如果覺得難記,沒必要合著寫,就拆開一個一個宣告,一個一個賦值
6、字串的表示方式
字串必須使用雙引號包圍,不可使用單引號。而且vbs中單引號不能表示單個字元
7、資料拼接
使用’&‘可拼接任意型別的資料,有一點值得注意,如果&兩端都是數字常量,則不能連續使用,必須存在空格,如: 111 & 777 ;此時才能完成連線,若為111&777會報錯。
使用’+‘號一樣可以起到和’&‘類似的效果,區別是:
數字 + 數字:表示運算
數字 & 數字:表示拼接,且數字和&之間必須有空格
數字 + 字串數字 :表示運算
數字 & 字串數字:表示拼接,且數字和&之間必須有空格
數字和非純數字字串拼接時,只能使用 &
非純數字字串+非純數字字串:表示拼接
Option Explicit
dim Name,age
name=1:age=0
age=age+1
msgbox name & age & “abc”
’輸出11abc
8、資料計算
Option Explicit
dim Name,age
name=“1”:age=“1”
age=age+1+“2”+name ‘對字串型別會自動轉換成數字型別進行計算,如果轉換失敗則會報錯,如包含非數字符號
msgbox name & age ’這裡兩個數字使用&拼接
‘輸出15
9、變數作用域
①
指令碼級作用域(宣告在最外層的)
變數在整個指令碼檔案中都是有效的。宣告的變數的作用域就是整個指令碼。
②
過程級作用域(宣告在過程裡的)
變數在過程或函式中有效。過程、函式之外的其它程式碼都不能訪問過程級變數。
③
類級作用域(宣告在類裡的)
這是一種包含屬性和方法的邏輯分組的特殊結構。類定義之外的程式碼都不能訪問類級變數。
有三個關鍵字可以用於宣告變數:Dim、Private、Public
1。對於指令碼級變數,不論是哪種型別的宣告,作用域都為整個指令碼檔案
2。dim可用於宣告指令碼、過程、類級作用域的變數,過程變數必須使用dim,對於類變數,表示區域性變數,類級變數dim效果與public相同
3。private可用於宣告指令碼、類級作用域的變數,對於類級變數,則表示聲明瞭一個私有變數
4。public,與private相對,表示類的公有變數
使用建議
:一般你也不會在vbs腳本里寫多少功能,多半就是個啟動時候一些檔案檢查之類的,
無腦dim
即可。
10、陣列
option explicit
dim arr() ’使用括號表示陣列,括號沒有填值,只表示一個動態陣列變數,並沒有指定長度
dim arr2(2) ‘此時宣告arr2時,指定了長度,那麼這個長度就不可變化了
dim arr3(3,4) ’二維陣列
redim arr(3) ‘可使用redim定義一個數組長度,如果該陣列變數在宣告時是已經確定長度的,則會報錯
redim arr(4) ’對於不確定長度的,可多次改變陣列長度
‘redim arr2(5) 會報錯,因為arr2已經在宣告時固定了長度
’preserve關鍵字標識在redim時是否保持原值不變,如果不加該關鍵字,在重新構建陣列時,原值會被清空
redim Preserve arr(3) ‘redim 增加一個preserve關鍵字後可重新定義陣列長度的同時保持數值不變,變長則多出來的部分預設為空,變短則截斷,即使後面再變長回去資料也不在了
arr(0)=“aa” ’陣列下標從0開始
arr(1)=“hh”
msgbox arr(0)‘輸出陣列第一位
這裡說明一下msgbox,這個就是讓系統彈出一個提示框,提示框的內容就是msgbox的第一個引數。
陣列補充說明(不同於其他語言的陣列的部分)
:
如dim arr(2),按照現在最常見的理解,陣列長度為2,包含arr(0)和arr(1)兩個元素
但事實上arr包含了0,1,2三個下標的元素
宣告多元陣列使用逗號分割下標dim arr(2,3),維度從左到右,從低到高(2為一維)
ubound(arr,dim)函式用於獲取下標最大值,arr表示陣列名,dim表示維度
lbound與ubound對應,是用於獲得下標最小值的,但目前看來,始終為0
11、if條件判斷
if ... then ... end if
option explicit
dim a
dim b
a=1
b=2
if a>b then
msgbox “a>b”
end if
if ... then ... else ... end if
option explicit
dim a
dim b
a=1
b=2
if a>b then
msgbox “a>b”
else
msgbox “a
end if
if ... then ... elseif ... then ... end if
option explicit
dim a
dim b
a=1
b=1
if a>b then
msgbox “a>b”
elseif a=b then
msgbox “a=b”
end if
12、select語句
option explicit
dim a
a=1
select case a
case 1
msgbox “a=1”
msgbox “wow”
case 2
msgbox “a=1”
case else
msgbox “I don’t know”
end select
使用建議
:開頭的select case後填變數,後面的case填變數值,語句執行範圍為目標case到下一個case之前,也就是說,當a=1時,執行的就是msgbox “a=1”和msgbox “wow”,執行完就結束select了,不需要break
13、do 。。。 loop迴圈
do while/until ... loop
option explicit
dim a
a=1
do while a<10
a=a+1
if a=5 then
exit do
end if
loop
msgbox a
提示
:將該迴圈拆成三部分理解。
1、do到loop之間的程式碼為迴圈執行的程式碼。
2、while表示當條件滿足繼續執行迴圈。與之對應的是until,表示當條件滿足則結束迴圈。這個根據字面意思應該也能理解。而且while或until可以放在do後面,也可以放在loop後面。放在do後面表示
先判斷後執行
,放在loop後面表示
先執行後判斷
。
3、exit do表示在該位置結束迴圈,繼續執行迴圈外的後續程式碼,要和if等條件判斷語句連用,直接放在迴圈體執行一次就退出了。
14、
while...wend迴圈
option explicit
dim a
a=1
while a<10
a=a+1
wend
msgbox a
提示
:while 。。。 wend是不能中途退出的
15、for 。。。 next迴圈
option explicit
dim a
a=0
dim b
b=0
for a=0 to 11
b=b+1
if a=5 then
exit for
end if
next
msgbox a
msgbox b
提示
:for 。。。 next 中,
1、條件必須是一個變數=val1 to val2這種形式,運作原理就是讓這個變數依次等於範圍內的值,比如上式中:a=0 to 11,表示先a=0,再a=1,a=2,a=3。。。a=11。
2、可以使用exit for直接跳出迴圈
3、在迴圈體內改變遍歷條件對應變數的值會影響到次數,比如我在迴圈體裡直接將a=12,那麼就已經超出0~11了,此時就會退出迴圈。
4、正常退出迴圈後,依舊會對迴圈變數加1。但是如果使用exit for結束迴圈,則不會
使用建議
:該迴圈比較適合用在定義一個下標變數去遍歷陣列
16、
for each...next
option explicit
dim i(5),j
i(0)=“a”
i(1)=“b”
i(2)=“c”
i(3)=“d”
i(4)=“e”
i(5)=“f”
for each j in i
msgbox j
if j=“d” then
exit for
end if
next
使用建議
:去遍歷一個數組或者集合,可以使用exit for退出
17、算術運算子
加減乘都和其他語言一樣使用,只列舉比較特殊的
1。取餘:10 mod 5 ;該表示式表示取10/5的餘
2。除法:/表示浮點數除法,\表示取整除法
3。指數:2^3;2的三次方
18、邏輯運算子
1。相等:=
2。不等:<>
3。大於:>
4。小於:<
比較時的一些細節:當數字比數字時,就正常比較;數字比字元數字時,字元數字會被轉換成數字比較;字串比字串,按ASCII的值,從第一位依次比較
5。非:not
6。與:and
7。或:or
8。異或:xor
19、sub過程
由sub。。。end sub 進行定義。如果 Sub 過程無任何引數,則 Sub 語句必須包含空括號 ()
不帶引數的sub,定義時如果沒有引數,可以不加
不帶引數的過程
Sub GetName()
MsgBox “我是Sirrah” ‘輸出字串
End Sub
帶引數的過程
Sub GetName(name)
MsgBox name ’輸出字串
End Sub
提示
:
sub的定義可以在指令碼檔案的任意位置
sub過程是不可以有返回值的
使用建議
:在定義過程的時候,不管有沒有引數,統一都加上括號
20、function函式
由function。。。end function進行定義。如果 function過程無任何引數,則 function語句必須包含空括號 (),定義時如果沒有引數,可以不加。
不帶引數的函式
Function GetName()
MsgBox “我是Sirrah” ‘輸出字串
End Function
帶引數的函式
Function GetName(name)
MsgBox name ’輸出字串
End Function
function的定義可以才指令碼檔案的任意位置
function過程是可以有返回值的,返回值的寫法為:函式名=值;和其他語言的return不同
Function GetName(name)
GetName=123 ‘返回值
End Function
使用建議
:在定義函式的時候,不管有沒有引數,統一都加上括號
21、呼叫函式和過程
call:如果無引數,可以不加括號;如果有引數,則必須加括號
Call GetName() ’呼叫Function
Call GetName() ‘呼叫Sub過程
直接呼叫:如果沒有或只有一個引數,可以加括號也可以不加。如果有兩個以上,不可以加括號
GetName ’直接呼叫
獲取返回值:如果不存在引數,可加括號也可以不加,如果存在在引數,必須加括號;不能使用call來獲得返回值
使用建議
:使用call加括號;直接呼叫不加括號,需要獲取返回值加括號
22、類
1。類的定義和宣告
Set MyUser = New User ‘在強制宣告的情況下,需要先dim宣告變數
Class User
’Initialize事件相當於建構函式
Private Sub Class_Initialize ‘當這個類被建立時執行
MsgBox “類開始”
End Sub
’Terminate事件相當於解構函式
Private Sub Class_Terminate ‘當類被銷燬時執行
MsgBox “類結束”
End Sub
End Class
2、類結構
Class User
Private pri_var ’私有屬性
public pub_var ‘公共屬性
Private Sub Class_Initialize ’構造過程
End Sub
Private Sub Class_Terminate ‘析構過程
End Sub
Public Property Get get_xx ’故有的屬性get,與function類似
End Property
Public Property Let let_xx ‘故有的屬性let
End Property
Public Sub ToString() ’自定義過程
End Sub
Private function getString() ‘自定義函式
end function
End Class
3、類的例項建立和釋放
set obj = new object ’宣告
set obj =nothing ‘釋放
4、當一個物件不被引用時,會自動釋放
23、檔案系統物件
FSO(FileSystemObject)
1、建立物件
Dim fso
Set fso = wscript。createobject(“scripting。filesystemobject”)
2、常用方法,已宣告Set fso = wscript。createobject(“scripting。filesystemobject”)
CreateTextFile:
fso。CreateTextFile“C:\test。txt”,true //建立檔案,第二個引數表示是否強制覆蓋,true為覆蓋
CreateFolder:
Fso。CreateFolder “c:\test” //建立資料夾,只有一個引數
DeleteFile:
Fso。DeleteFile “c:\test。txt”, true //刪除檔案,第二個引數用於強制刪除只讀檔案時,true為強制刪除
DeleteFolder:
Fso。DeleteFolder “c:\test”,True//刪除資料夾,第二個引數用於強制刪除只讀資料夾,true為強制刪除
FileExists:
Fso。FileExists(“c:\test。txt”) //是否存在檔案,返回布林值
FolderExists:
Fso。FolderExists(“c:\test”) //是否存在資料夾
CopyFile:
Fso。CopyFile “c:\test。txt”,“D:\”,True //複製檔案第一個引數原始檔路徑,第二個引數目標目錄路徑,第三個引數,是否強制覆蓋
CopyFolder:
Fso。CopyFolder “c:\test”,“D:\”,False //複製目錄第一個引數源目錄路徑,第二個引數目標目錄路徑,第三個引數,是否強制覆蓋
MoveFile:
Fso。MoveFile “c:\test。txt”,“D:\” //移動檔案,第一個引數原始檔路徑,第二個引數目標目錄
MoveFolder:
Fso。MoveFolder “c:\test”,“D:\” //移動目錄,第一個引數源目錄路徑,第二個引數目標目錄
GetExtensionName:
fso。GetExtensionName(“c:\test。txt”)//獲取字尾名
GetBaseName:
Fso。GetBaseName(“c:\test\test。txt”) //獲得檔名,不含字尾
GetParentFolderName:
Fso。GetParentFolderName(“c:\test\test。txt”)//獲取檔案當前路徑
OpenTextFile:
Fso。opentextfile(“filename”[,iomode[,create[, format]]])//返回一個textstream物件,第一個引數檔名,第二個引數為io模式,1為只讀,2為覆蓋寫,8為在末尾寫,第三個引數表示不存在時是否建立,第四個為編碼格式,這裡不做贅述,到時候直接查
24、使用控制檯執行jar包
dim ws
set ws = createobject(“Wscript。Shell”)
ws。run “cmd /k java -jar 。\youApp。jar”
總結:
至此,VBS的一些簡單的語法入門就已經介紹完了。感謝各位的閱讀!