前言

當初學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的一些簡單的語法入門就已經介紹完了。感謝各位的閱讀!