嗨,Scripting Guy!

嗨,Scripting Guy!

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

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何不管字母大小寫來比較兩個字串值?


如何不管字母大小寫來比較兩個字串值?

嗨,Scripting Guy!我有個指令碼,可以比較兩個電子郵件地址看它們是不是一樣的。有時候電子郵件地址是一樣的,但大小寫不一樣:例如,其中一個地址可能是 example@abc.com,另一個可能是 example@ABC.com。而我的指令碼卻總是指出這是「不同」的電子郵件地址,我該怎麼解決這個問題?

-- PS

PS,您好。要是大家都知道 Scripting Guys 真正的底細,就永遠不會信任我們來解答這類的指令碼問題。舉個例子,像在一個星期前左右,有個 Scripting Guys 正籌畫全家出遊渡假。當在預約的時候,他必須向票務人員拼出他妹妹的夫姓,他說:「K,就是...」,然後腦子進了死胡同。這個 Scripting Guy 過了大半輩子,竟然想不出一個以字母 K 開頭的字。

不過這跟您的問題有什麼關係?沒啥關聯,只是覺得這是件趣事。

好吧,那麼您的問題要怎麼解決呢?您大概知道,我們常說在寫指令碼的時候不要擔心大小寫。我們告訴大家說:「主要是因為 VBScript 並不區分大小寫,ABC 跟 abc 沒兩樣。」

我們的答辯是,這一般在關鍵字、函式、陳述式和其他組成 VBScript 的好東西都沒錯。像是這一行指令碼 (看起來可能很怪),輕輕鬆鬆就可以顯示一個訊息方塊:

mSGboX "This is a message box."

不過,光因為您可以隨意鍵入 Msgbox,並不代表 VBScript 所執行的程序和測試也都不分大小寫。比方說,您可試試執行這個指令碼,它會比較 example@abc.com 和 example@ABC.com:

str1 = "example@abc.com"
str2 = "example@ABC.com"
If str1 = str2 Then
    Wscript.Echo "The strings are equal."
Else
    Wscript.Echo "The strings are not equal."
End If

執行指令碼後,會得到這則訊息:

The strings are not equal.

怎麼會這樣?是這樣的,在預設情況下,當 VBScript 以較字串值的時候,它比較的是字串當中每個字元的 ASCII 值。在 ASCII 完美的世界中,大寫 A 和小寫 a 有著不同的值 (分別是 65 和 97)。因為 ACSII 值不同,所以 VBScript 堅持這兩個字串是不同的。

那麼我們要怎麼解決這個問題呢?我們會向您說明兩個不同的解決辦法。

對於初學者,可以使用 VBScript 函式 StrComp (代表 String Comparison),這有助於確保指令碼進行的是文字比較,而非二進位比較 (二進位比較會將 A 和 a 視為不同的字元,而文字比較則不會)。例如:

str1 = "example@abc.com"
str2 = "example@ABC.com"
intCompare = StrComp(str1, str2, vbTextCompare)
If intCompare = 0 Then
    Wscript.Echo "The strings are equal."
Else
    Wscript.Echo "The strings are not equal."
End If

在這個指令碼中,我們指定兩個字串值 (str1 和 str2),接著呼叫 StrComp 函式。StrComp 會取得三個參數:兩個比較的字串,以及 VBScript 常數 vbTextCompare。字串比較的結果接著會存放到變數中,我們將之命名為 intCompare。若 intCompare 等於 0,表示兩個字串相等,若 intCompare 不等於 0,就表示兩個字串不同。

不妨試試,看會有什麼結果。應該會得到這則訊息:

The strings are equal.

呼!好多了。

這裡有另一種方法可確保比較字串時,不需要擔心字母大小。在這個指令碼中,我們使用 UCase 函式將兩個字串中的所有字母轉換成大小 (換句話說,兩個字串都會被轉換成 EXAMPLE@ABC.COM)。因為不用擔心小寫字母,所以這個指令碼會回報兩個字串是一樣的:

str1 = UCase("example@abc.com")
str2 = UCase("example@ABC.com")
If str1 = str2 Then
    Wscript.Echo "The strings are equal."
Else
    Wscript.Echo "The strings are not equal."
End If

記住,您只應該在大小寫不重要的時候採用其中一種方法。如果攸關大小寫 (也就是說,如果 example@ABC.com 不應該與 example@abc.com 視為相同的話),那麼就使用正規的同等測試:

str1 = "example@abc.com"
str2 = "example@ABC.com"
If str1 = str2 Then
    Wscript.Echo "The strings are equal."
Else
    Wscript.Echo "The strings are not equal."
End If

如果您還在好奇的話,我們的 Scripting Guy 最後還是想出了以字母 K 開頭的「Kansas」一字。謝天謝地!


如需詳細資訊

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

 

回到頁首 回到頁首