Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:如何結束 For Each 迴圈?


如何結束 For Each 迴圈?

嗨,Scripting Guy!有什麼方法可以結束指令碼中的迴圈嗎?

-- MW

MW,您好。您知道嗎?當我們剛開始撰寫這個專欄時,是希望開闢一個小園地,專門回答指令碼初學者常見的基礎問題:

  • 如何確定指令碼中的目前日期?(使用 VBScript 的 Date 函式)。
  • 如何將訊息回應到向命令視窗而非訊息方塊中?(執行 CScript Scripting Host 底下的指令碼)。
  • 如何分辨變數是否包含數值?(使用 IsNumeric 函式)。

不過嘛,您也知道接下來的發展:很快地,越來越多人說他們很喜歡這個專欄,我們所回答的問題也越來越賣弄我們的指令碼技巧。我們變得太自滿,已經不再回答像是「如何顯示讓別人輸入資訊的對話方塊?」(使用 VBScript 的 InputBox 函式) 這類的問題,反而只回答複雜難解的問題,像是「如何撰寫指令碼來驅逐葛麗泰嘉寶 (Greta Garbo) 的幽魂?」雖然有趣又實用,但是往往超出指令碼初學者要處理的範圍。

 

附註:儘管笑吧,但是目前還沒有任何 Scripting Guys 遇過葛麗泰嘉寶的鬼魂。


大家應該都知道,跟超級名模整夜不停的狂歡之後,隔天早上難免有點懊悔。我們現在就是這種感覺。我們知道我們忽略了一群重要的讀者,也就是指令碼初學者,但是我們發誓絕不再犯。基於這點,我們現在會不時確保有解答最基本的指令碼問題;我們對天發誓,說到做到,今天我們就要來討論如何結束 For Each 迴圈 (顯然大家對這個問題都很感興趣,因為我們收到好幾封關於這個主題的來信)。

您有沒有聽到什麼聲音?好像鬼哭神號之類的…

回到主題:結束迴圈。假設您有 NT 4 網域,想確定特定使用者帳戶是否存在該網域中。如果您是執行 Active Directory,這倒易如反掌:只要搜尋該帳戶,幾秒鐘就能得到答案。但這是 NT 4,而 NT 4 沒有任何 ADO 提供者;這表示您無法在 NT 4 網域上搜尋帳戶資料庫。

那麼要如何分辨某個使用者帳戶是否存在 NT 4 網域中?其中一個方法是單槍直入的老派作法:擷取所有帳戶然後逐一檢查。而使用 For Each 迴圈就是最簡單的方法:

Set objComputer = GetObject("WinNT://fabrikam,domain")
For Each objItem in objComputer
    If objItem.Name = "kenmyer" Then
        Wscript.Echo "Account found."
    End If
Next

這個方法沒有什麼不對,視需求而定,倒是有可能得要埋頭苦幹,才能從所有帳戶集合中理出頭緒。唯一的問題出在,這個方法非常耗時;就以擁有 30,000 個帳戶的測試網域來說,我們的指令碼要花上 2 分鐘以上才能完成。如果您要找的恰好是帳戶集合中的最後一個帳戶,也只能苦等。但是如果尋找的帳戶剛好是集合中的第一個項目呢?這時馬上就找得到所需項目,但是必須耐心等待剩餘的 29,999 個帳戶結束才能完成 For Each 迴圈。

當然囉,除非您明確地結束此迴圈:

Set objComputer = GetObject("WinNT://fabrikam,domain")
For Each objItem in objComputer
    If objItem.Name = "kenmyer" Then
        Wscript.Echo "Account found."
        Exit For
    End If
Next

在第一段指令碼中,會檢查每個帳戶,確定其中是否包含名稱「kenmyer」;如果有,就回應「找到帳戶」訊息。這裡也是一樣,但是有一處不同:回應訊息後,接著會呼叫 Exit For 陳述式。Exit For 會立即結束迴圈;如果 kenmyer 剛好是第一個尋找的帳戶,就不必再檢查其他 29,999 個帳戶。就這麼簡單:呼叫 Exit For,迴圈就馬上結束 (我們 Scripting Guys 好像老是在圈圈 (狀況) 外,不過這又是另一回事了)。

如果想看看 Exit For 的效果,可以執行這段指令碼,它只是在螢幕上寫 1 到 1,000 的數字:

For i = 1 to 1000
    Wscript.Echo i
Next

現在再嘗試這段指令碼,當變數 i 等於 3 時,它會呼叫 Exit For 陳述式:

For i = 1 to 1000
    Wscript.Echo i
    If i = 3 Then
        Exit For
    End If
Next

看到哪裡不同了嗎?只要懂得撰寫這種程式碼,就再也不用擔心葛麗泰嘉寶的鬼魂了。

您真的沒有聽到怪聲嗎?好像是鐵鍊撞擊聲…

Exit For 對 For Each 或 For Next 迴圈都有效,但是萬一您要結束的是 Do 迴圈呢?沒問題:只要呼叫 Exit Do 即可。如果事要結束副程式呢?只要呼叫 Exit Sub 即可。如需結束函式,請呼叫 Exit Function。換句話說,您沒有理由再深陷永無止盡的迴圈中了;想離開的時候,只要使用 Exit (結束) 就好了。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首