VBScript教程-第二章. 運行腳本

因爲過年, 一直沒有更新教程. 發現按照這個進度得下個世紀能完成我這宏偉的小計劃, 所以最近我會加快進度. 好多人問我學習方法, 其實真的是學習沒有捷徑. 最後說一句, 學習腳本最好準備一份幫助文檔, vbs就下載script56.chm這個文件就行了.

=========================萬惡的分割線後開始正題==========================

第二章. 運行腳本

 

本章重點

 

現在是時候開始運行我們的腳本了, 更重要的是學會如何編輯我們的腳本. 在本章, 你將瞭解到多種執行腳本的方法, 並瞭解創建和編輯腳本的細節. 您還可以完成自己的第一次腳本體驗.

 

假設你有幾個腳本準備去運行, 你將如何處理它們? 加載這些腳本到Visual Basic中並且去編譯它們? 你怎樣將它們分發給終端用戶並用作用戶的登錄腳本? 當你準備開始編寫腳本時, 你將如何去做? 有什麼可以使用的工具可以用, 以及如何使用? 本章的目的是介紹給你一些腳本工具, 利用它們去編寫, 運行, 修改, 調試你的管理腳本.

 

Windows 腳本宿主(Windows Script Host)

最常用的運行腳本的方式是使用WScript.exe, 這是一個圖形化的Windows腳本宿主(WSH), 我們已經在第一章中介紹國它. WScript通常默認與腳本的擴展名相關聯, 所以直接雙擊即可運行腳本. 例如擴展名爲VBS的文件.

嘗試下下面的動作過程:

1. 鼠標右擊你的桌面, 然後選擇新建一個文本文檔.

2. 重命名這個新建文本文檔爲 Sample1.vbs.

3. 右擊這個文件選擇編輯. 默認情況下Windows會自動使用記事本來打開這個文件.

4. 編輯內容爲WScript.Echo “Displaying Output” 並保存.

5. 關閉記事本.

6. 在桌面上創建另外一個新建文本文檔, 並重命名爲Sample2.vbs.

7. 編輯Sample2.vbs內容如下:

Wscript.Echo "Here we go..."

Dim V

V = InputBox("What is your name?")

MsgBox "Hello, " & V

這些都不是很複雜的腳本, 但它們有助於說明一些重要的概念. 首先, 雙擊Sample1.vbs. 如果您的系統配置正確, 會看到類似圖1的一個對話框. 點擊確定關閉對話框且結束第一個腳本. 然後, 我們雙擊Sample2.vbs. 它會啓動一個類似圖2的對話框. 最後如圖3, 會提示輸入你的名字.

clip_p_w_picpath001 圖1

clip_p_w_picpath002 圖2

clip_p_w_picpath003 圖3

最終你會看見如圖4這樣的對話框, 並把你輸入的名字顯示出來.

clip_p_w_picpath004 圖4

提示: 你剛剛看到的就是大概所有的VBS可用圖形控件. 如果你想創建非常複雜的圖形控件, 那麼請放棄VBS, 你需要類似於VB.NET這樣的強大語言.

從上面的演示你發現了什麼? 首先, 你已經體驗到了VBS爲用戶提供的圖形化接口: 基本的輸入輸出. 瞭解到了創建一些看起來貌似有些複雜的帶有Yes和No按鈕的對話框, 實際上還可以帶有Abort, Retry, 和Ignore按鈕, 但是那不是我們本章關心的問題僅僅是一些函數參數的設定而已.

這個腳本非常簡單, 你應該能夠找出每行代碼的作用. WScript.Echo顯式的顯示了一個帶有文本的對話框, 在上面的兩個示例腳本中都有使用.Dim V 是創建了一個名字爲”V”的變量(關於變量我們會在以後的章節中討論), 還有InputBox函數收集了一些信息並將此信息傳遞到變量”V”中. 最終MsgBox看起來似乎與WScript.Echo一樣在對話框中顯示了變量”V”中的信息.

說到這裏, 你最關心的是否是”WScript.Ech和MsgBox到底有什麼區別?” 實際上它們確實是不同的, 雖然只是很微妙.

腳本的命令行形式

大多數時候, 你肯定比較喜歡使用WScript.exe去執行腳本. 然而還有另外一種WSH, CScript.exe, 這是一個命令行的腳本執行宿主, 我相信在某些情況下你會癡迷於它.

CScript的不同之處在於它不提供給用戶任何非圖形化的輸入方式. 換句話說, 雖然你可以使用CScript來在一個命令行中顯示輸出, 但是你不能使用它從命令行來接收輸入(PS: 當讓不是絕對的, 因爲是微軟的老文檔, 所以可能當時是這樣的, 歷史就不考究了). 試試下面的例子, 你會明白我的意思的:

1. 打開一個命令行窗口.

2. 更改當前執行目錄到桌面文件夾.

3. 輸入 Cscript sample1.vbs.

你應當看見了如圖5所示的命令行輸出. 當使用WScript.Echo執行這個腳本時會彈出對話框. 當使用CScript.exe僅在命令行下輸出. 這也就允許你創建一個既可以執行在圖形化下又可以在命令行下的腳本. 這種編寫腳本的技術將適應每個環境.

clip_p_w_picpath006 圖5

我們再來使用同樣的方法執行Sample2.vbs. 剛開始時你會看到一個類似於圖6的的命令行, 是一個簡單的顯示例子中的WScript.Echo輸出. 然而, CScript將執行InputBox函數, 它被切換爲圖形模式, 如圖7所示, 就像使用WScript一樣. 最後, MsgBox命令同樣被強制轉化爲一個圖形化的輸出對話框, 如圖8所示, 準確的說這和WScript的執行結果是一樣的. 只有WScript.Echo是多模式的, WScript和Cscript對它的執行結果是不同的. 其他一切的控件都會默認執行成圖形化模式.

clip_p_w_picpath008 圖6

clip_p_w_picpath009 圖7

clip_p_w_picpath004[1] 圖8

爲什麼要關心這樣細微的差異? 有一天, 你可能要編寫一些要在後臺執行的任務計劃或者一些其他的工具. 這總是一個好的解決辦法, 腳本輸出一些信息讓你可以看到你的腳本都在做些什麼, 這樣你就可以有目的的調試你的腳本了. 如果你使用的是WScript.Echo來輸出, 並且使用WScript來運行它, 你將不得不爲每個輸出信息來點擊OK來達到讓腳本繼續的目的. 當你要後臺運行腳本時, WScript就不是一個好的選擇了, 因爲你不能在後臺執行你的點擊動作. 可以使用CScript來代替, 你的輸出仍將顯示(即使無法看到後臺的命令行), 腳本不會等待點擊確定來繼續執行. 如果你使用MsgBox, CScript將顯示一個對話框, 如果不點擊OK你的腳本將停止運行(PS: 其實是可以通過MsgBox的超時參數來實現自動繼續運行的). 因爲腳本會在後臺運行, 沒有人會一直點擊確定, 所以該腳本會保持掛起的狀態直到你結束這個腳本的進程.

個人補充: 還有就是在執行一些輪詢腳本時, 會有上千甚至上萬個輸出, 誰也不想一個個去點擊OK, 這時候使用CScript是非常明知的.

記事本和腳本編輯器

終於要開始編寫你自己的腳本了, 在腳本道路上基本都是從記事本開始. 記事本是免費的, 易於使用. 但是你可能會意識到記事本會使你的編寫變的十分困難, 是否有一些專門的工具和編輯器來供大家選擇呢?

基本: 記事本

這個大概大家都不陌生, 一個基本的Windows自帶的文本編輯器. 然而這又是一個差強人意的腳本編輯器. 它的最大問題在於無法顯式的看見行號, VBS腳本通常會報出”Go to line number”的錯誤提示, 雖然你可以通過記事本的跳轉行號功能來找到這一行, 或者使用狀態欄的顯示功能來找到, 但是這看起來並不是讓人滿意的.

記事本還缺少關鍵字高亮, 顏色標記等功能……當編寫很長的腳本時會感到很頭疼.

clip_p_w_picpath011圖9

加強: Programmer's File Editor

Programmer's File Editor, 也叫PFE, 是一個加強的記事本.

clip_p_w_picpath013 圖10

實際上這僅僅是一個記事本的加強版, 在行號, 高亮, 函數顏色標記等發麪還是不盡如人意的, 這裏提到僅僅是因爲微軟的腳本專家推薦過而已.

專業: VBScript Editors (僅爲微軟腳本專家的推薦, 其實我個人是用別的編輯器的)

腳本專家們推薦了3個工具:

1. VbsEdit (www.adersoft.com)

2. Creamsoft (www.creamsoft.com)

3. PrimalScript (www.sapien.com/products.htm)

這些工具都是收費的軟件, 理所當然的有好多高級功能, 對於調試等工作還是很方便的. 這些工具也可以對ASP, HTML, PHP, JSP等進行操作.

我個人比較喜歡使用SciTE, 大家也可以根據個人喜好找到順手的編輯器, 沒有最好只有用的是否習慣.

編寫你的第一個腳本

我並不想大家一開始就花錢在學習腳本上, 這裏我們假定使用的編輯器爲記事本.

爲了這第一個腳本, 我選擇了一個可以告訴你是哪個用戶或者哪些用戶打開執行的示例腳本.

' first, get the server name we want to work with

varServer = InputBox ("Server name to check")

' get the local path of the file to check

varFile= InputBox _

("Full path and filename of the file on the " & _

"server (use the local path as if you were at the " & _

" server console)")

' bind to the server's file service

set objFS = GetObject("WinNT://" & varServer & "/lamanserver,fileservice")

' scan through the open resources until welocate the file we want

varFoundNone = True

' use a FOR...EACH loop to walk through the open resources

For Each objRes in objFS.Resources

' does this resource match the one we're looking for?

If objRes.Path = varFile then

' we found the file - show who's got it

varFoundNone = False

WScript.Echo objRes.Path & " is opened by " & objRes.User

End If

Next

' if we didn't find the file open, display a msg

if varFoundNone = True then

WScript.Echo "Didn't find that file opened by anyone."

end if

執行你的第一個腳本

將腳本命名爲WhoHas.vbs後雙擊使用WScript執行. 首先會提示你輸入需要連接到的服務器,如圖12, 一定要確保當前用戶可以訪問該服務器(腳本運行默認爲當前用戶憑據來訪問服務器), 並且擁有管理權限. 然後輸入完整的路徑和文件名來檢查都有哪些用戶打開了該文件.

例如, 假設一個服務器上有D:\Shares\Sales, 共享名爲Sales. 一個用戶訪問該目錄下的SalesGoals.docx(即爲使用\\servername\Sales\SalesGoals.docx這樣的UNC路徑訪問),如圖11, 你現在想知道是哪個用戶或者哪些用戶訪問的這個文件. 你應當輸入D:\Shares\Sales\SalesGoals.docx, 此處爲服務器上的本地路徑, 如圖13.

當你單擊確定, 鬱悶的事情發生了. 提示在第11行上有錯誤, 如圖14! 看來我們需要調試這個腳本了.

clip_p_w_picpath015 圖11

clip_p_w_picpath016 圖12

clip_p_w_picpath017 圖13

clip_p_w_picpath019 圖14

爲第一個腳本調試和排錯

打開並找到11行, Oh my god! 居然是單詞拼寫這樣的無語錯誤(往往最難排除的就是這樣的最低級錯誤, 所以需要特別注意). 原來是把lanmanserver寫成了lamanserver, 如圖15. 改正後運行結果就變的正常了, 如圖16,這和圖11中的結果是一致的.

clip_p_w_picpath021 圖15

clip_p_w_picpath022 圖16

實際上排錯並沒有這麼簡單, 這裏只是給大家簡單演示一下. 通常情況下我們可能需要藉助工具來排錯, 例如使用Microsoft Script Debugger(www.Microsoft.com/scripting). 具體的一些操作可以參閱幫助文檔, 如果有必要我也會單獨發佈排錯的文章.

總結

VBScript執行起來是很容易的, 因爲默認情況下WScript.exe已經與每個Windows腳本相關聯. 在一些需要後臺執行或者輪詢處理的時候另一個WSH, CScript, 是非常重要的.

腳本編寫可能是一個比較棘手的問題, 因爲Windows並沒有提供內置的專門工具, 當然記事本是可以完成絕大部分的編寫工作的, 但是這並不是一個令人滿意的編輯器. 畢竟腳本並沒有像軟件開發項目這樣有着衆多的複雜要求, 因此也並不必強求大家來購買收費軟件.

接下來

現在你就可以創建和編寫你的腳本了, 你可以自己更多的學習和實踐了. 第三章將講解腳本的各個組成部分, 並介紹一些示例腳本. 第四章我們就要開始真正設計腳本了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章