vbs

vbs

VBS是基於Visual Basic的腳本語言。VBS的全稱是:Microsoft Visual Basic Script Edition。(微軟公司可視化BASIC腳本版)。

其語言類似Visual Basic(VB)

基本介紹

  • 中文名微軟公司可視化BASIC語言-腳本版
  • 外文名:Microsoft Visual Basic Script Edition
  • 簡稱:VBScript
  • 縮寫:VBS
  • 解釋器:Windows腳本宿主
  • 語言類型:腳本語言
  • 後綴:.vbs
內容概要,程式的編輯,第二篇,第三篇,第四篇,第五篇,最後一篇,運算,基本運算,數學函式,指令,代碼舉例,矩形面積計算器,圓面積計算器,說自己輸入的話,惡作劇代碼,微軟官方FSO腳本舉例,

內容概要

程式的編輯

大家最關心的就是用什麼工具來開發VBS程式了, 答案是:記事本(Notepad),我不是開玩笑, 其實任何一種文本編輯器都可以用來開發VBS, 只不過記事本是windows系統自帶的, 無需專門下載安裝。儘管如此, 我還是建議你去下載一個專業的文本編輯器, 因為這些工具可以提供 "語法高亮"等功能, 更加方便開發, OK, 我們先來寫一個VBScript程式熱熱身.
'程式名稱:輸入並回顯你的名字'程式使用InputBox和Msgbox函式'(上面及本行可以不必寫入原始碼中,為注釋,下面才是運行的代碼)Msgbox(Inputbox("請輸入你的名字:"))
把上面的程式清單輸入到記事本裡面, 然後保存為以.vbs為擴展名的檔案(然後雙擊, 觀察運行結果.
為了上面的東西更精簡,更明了,我們可以精簡一下它的內容:
name=Inputbox("請輸入你的姓名:")Msgbox(name)
語法解釋:
第一行,給第一行的inputbox(輸入框)命名:name
第二行,彈出對話框,對話框的內容就是第一行的inputbox輸入的內容。
要點:
1) 注釋(以REM或'開頭)行在程式中不起作用, 但能讓別人更容易讀懂你的程式.
2)變數好像一個盒子, 或一個代號, 可以代表你想代表的東西. 變數賦值使用"="
3) 以""包裹起來的字元稱之為"字元串"
4) 函式像一個"黑箱", 有參數和返回值, 用"="左邊的變數可以接住返回值
5) Inputbox函式彈出一個輸入對話框,Msgbox則用於輸出

第二篇

先說常量, 這個比較簡單.
什麼是常量呢, 常量就是其值不可變化的量.
常量分為兩種:第一種, 自然常量. 這叫是因為它們本身就是常量, 你怎么更改21的值呢? 他永遠都是21, 不可能變成46
如果你在程式中使用"21=46", 這樣的語句將會引發一個錯誤. 同樣的,字元串也是常量(還記得字元串嗎? 就是包裹在""之間的一串字元), "Hello World"就是一個例子, 如果你使用"Hello World"="Bye"這樣的語句同樣會引發一個錯誤. 你能舉出自然常量的更多例子嗎?
第二種, 是我們自己定義的常量,這種量也使用代號, 它們也被賦值, 但和變數的不同點在於, 他們在定義的時候被賦值,以後就不能改變了,如果企圖改變將會引發一個錯誤. 定義一個常量,我們使用"const"這個關鍵字(關鍵字的意思是系統定義了有特殊功能的字, 不能作為變數名或常量名使用)
格式是:const常量名=常量值.
例如:
const PI=3.1415926const NAME="記憶碎片"
這樣我們就定義了兩個常量, PI和NAME, 一般說來, 常量名全部使用大寫, 但也可以不用, 隨你喜好. 將一些在程式中不需要改變的值定義為常量是個好習慣, 這樣能防止不必要的意外. 另外, 使用自定義常量也可以減少你的工作量.
要點:
1) 常量分為自然常量和自定義常量, 常量的值不可修改
2)變數就像盒子, 我們不在乎盒子裡裝的是什麼, 但一定要知道盒子的名字
3) 四則運算在編程中沒有任何不同
4) MOD是取余運算

第三篇

請看一下程式清單:
(1)
Dim a,b,ca=inputbox("a是:","輸入半徑")b=Inputbox("b是:","輸入半徑")c=a*2+b*2msgbox (c)
這個 輸入1、2時是6
(2)
Dim a,b,ca=Inputbox("a是:","輸入半徑")b=Inputbox("b是:","輸入半徑")c=(a+b)*2msgbox(c)
這個輸入1、2時是24
為什麼會不一樣呢? 在數學上c=(a+b)*2 和 c=a*2+b*2是等價的, 在VBS中則不同. 問題出在"+"上, 在VBS中, +不僅僅是加號的意思還表示把兩個字元串連線起來, 例如"Hello"+"World"="HelloWorld" ,have you understood? 你還記得InputBox函式的返回值嗎? 是字元串! 這就看出問題了吧, 在編程中"1"不等於(<>)1, "1"是一個字元, 而1是一個數, 所以a,b都是字元串變數, "1"+"2"="12", 這就好像我們小時跟夥伴開玩笑問他們1+1=?一樣, 我們總是笑著說"錯啦,應該是11".但為什麼, a可以*2卻不發生錯誤呢? 這時VBS比較智慧型的一個表現, 如果這個字元串的內容是一個數且對他進行數學運算, 則把字元串強制轉換成數參與運算, 如果字元串代表一個數, 但不參加數學運算, 而是參加字元串運算(合併)則當作字元串處理, 所以你看到a+b=12, 這時候a+b的結果(12)是一個字元串, 當它要乘以2的時候就被強制轉換成了數字12, 這樣我就得到了結果24.
怎么修改這個程式呢? 我們需要用到另一個內建的函式:int, int函式的功能是將輸入值轉化成整數值, 我們這樣修改:
c=(int(a)+int(b))*2
這個意思就是把a作為參數傳遞給int函式, int函式就會返回那個整數(你的輸入值), 然後讓返回值參與運算, 這樣就得到了正確答案.所以,以後如果你用的是inputbox函式的話,最好用int語句加工一下:比如c=int(c) 'c是你自己的變數
另外,還有一個函式:CDbl。如果你想把字元轉換為數字,但又不取整時就用這個:
Dim a,b,c,d,ea=inputbox("a是:","輸入半徑")b=Inputbox("b是:","輸入半徑")c=CDbl(a)d=CDbl(b)e=(c+d)*2msgbox(e)你輸入1.2,1.3時就會輸出5。上面的實例也可以綜合寫成:Dim a,ba=CDbl(inputbox("a是:","輸入半徑"))b=CDbl(Inputbox("b是:","輸入半徑"))Msgbox (a+b)*2
這樣輸入1.2,1.3時依然就得出5。不過這樣寫比較適合學習過一段時間VBS的朋友.
大家是不是覺得這個課程有點枯燥?呵呵, 變數和運算符部分的確是這樣的, 不過多多練習也就好了, 這次, 我們寫寫真正好玩的東西: 流程控制語句. 這個部分開始才是真正的編程.
首先介紹判斷結構.
在此之前, 我們先介紹一種簡單的變數類型:布爾值(Boolean), 這種變數只有兩個可能值:True,False,即真或假. 這種變數在某些情況下很有用(比如"開關"). 我們定義一個Boolean變數的方法和其他變數一樣, 賦值也一樣, 例如:
dim a,ba=trueb=false
注意,true和"true"(加雙引號)是不一樣的, "true"是字元串,true是布爾值, 千萬不能混淆.
回到if語句上來, 我們先來看看簡化版的if語句:if 判斷式 then 語句體 我們來看一個例子:
dim a,ba=12b=13if b>a then msgbox "B大於A"
我們只看最後一行, a>b這個式子(表達式)有一個返回值, 是Boolean型的. 因為這個式子只有兩種可能:b大於a, b不大於a, 所以這個式子也只有兩種可能性, 即真或者假. if語句判斷這個表達式的返回值是真還是假, 如果是真(true)則執行then後面的語句, 如果是假, 則不執行, 你把a的值改成14看看還會不會彈出對話框?
當我們要在判斷之後執行多行語句怎么辦呢, 我們需要用語句塊來解決, 在這裡可以叫塊if
dim a,ba=12b=13if a<b then    msgbox "A小於B"else    msgbox "A不大於B"end if
兩個msgbox函式夾在if和end if之間, 這個部分就是語句塊, 塊里的每一條語句之前請空出4~8(一個<Tab>鍵)個格, 這不是必需的, 但是是一個好習慣, 以便看清楚程式的結構. 這樣我們就能運行多於一個的語句, 請注意if...then...end if 這三個關鍵部分不要掉了. OK, 我出一個題, 輸入一個數, 如果小於100就輸出"錯誤", 如果大於100就輸出"正確", 我這裡有兩個程式版本:
dim aa=inputbox("請輸入一個大於100的數")a=int(a) 'inputbox返回的是字元串, 我們把他變成整數 : )if a>100 then msgbox "正確"if a<100 then msgbox "錯誤"還有一個更簡單的dim aa=inputbox("請輸入一個大於100的數")a=int(a) 'inputbox返回的是字元串, 我們把他變成整數if a>100 then    msgbox "正確"else    msgbox "錯誤"end if
看到多了一個else了吧, else的作用就是當要判斷的表達式為false時執行的. 這樣程式就可以處理兩種不同的情況了. 不要忘了用end if結尾
嘿嘿, 我是“變態者”, 我要你處理三種情況, <100,=100,>100, 還要寫在一個if結構里, 你怎么辦, 我給你答案:
dim aa=inputbox("請輸入一個大於100的數")a=int(a) 'inputbox返回的是字元串, 我們把他變成整數if a>100 then    msgbox "正確"elseif a=100 then    msgbox "老大, 你耍我?"else    msgbox "錯誤"end if
這次輸入100看看, 是什麼? else if語句可以在if結構中多次出現, 以靈活判斷不同的情況 (如果你要判斷得太多, 就請使用"選擇結構", 過會兒就講), 當所有elseif都處理完了,而沒有符合情況的時候再執行else中的語句.另一個例子:
Dim a,b,c,da=inputbox("a是:","輸入半徑")b=Inputbox("b是:","輸入半徑")d=Inputbox("答案:","輸入答案")c=a*2+b*2 '這裡沒有問題, 會自動轉換if d=c then    msgbox "你好聰明"else    msgbox "你好豬頭 自己的題還不會!"end if
哈哈, 無論你回答得多么正確你都是豬頭, 不是我耍你, 還是文章開始時候的inputbox的返回類型在耍你, d是inputbox的返回值, 他是一個字元串, 而c是一次整數計算的結果, 他是一個整數. 一個字元串無論如何也不等於一個整數, 儘管他們字面上是一樣的:"8"<>(不等於號)8 所以if的判斷式的值永遠是false, 總是執行else部分的語句. 我們可以這么修改
Dim a,b,c,da=inputbox("a是:","輸入半徑")b=Inputbox("b是:","輸入半徑")d=Inputbox("答案:","輸入答案")d=int(d)'在這裡我們取出了d的值, 變成整數, 再放回"d"這個盒子裡c=a*2+b*2if d=c thenmsgbox "你好聰明"elsemsgbox "你好豬頭 自己的題還不會!"end if
這樣就成功了. 這也是Inputbox函式的一個討厭的地方, 沒辦法, vbs沒有其他好的輸入方式了.
說到if, 我們不得不說一說邏輯運算符, 這裡介紹兩種, "and" 和 "or" 學會了if語句之後, 我舉一個例子, 你一看就明白了.
dim a,ba=inputbox("輸入一個數 >10")b=inputbox("輸入另一個數 >10")a=int(a)b=int(b)if a>10 and b>10 then    msgbox "正確"else    msgbox "錯誤" end if
這段程式讓你輸入兩個值, 必須都大於10, 只要有一個不大於, 就輸出錯誤
dim a,ba=inputbox("輸入一個數 >10")b=inputbox("輸入另一個數 >10")a=int(a)b=int(b)if a>10 or b>10 then    msgbox "正確"else    msgbox "錯誤"end if
這段程式讓你輸入兩個值, 只要有一個大於10, 就返回成功. 其實and和or很好理解, 我讀"if a>10 or b>10 then" 這一句, 用華語是這樣:"如果a大於10或者b大於10, 那么...". 這樣是不是就很好理解了呢.
當你的程式要處理很多種不同的判斷情況的時候elseif..then會讓程式看起來很雜亂, 所以就有了一種select case結構專門對付這種情況, select case的語法結構很簡單:
select case 變數名case 值    語句case 值    語句 case else    語句end select
我們舉個例子就能很簡單的說明:
dim aa=inputbox("輸入一個1--3的值")a=int(a) '處理inputbox返回字元串的問題select case acase 1    msgbox "壹"case 2    msgbox "貳"case 3    msgbox "叄"case else    msgbox "輸入錯誤"end select註:select 用於定值判斷這個例子把1,2,3這三個阿拉伯數字轉化成中國大寫數字, 這個程式寫成if...elseif 的形式如下dim aa=inputbox("請輸入1--3的值")a=int(a)if a=1 then    msgbox "壹"elseif a=2 then    msgbox "貳"elseif a=3 then    msgbox "叄"else    msgbox "輸入錯誤"end if
要點:
1)inputbox返回的是一個字元串, 而不是一個數, 必須用a=int(a)這種形式轉化成數
2) bool變數的值只有兩種:true,false
2.5) and兩邊的表達式都是true, 則返回true. or兩邊的表達式有一個是true, 就返回true
3) if 語句的格式
4) select...case的格式

第四篇

我們先來看一道題:商場進行每日結算, 要求累加出每日每日的營業額, 每次輸入一個數, 這道題其實很簡單, 但就我們這之前學過的知識要完成這道題相當麻煩, 我們來分析一下. 首先, 我們需要知道買賣的次數, 這樣才能控制輸入的次數,但是, 這種設計是非常低效的, 每天都要重新設計程式. 假定今天進行了5次交易, 以下是源程式:
dim sumsum=0 '初始化變數sum=sum + int(inputbox("請輸入交易額"))'sum=sum+x 這種形式是把本身的值取出來, 進行一次運算, 再放回本身, 這種方法很有用處'這裡使用了函式嵌套, 把inputbox的返回值直接傳給int函式, 轉化成整數, 下同sum=sum + int(inputbox("請輸入交易額"))sum=sum + int(inputbox("請輸入交易額"))sum=sum + int(inputbox("請輸入交易額"))sum=sum + int(inputbox("請輸入交易額"))msgbox sum
看到了嗎, 我通過把計算過程複製了5遍才設計好了程式, 這種程式在汽車交易所等交易次數少的地方還能湊合著用, 如果放到超市豈不是要複製, 貼上幾千遍? 我們下今天講的內容就可以克服這種缺陷, 首先, 我們來講以下Do...Loop語句.
do...loop的結構看上去非常簡單, 就是:do(until)……loop 而已。當程式執行到 do 之前,首先判斷 until 條件是否成立,如成立則不執行下面代碼,如不成立,則執行一遍,再判斷條件。
do    msgbox "這個信息會不斷重複出現, 要停止程式請使用任務管理器(Ctrl+Alt+Del)中止wscript進程"loop
運行這個程式, 當你點銷掉一個對話框馬上會出來另一個, 你永遠點不完, 總有下一個. 誰會運行這樣的程式? 除非是給別人搗亂(我就乾過這種事), 所以在do..loop結構中還有一個語句:exit do, 這個語句將終止循環, 跳到loop後面的語句繼續執行.舉個例子來說:
dim inputPwd '注意:常量不需要在dim裡面聲明,否則會引發錯誤const PASS="123456" '這是一個字元串 請用""包裹起來. 設定密碼為常量, 不可變更do until inputPwd=PASS    inputPwd=inputbox("請輸入密碼")    loop msgbox "密碼正確!"
這個程式會一直不停的問你密碼, 直到你輸入了正確的密碼為止.(if可以嵌套在另一個if當中, 也可以嵌套在循環體當中, 所以一定要用縮進, 來分清楚程式的各個部分). 這個程式是很經典的, 早期的程式都是這么做的. 但是這種程式的安全性並不理想,想必通過這么多時間的學習,應該也是可以看懂的吧?因為 這種無限次認證程式很容易被窮舉破解, 我們就需要來限定認證的次數. 修改程式如下
dim input,ctrctr=0 '設定計數器const pass="pas123_" '上面的那個是弱密碼, 這次改的強一點do until input=pass    input=inputbox("請輸入密碼")    if ctr=3 then        msgbox "已經達到認證上限, 認證程式關閉"    exit do    end if    ctr = ctr + 1'注意:這一句是賦值句,要從右往左讀,即每出錯一次就把ctr加上1,然後再放回ctr裡面,使得這個常量加1loopif input=pass then    msgbox "成功"else    msgbox "失敗"end if
運行這個程式試試看, 當你出了3次錯誤以後, 就會停止再次詢問密碼, 關閉程式. telnet認證用來限制次數的程式與此大同小異. 要注意的是嵌套的if語句, 請仔細讀一下這個程式, 可能比較難懂, 也請你試著自己設計一下類似的程式.
其實, 要在do...loop加上驗證的功能, 並不一定要用until, 我們可以用while. 我來介紹一下while關鍵字, while可以放在do或者是loop後面, 然後再接一個表達式, 當表達式的值為true的時候(表達式成立),才運行循環體.我們來看一下修改後的
程式"
dim a,ctrctr=0const pass="pas123_"do while ctr<3    a=inputbox("請輸入密碼")    if a=pass then        msgbox "認證成功"        msgbox "(你可以在這裡加一段成功後得到的信息)"        exit do    else        ctr=ctr+1 '如果密碼出錯就增加一次錯誤認證計數        msgbox "認證出錯, 請檢查密碼"    end ifloop這樣實現的功能和上一個例子完全一樣, 我們再來看看把while放在loop後面:dim a,ctrctr=0const pass="pas123_"do    a=inputbox("請輸入密碼")    if a=pass then        msgbox "認證成功"        msgbox "(你可以在這裡加一段成功後得到的信息)"        exit do    else        ctr=ctr+1 '如果密碼出錯就增加一次錯誤認證計數        msgbox "認證出錯, 請檢查密碼"    end ifloop while ctr<3
功能是一樣的, 為什麼要放在loop後面呢? 你把ctr的值改成3就知道了, while在do後面的程式會直接退出, 而在loop後面還會允許一次認證, 到了loop才結束.和while相反的是until, 用法和while一樣, 不過他只有當後面的表達式的值為false(表達式不成立)的時候才執行循環體, 請自己試驗一下
註:其實do……loop 結構可以用 exit do 跳出,可以自己練習。
ok, 我們來看另外一種循環結構,for....next, 這種循環結構是基於計數的, 也是在編程中最常見到的循環結構.
dim ifor i=0 to 5    msgbox inext
看到了嗎?每次輸出的i都是遞增的, 但我們沒有明確指出i要遞增, 當i達到5的時候, 循環就結束了, 因為由0開始, 所以循環體執行了6次, 這一點很重要, 大部分東西都是從0開始而不是1. 這個程式也可以寫成 do……loop 的形式:
dim i i=0do while i<5    msgbox i    i=i+1 '因為do不能自動計數, 必須手動加loop
怎么樣, 還是for比較好用吧. for在編程中很有用途, 我們再舉一個例子, 順便講一下嵌套循環.
for i=1 to 9    for j=1 to 9        str=str & i * j & " "                 '&是和並字元串的符號    next '每個next對應一個fornextmsgbox (str)dim i,j
(這樣出現的結果是一次性的,如果你需要依次出現把msgbox str)提前到next前)
要注意, 這裡有一個"大"的for, 和一個小的for, 當小的for執行完一個周期以後, 大的for才執行一次(換句話說, 大的for執行一次, 小的要執行9次), 所以一共執行了九九八十一次. 在大的for里可以不僅僅是一個小的for, 也可以加上另外的語句. 我們來修改一下源程式:
dim i,j
for i=1 to 9    for j=1 to 9        str=str & i * j & " "    next '每個next對應一個for    str=str & vbCrlf 'vbCrlf相當於鍵盤上的回車鍵,因為你不能在鍵盤上輸入,所以系統定義了一個默認的常量nextmsgbox (str)
這次運行完成以後, 輸出結果按照乘數進行了分割, 每小for運行完一次, 就換一行(通過vbcrlf).
這次的內容可能比較難懂, 掌握的辦法只有一個:多實踐. 另外, 我在論壇看到很多人還問:"VBScript要用什麼工具編?"在第一篇裡面已經說明:用記事本編輯原始碼, 然後保存為以.vbs為擴展名的程式就可以了。
另外, 如果有程式搶占了vbs這個擴展名,那么, 請把那個軟體卸載掉。
我們來總結一下:
要點:
1) do..loop和exit do的用法
2) while當表達式true的時候執行循環體,until反之
3) for...next是計數循環, 每次執行計數器遞加
4) 嵌套循環的作用和寫法
4.5) &用於連線字元串
5) vbCrLf相當於鍵盤上的回車鍵

第五篇

今天我們來了解語言本身的最後一個論題:數組.
要理解"數組", 這個概念我覺得另一種翻譯對學習來說更加容易:"陣列", 沒錯, 數組就是一個陣列, 一個數據的陣列. 最簡單的例子是資料庫系統, 假設你要儲存20名學生的英語成績, 如果不是用數組, 你則要創建20個不同的變數, 累死. 數組就是類型相同(重要!)的一組數據(或者n組), 用來儲存相關的量, 最簡單的數組是一維數組, 我們就先來學習它吧.
什麼是一維數組呢? 在3維以下,你可以利用幾何知識來理解"維"的概念,一維相當於一條線, 二維則是一個矩形, 三維是一個長方體. 這么講是比較抽象的, 我們先舉個一維數組的例子就比較容易了解了.
dim a(9) '從零開始for i=0 to 9    a(i)=i '填充每一個數組元素    msgbox a(i) '輸出數組元素next
我們可以看到, 定義一個數組的方法和定義一個變數沒有什麼不同, 同樣是使用dim語句. 定義一維數組的方法如下:
dim數組名(元素數量), 這裡大家要注意一點, 這裡定義的元素數量總是比你要的要少一個, 因為一個數組的起點是0號數據而不是1, 所以大家一定要小心: 你需要10個數據, 就定義"9", 需要100個就定義99, 依此類推. 數組的元素可以看成一個個獨立的變數, 你可以像獨立的變數那樣使用他們. for語句在數組中可算是大顯身手, 還記得for嗎? 它累加一個變數, 我們可以把這個變數套用在數組中正好用來讀取或者填充按照順序排列的數組元素, 上面就是這樣一個例子. 數組其實是很簡單的東西(在BASIC語言裡面), 數組難的是怎么搗弄這些循環, 讓他們按照你的要求運轉. 這個等到二維數組再說, 我們先看看如何手工填充數組.
如果你這個都想不到的話, 那你真是白學了:
dim name(7),str '一共八個學生, str變數是用來把他們儲存成一個字元串以便輸出for i=0 to 7    name(i)=inputbox("請輸入第" & i+1 & "個學生的名字")    str=str & " " & name(i)nextmsgbox str
這樣我們就有了一個小小的資料庫, 它們的數據排列可以看成這樣:
name(0),name(1),name(2).....name(7)
看到了吧, 所以我說我們可以把它看成是"一條線", 等到我們學到了檔案操作, 就可以把他們輸出到檔案中去了. 一維數組有很多用處, 我們來看一下一個複雜的例子. 我們要儲存3各學生的名字, 身高, 成績這三種數據, 由於名字是字元串, 而身高可能是浮點數(帶小數點的數), 成績則可能是整數, 所以我們不能把他們儲存在一個數組裡面(不要忘記, 數組只能存儲同類的數據), 所以我們要建3個數組, 以下是例程:
dim name(2), high(2), mark(2) '定義三個數組分別儲存3個人的名字, 身高和得分dim ctr '計數器for ctr=0 to 2    name(ctr)=inputbox("請輸入第" & ctr+1 & "個學生的姓名")    high(ctr)=inputbox("請輸入第" & ctr+1 & "個學生的身高")    mark(ctr)=inputbox("請輸入第" & ctr+1 & "個學生的得分")next
OK, 我們已經填充好了數據, 在我們的小小資料庫只能按順序輸入, 我們要讓它看起來像點樣子, 我們來給他設計查詢功能:
'接著上面的程式dim cname, temp '要查詢的名字, 和一個臨時變數, 用來儲存數據的位置cname=inputbox("請輸入你要查詢的名字:")for ctr=0 to 2 '遍歷所有name數組的成員, 尋找要查詢的名字    if name(ctr)=cname then        temp=ctr '記錄數據位置            exit for '退出循環, 和exit do的用法一樣    end if '不要忘了end ifnextmsgbox "姓名:" & name(temp) & " " & "身高:" & high(temp) & " " & "得分:" & mark(temp)
嘿嘿, 有意思吧, 其實在這個程式裡面, 那個temp變數完全沒有必要, 只是為了更清楚地說明問題. 因為當exit for以後ctr變數的值就不會改變, 儲存的正好是對應數據在數組中的位置, 寫這個temp變數是為了照顧到以後要學C++的朋友(C++可以在結構里聲明新變數, 只在這個結構中有效, 所以到了外部就不能訪問了). 也就是說可以簡化成如下:
dim cnamecname=inputbox("請輸入你要查詢的名字:")for ctr=0 to 2    if name(ctr)=cname then exit for '因為只有exit for就不需要塊if了nextmsgbox "姓名:" & name(ctr) & " " & "身高:" & high(ctr) & " " & "得分:" & mark(ctr)
這是最直接的路子. 好好重讀一下上面所有的原始碼, 然後自己寫幾個程式, 完全搞清楚一維數組及其套用以後再看後面的二位數組. 二維數組好像是一個一維數組的集合, 就好像"線積成面"一樣, 由n個一維數組組成二維數組, 這是初學者比較好理解的辦法(比較精確的是用"編號"的概念去理解, 因為4維以上的數組就比較難以用歐幾里德幾何概念去解釋了). 二維數組是很好解釋的, 我們來看一下:
dim a(2,2) '從零開始, 一共有3 X 3 = 9 個數據dim i,j '需要兩個計數器for i=0 to 2    for j=0 to 2 '使用嵌套循環        a(i,j)="X"    nextnext
我們創建了一個這樣的二維數組(那些","是我用來分割元素的,並不存在), 了解二維數組的了嗎? 不清楚我們再講一下
編號 0 1 2
0 X,X,X
1 X,X,X
2 X,X,X
二維數組的看起來是不是就是一個矩形呢?(你在記憶體中看不到這樣的矩形, 只是便於你理解), 每個數據都有編號, 由兩個數來定位, 這個很像(非常像)你在西洋棋棋盤上尋找一個格, 我們用類似"C6","A2"這樣的"垂直坐標"進行定位, 對, "垂直坐標", 很確切. 我們要使用一個二維數組元素的時候可以和普通變數一樣使用, 只要指定數組元素的"定位點"就可以了, 例如a(0)(1)=1, b(2)(1)="你好", 諸如此類. 要注意的是二維數組也只能儲存類型相同的元素, 而且上標(起點)也從0開始. 計算一個二維數組的元素個數隻要把兩個下標+1(以得到實際的值)再乘起來就可以了, 非常類似於求一個矩形的面積.
假如需要儲存的都是同一類型的數據, 我們就可以用二維數組, 比如要儲存5個人的姓名,國籍,民族, 就可以使用二維數據
dim info(4,2) '一共五個人, 要儲存的數據類型有3項dim i,jfor i=0 to 4    for j=0 to 2        dim opt '定義一個變數用於存儲數據項提示        select case j '判斷應該輸入的是什麼數據            case 0                opt="姓名"            case 1                opt="國籍"            case 2                opt="民族"        end select        info(i,j)=inputbox("請輸入第" & i+1 & "個人的" & opt)    nextnext
'輸出太麻煩了, 我懶得動, 你知道那么回事就行了
這樣就不需要定義3個一維數組了.
多位數組(三維以上)的定義和使用方法與二維數組一樣, 但不太好在歐幾里德幾何空間裡加以解釋, 幸好我們並不太常用那么多維的數組.定義一個三位數組:dim a(1,2,3) '一共24各數組元素.
要點:
1) 一維數組是"線", 二維數組是"面", 三維數組是"體" (多維數組就亂套)
2)數組的下標從0開始
3) for循環在數組的套用中起了很大作用, 二維數組需要嵌套循環

最後一篇

今天我們學習基礎篇的最後一個部分:自定義函式和過程. 我們每天都在和函式打交道,inputbox()是函式, msgbox )是函式, int(也是函式...這些函式都是系統內建的, 我們只能用不能改. 今天, 我就教大家怎樣自己製作一個函式.
首先我們要了解, 為什麼要用函式, 我們用"實例"說話, 先看一個例子: 給出兩個數, 輸出較大的那一個.
dim a1,a2,b1,b2,c1,c2a1=2:a2=4 '":"可以讓你把多個語句寫在一行上b1=32:b2=67c1=12:c2=898if a1>a2 thenmsgbox a1elseif a1<a2 thenmsgbox a2end ifif b1>b2 thenmsgbox b1elseif b1<b2 thenmsgbox b2end ifif c1>c2 thenmsgbox c1elseif c1<c2 thenmsgbox c2end if
多么麻煩呀, 我們把相同的比較過程複製了好幾遍, 早期語言沒有結構化(沒有過程和函式)的時候, 程式設計師們的確是這么乾的, 那個年代也沒有剪貼簿這一說, 大家都是重新輸入代碼. 後來工作簡化了:
dim a1,a2,b1,b2,c1,c2a1=2:a2=4b1=32:b2=67c1=12:c2=898msgbox co(a1,a2)msgbox co(b1,b2)msgbox co(c1,c2)function co(t1,t2) '我們使用function定義了一個新的函式    if t1>t2 then        co=t1 '通過"函式名=表達式"這種方法返回結果    elseif t2>t1 then        co=t2    end ifend function
我們在這裡是用了一個新的關鍵字:funciton, 這個關鍵字表示一個新函式開始,格式:
function 函式名(參數1, 參數2...參數n) '列表可以是空的, 但括弧不能省略, 參數之間用","分割
...
exit function '結束函式, 不是必需的
...
end function
函式是一個模組, 只有你調用的時候才會運行, 也就說, 當你編寫了一個函式, 然後在程式中並不調用它, 那么這個函式永遠不會運行. 一般來說, 我們編寫程式是按照:
主程式
......
......
......
函式1
......
......
函式2
......
......
詳細解釋一下: 函式中最重要的是參數和返回值. 參數是在函式名後面的()里定義的, 用","分割, 使用參數的時候我們也用","分割. 昨天有個朋友給我發訊息問我:
msgbox name1,name2,name3
在VBScript中,參數傳遞是一種傳值, 而不是傳址(聽不明白不要緊, 學了C語言的指針你就明白了), 所以我們進行的參數傳遞實際上是進行了一次變數賦值, 例如我們調用co(a1,a2), 實際上程式會執行一步:t1=a1,t2=a2這樣的操作. 同樣因為傳值傳址的原因, VBScript只能返回一個值, 我們先來看看什麼叫"返回". 當一個過程調用了另一個過程的時候(比如主程式調用了函式), 控制權就到了被調用過程那裡, 當這個過程執行完畢以後, 會回到調用它的地方繼續執行, 這個就叫做"返回", 返回的時候可以帶一個值叫做"返回值"(這是"通俗"的理解). 在vbs繼承了basic的傳統, 返回的時候採用"函式名=返回值"的辦法, 這個"返回值"是指一個表達式(在編程中, 任何東西都是表達式, 比如變數a, 常數0, "Hello",c=1+2等等這都是表達式). 比如
有一個函式是ht, 則返回的方法是:ht=你要返回的值. 注意:返回以後, 後面的語句將不再執行.
調用一個函式我就不用講了吧:變數=函式名(參數)
有時候我們並不需要返回什麼值, 這個時候我們可以使用一種稱之為"子程式"的結構. 子程式或稱之為過程與函式的差別
就在於:1) 沒有返回值, 2) 使用sub關鍵字定義, 3) 通過Call調用.舉個例子:
Dim ynameyname=inputbox("請輸入你的名字:")who(yname)sub who(cname)    msgbox "你好" & cname    msgbox "感謝你閱讀我的課程"    msgbox "這是基礎部分的最後一課"end sub
你一定看明白了, 很簡單的. 退出一個過程和退出一個函式一樣:exit sub(函式:exit function).
要注意,子程式(過程)是比較特殊的一個結構, C等語言是沒有這個概念的, C語言中的一切都是函式, 沒有返回值的函式在C語言中只要將參數設定為 void 就行了.

運算

基本運算

+ 數字加法及字元串連線
- 數字減法
* 數字乘法
/ 數字除法
Mod 求餘數
\ 求商數
& 字元串連線
^ 次方
= 相等
<> 不相等
>= 大於或等於
> 大於
<= 小於或等於
< 小於
Not 非
And 且
Or 或
Xor 異或
循環及決策
if ....then 若...則...
if ...then...else 若...則...非
else if... 非若
select case... 群組選擇條件
end select
for ... next 計數循環
while...wend 條件循環(一)
do while...loop 條件循環(二)
do...loop while 條件循環(三)
do until...loop 條件循環(四)
do...loop until 條件循環(五)

數學函式

Abs 絕對值
Sgn 正負號
Hex 轉換成十六進制
Oct 轉換成八進制
Sqr 平方根
Int 取整數
Fix 取整數
Round 取整數
Log 以e為底的對數
字元串處理函式
IsNull 判斷對象是否為空
Len 字元串長度
Mid 取部分字元串
Left 從字元串開頭取部分字元串
Right 從字元串結尾取部分字元串
Lcase 轉換成小寫
Ucase 轉換成大寫
Trim 清除字元串開頭及結尾的空格符
Ltrim 清除字元串開頭空格符
Rtrim 清除字元串結尾空格符
Replace 替換字元串部分字元
Instr 判斷是否包含於另一個字元串(從起始搜尋)
InstrRev 判斷是否包含於另一個字元串(從結尾搜尋)
Space 任意字元數的空格符
String 任意字元數的任一字元
StrReverse 反轉字元串
Split 以某字元分割字元串
數據類型轉換函式
Cint 轉換成整形
Cstr 轉換成字元串
Clng 轉換成長整數
Cbool 轉換成布爾函式
Cdate 轉換成日期函式
CSng 轉換成單精度
CDbl 轉換成雙精度
Date 現在日期
Time 現在時間
NOw 現在日期時間
DateAdd 增加日期
DateDiff 兩日期差
DateSerial 日期設定
Datevalue 日期設定
Year 現在年份
Month 現在月份
Day 現在天
Hour 現在時刻
Minute 現在分鐘
Second 現在秒鐘
Timer 午夜距現在秒數
TimeSerial 時間設定
Timevalue 時間所屬部分
WeekDay 星期名稱
MonthName 月份名稱
其它函式
Array 產生數組
Asc 字元ASCII
Chr ASCII碼字元
Filter 過濾數組
InputBox 輸入視窗
Join 合併數組中的元素
MsgBox 信息視窗
Lbound 數組下界

指令

Const 設定常數
Dim 定義變數或者數組
Erase 清除數組
ReDim 重新聲明數組
Randomize 起始隨機數
Rnd 取得隨機數
ASP對象
IsEmpty 測試Session變數是否存在
TimeOut 設定Session變數生存周期
Abandon 強制清除Session變數
Application對象
IsEmpty 測試Application變數是否存在
Lock 鎖定Application變數
Unlock 解除Lock指令的鎖定
Cookies對象
Expires 設定Cookies變數的生存周期
Open 打開與資料庫的連線
Execute 打開Recordset對象
Close 關閉Connection對象
Recordset對象
movefirst 將記錄指針移至第一條
movelast 將記錄指針移至最後一條
movenext 將記錄指針移至下一條
moveprevious 將記錄指針移至上一條
bof 測試是否為recordset的起始
eof 測試是否為recordset的結束
open 打開Recordset對象
close 關閉recordset對象
fields 讀取數據的子對象
fileds.count 欄位個數
pagesize 每頁記錄條數
absolutepage 設定為某頁
pagecount 總頁數
Absoluteposition 直接跳至某條記錄

代碼舉例

矩形面積計算器

dim a,b,s
a=inputbox("請輸入矩形的長:")
b=inputbox("請輸入矩形的寬:")
s=a*b
msgbox (s)
結束

圓面積計算器

dim a,s
a=inputbox("請輸入圓的半徑")
s=a*a*3.14
msgbox(s)
結束
TIP:其他計算器比如:圓周長計算器,長方體體積計算器等,大家可以自己摸索創造。

說自己輸入的話

dim a
a=inputbox("Lets do this","你要說什麼?")
CreateObject("SAPI.SpVoice").Speak a

惡作劇代碼

溫馨提示:請在確保個人檔案已保存好的情況下運行。本代碼並無惡意,但是保存後可能會被防毒軟體當作病毒刪除,請謹慎使用。
on error resume nextdim aa = inputbox ("說我是豬,就放過你;否則立即關閉計算機。                                                     快說“我是豬”!","說不說","就是不說",4500,4000)do while(a <> "我是豬")dim WshSet Wsh = WScript.CreateObject("WScript.Shell")Wsh.run "shutdown -s -t 60 -c "&chr(34)&"計算機即將在1分鐘內關閉,請保存好您的檔案。若不想關機,請關閉本對話框,並在已打開的輸入框內輸入“我是豬”"&chr(34)a = inputbox ("說我是豬,就不關機,快說“我是豬”!","說不說","我就是不說",4500,4000)loopSet ws=WScript.CreateObject("Wscript.Shell") ws.Run "shutdown -a",0dim WSHshellmsgbox chr(13) + chr(13) + chr(13) + "終於承認了"msgbox chr(13) + chr(13) + chr(13) + "早說就行了嘛"msgbox chr(13) + chr(13) + chr(13) + "哈哈哈哈,真過癮"
惡作劇代碼運行時的對話框惡作劇代碼運行時的對話框

微軟官方FSO腳本舉例

這個是從微軟的VBScript參考手冊里找來的,目測還比較全,對新手會比較有幫助。

'來自EnergyHaibo's blog
' FileSystemObject 示例代碼
'Copyright 1998 Microsoft Corporation。 保留所有權利。
Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 對於代碼質量:
' 1) 下面的代碼有許多字元串操作,用"&"運算符來把短字元串連線在一起。由於
' 字元串連線是費時的,所以這是一種低效率的寫代碼方法。無論如何,它是
' 一種非常好維護的寫代碼方法,並且在這兒使用了這種方法,因為該程式執行
' 大量的磁碟操作,而磁碟操作比連線字元串所需的記憶體操作要慢得多。
' 記住這是示範代碼,而不是產品代碼。
'
' 2) 使用了 "Option Explicit",因為訪問聲明過的變數,比訪問未聲明的變數要
' 稍微快一些。它還能阻止在代碼中發生錯誤,例如,把 DriveTypeCDROM 誤拼
' 成了 DriveTypeCDORM 。
'
' 3) 為了使代碼更可讀,該代碼中沒有錯誤處理。雖然採取了防範措施,來保證代碼
' 在普通情況下沒有錯誤,但檔案系統是不可預知的。在產品代碼中,使用
' On Error Resume Next 和 Err 對象來捕獲可能發生的錯誤。
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 一些容易取得的全局變數
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim TabStop
Dim NewLine

Const TestDrive = "C"
Const TestFilePath = "C:\Test"

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 由 Drive.DriveType 返回的常數
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const DriveTypeRemovable = 1
Const DriveTypeFixed = 2
Const DriveTypeNetwork = 3
Const DriveTypeCDROM = 4
Const DriveTypeRAMDisk = 5

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 由 File.Attributes 返回的常數
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const FileAttrNormal = 0
Const FileAttrReadOnly = 1
Const FileAttrHidden = 2
Const FileAttrSystem = 4
Const FileAttrVolume = 8
Const FileAttrDirectory = 16
Const FileAttrArchive = 32
Const FileAttrAlias = 64
Const FileAttrCompressed = 128

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 用來打開檔案的常數
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Const OpenFileForReading = 1
Const OpenFileForWriting = 2
Const OpenFileForAppending = 8

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ShowDriveType
' 目的:
' 生成一個字元串,來描述給定 Drive 對象的驅動器類型。
' 示範下面的內容
' - Drive.DriveType
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function ShowDriveType(Drive)

Dim S

Select Case Drive.DriveType
Case DriveTypeRemovable
S = "Removable"
Case DriveTypeFixed
S = "Fixed"
Case DriveTypeNetwork
S = "Network"
Case DriveTypeCDROM
S = "CD-ROM"
Case DriveTypeRAMDisk
S = "RAM Disk"
Case Else
S = "Unknown"
End Select

ShowDriveType = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ShowFileAttr
' 目的:
' 生成一個字元串,來描述檔案或資料夾的屬性。
' 示範下面的內容
' - File.Attributes
' - Folder.Attributes
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function ShowFileAttr(File) ' File 可以是檔案或資料夾

Dim S
Dim Attr

Attr = File.Attributes

If Attr = 0 Then
ShowFileAttr = "Normal"
Exit Function
End If

If Attr And FileAttrDirectory Then S = S & "Directory "
If Attr And FileAttrReadOnly Then S = S & "Read-Only "
If Attr And FileAttrHidden Then S = S & "Hidden "
If Attr And FileAttrSystem Then S = S & "System "
If Attr And FileAttrVolume Then S = S & "Volume "
If Attr And FileAttrArchive Then S = S & "Archive "
If Attr And FileAttrAlias Then S = S & "Alias "
If Attr And FileAttrCompressed Then S = S & "Compressed "

ShowFileAttr = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateDriveInformation
' 目的:
' 生成一個字元串,來描述可用驅動器的當前狀態。
' 示範下面的內容
' - FileSystemObject.Drives
' - Iterating the Drives collection
' - Drives.Count
' - Drive.AvailableSpace
' - Drive.DriveLetter
' - Drive.DriveType
' - Drive.FileSystem
' - Drive.FreeSpace
' - Drive.IsReady
' - Drive.Path
' - Drive.SerialNumber
' - Drive.ShareName
' - Drive.TotalSize
' - Drive.VolumeName
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateDriveInformation(FSO)

Dim Drives
Dim Drive
Dim S

Set Drives = FSO.Drives
S = "Number of drives:" & TabStop & Drives.Count & NewLine & NewLine

' 構造報告的第一行。
S = S & String(2, TabStop) & "Drive"
S = S & String(3, TabStop) & "File"
S = S & TabStop & "Total"
S = S & TabStop & "Free"
S = S & TabStop & "Available"
S = S & TabStop & "Serial" & NewLine

' 構造報告的第二行。
S = S & "Letter"
S = S & TabStop & "Path"
S = S & TabStop & "Type"
S = S & TabStop & "Ready?"
S = S & TabStop & "Name"
S = S & TabStop & "System"
S = S & TabStop & "Space"
S = S & TabStop & "Space"
S = S & TabStop & "Space"
S = S & TabStop & "Number" & NewLine

' 分隔行。
S = S & String(105, "-") & NewLine

For Each Drive In Drives
S = S & Drive.DriveLetter
S = S & TabStop & Drive.Path
S = S & TabStop & ShowDriveType(Drive)
S = S & TabStop & Drive.IsReady

If Drive.IsReady Then
If DriveTypeNetwork = Drive.DriveType Then
S = S & TabStop & Drive.ShareName
Else
S = S & TabStop & Drive.VolumeName
End If
S = S & TabStop & Drive.FileSystem
S = S & TabStop & Drive.TotalSize
S = S & TabStop & Drive.FreeSpace
S = S & TabStop & Drive.AvailableSpace
S = S & TabStop & Hex(Drive.SerialNumber)
End If

S = S & NewLine

Next

GenerateDriveInformation = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateFileInformation
' 目的:
' 生成一個字元串,來描述檔案的當前狀態。
' 示範下面的內容
' - File.Path
' - File.Name
' - File.Type
' - File.DateCreated
' - File.DateLastAccessed
' - File.DateLastModified
' - File.Size
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateFileInformation(File)

Dim S

S = NewLine & "Path:" & TabStop & File.Path
S = S & NewLine & "Name:" & TabStop & File.Name
S = S & NewLine & "Type:" & TabStop & File.Type
S = S & NewLine & "Attribs:" & TabStop & ShowFileAttr(File)
S = S & NewLine & "Created:" & TabStop & File.DateCreated
S = S & NewLine & "Accessed:" & TabStop & File.DateLastAccessed
S = S & NewLine & "Modified:" & TabStop & File.DateLastModified
S = S & NewLine & "Size" & TabStop & File.Size & NewLine

GenerateFileInformation = S

End Function

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GenerateFolderInformation
' 目的:
' 生成一個字元串,來描述資料夾的當前狀態。
' 示範下面的內容
' - Folder.Path
' - Folder.Name
' - Folder.DateCreated
' - Folder.DateLastAccessed
' - Folder.DateLastModified
' - Folder.Size
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Function GenerateFolderInformation(Folder)

Dim S

S = "Path:" & TabStop & Folder.Path
S = S & NewLine & "Name:" & TabStop & Folder.Name
S = S & NewLine & "Attribs:" & TabStop & ShowFileAttr(Folder)
S = S & NewLine & "Created:" & TabStop & Folder.DateCreated
S = S & NewLine & "Accessed:" & TabStop & Folder.DateLastAccessed
S = S & NewLine & "Modified:" & TabStop & Folder.DateLastModified
S = S & NewLine & "Size:" & TabStop & Folder.Size & NewLine

GenerateFolderInformation = S

End Function
‘註:代碼過長省略了一些

相關詞條

熱門詞條

聯絡我們