嗨,Scripting Guy!

Hey,Scripting Guy!

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

今天的問題:我要如何辨別數值是否存在於登錄中?


我要如何辨別數值是否存在於登錄中?

嗨,Scripting Guy!我要如何辨別數值是否存在於遠端電腦的登錄中?

-- AL

AL,您好。該是開誠佈公的時刻:儘管我們自稱為 The Scripting Guy,但從未宣稱過我們對指令碼無所不知。這個問題就是很好的例證。第一次讀到這個問題時,我們想:「好吧,在 WMI 應該會有類似 If Exists 的方法能夠辦到這點。」試想在發現沒有類似方法時,我們有多麼驚訝。事實上,我們找不到「任何」方法可以查看某個登錄值是否存在。我們甚至 – 唉!–回去閱讀說明文件,懷疑自己是否遺漏了一些內容。可是沒有這麼好運。

在無法找到 If Exists 方法之後,我們想:「好吧,我們可以嘗試讀取數值。嘗試讀取不存在的值一定會觸發錯誤。然後我們可以對錯誤設陷,並判斷該值是否存在。」

結果證明,如果使用 WSH 的 RegRead 方法讀取不存在的值,就會觸發錯誤。不過 RegRead 方法只能在本機電腦使用。您不能用這種方法讀取遠端電腦上的登錄。您必須使用 WMI 才能做到這點。於是又有問題:如果您使用 WMI 嘗試並讀取不存在的值,就不會產生任何錯誤。WMI 將會繼續作用,就像沒有任何錯誤一樣。真是瘋狂。

不過接著我們注意到一件事。在使用 WMI 從登錄讀取時,其值會以「輸出參數」的形式傳回。在檢查該輸出參數的實際值時,我們發現只要您嘗試讀取不存在的值,就會取回 Null 值。這就表示我們只需要檢查 Null 值,就能知道登錄值是否存在。

您都看懂了嗎?以下這段範例指令碼會查看登錄值 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Test 的值:

Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & _ 
    strComputer & "\root\default:StdRegProv")
 
strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
strValueName = "Test Value"
objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue
If IsNull(strValue) Then
    Wscript.Echo "The registry key does not exist."
Else
    Wscript.Echo "The registry key exists."
End If

如您所見,我們一開始將常數 HKEY_LOCAL_MACHINE 設定為&H80000002。我們將用此值連結到登錄的 HKEY_LOCAL_MACHINE 部分。然後我們連結到 WMI 服務,以及 StdRegProv 類別 (如您所見,此類別位於 root\default 名稱空間中)。

在將登錄路徑和登錄值存放在一對變數中以後,我們呼叫 GetStringValue 方法。請注意此方法的 4 個參數:常數 HKEY_LOCAL_MACHINE、變數 strPath (代表登錄路徑)、變數 strValueName (代表我們嘗試讀取的登錄值),以及 strValue。strValue 則是輸出參數:登錄中所記錄的實際字串值,將會在儲存在 strValue 中並傳回給我們。

以下是辨別登錄值是否存在的方法:如果 strValue 為 Null,就表示無法找到該值。我們嘗試過許多登錄值,似乎每次都能獲得正確結果。這種方法對 REG_DWORD 值也同樣有效。不過,您當然需要使用 GetDWORDValue 方法來讀取這類的數值 (如需關於如何使用 WMI 處理登錄的詳細資訊,請參閱《Microsoft Windows 2000 指令碼指南》中的登錄章節 (英文))。

好的,我們明白您的想法:您在想:「很好。不過如果我建立一個登錄值,然後在其中留下空白的話會怎樣呢?即使登錄值確實存在,輸出參數不是一樣會傳回為 Null?」信不信由您,不過情況並非如此。空白的登錄值會傳回為 "empty",也就是說,其值等於空白的字串 ("")。雖然我們瞭解這點可能令人困惑,不過在此情況的「什麼都沒有」(一個空白字串) 並不等於另一種「什麼都沒有」(Null 值)。空白表示登錄值存在,不過是空白的;Null 則表示登錄值並不存在。

如同以上提到的,我們使用隨機多種的登錄值嘗試過,看來每次都能獲得正確的結果。如果您碰到結果「不」正確的情況,請務必通知我們。


如需詳細資訊

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

 

回到頁首 回到頁首