strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery _
("Select * from Win32_Service where Name Like '%ADAM_%'")
If colServices.Count = 0 Then
Wscript.Echo "ADAM is not installed."
Else
For Each objService in colServices
Wscript.Echo objService.Name & " -- " & objService.State
Next
End If
這個指令碼看準了 ADAM 以服務型態執行的這個特性:如果指令碼找到 ADAM 服務的執行個體,就表示 ADAM 已經安裝了。但是這裡的確有個麻煩的地方,ADAM 的每一個執行個體是以不同的名稱分開執行的服務。所幸有個簡單的方法可以判斷是否已經安裝了任何 ADAM 的執行個體。而那正是我們下面要討論的重點:
指令碼會先接著連接到本機電腦上的 WMI 服務,當然您也可以修改指令碼使它連接到遠端電腦,只要對 strComputer 變數指定遠端電腦的名稱即可。接著要處理這行程式碼:
Set colServices = objWMIService.ExecQuery _
("Select * from Win32_Service where Name Like '%ADAM_%'")
這一行指令碼的意思是使用 Like 運算子,把所有包含 ADAM_ 字元的服務傳回。WMI 的 LIKE 運算子搭配兩個百分比符號表示「任何東西」,這個查詢白話點說,就是「把 Name 屬性裡所有包含 ADAM_ 字元的服務都逮過來,我不管 ADAM_ 前面或後面接的是什麼東西,只要 Name 隨便哪裡有 ADAM_ 字串就得了。」
這麼做有什麼原因嗎?方才說過,ADAM 的每一個值行個體是以個別服務的型態來執行,但是每一個服務名稱一定會以 ADAM_ 字元開頭。舉個例子,如果 ADAM 有一個叫做 Fabrikam 的執行個體,服務名稱就等於 ADAM_Fabrikam。ADAM 的執行個體如果叫做 Contoso,服務名稱就是 ADAM_Contoso。所以我們才這樣設計查詢,以便能夠像上面兩個例子一樣,傳回 Name 中包含 ADAM_ 字元的服務。
附註:這時候您可能會這麼想:「等等,Scripting Guy,LIKE 運算子不是只有在 Windows XP 和 Windows Server 2003 才支援嗎?萬一我在 Windows 2000 上執行 ADAM 怎麼辦?」沒錯,LIKE 運算子只有在 Windows XP 和 Windows Server 2003 才支援,但這不是問題。因為根本就不能在 Windows 2000 上面執行 ADAM,更不用擔心是不是安裝了。所以就假設必須在 Windows XP 或 Windows Server 2003 電腦上執行這個指令碼。如果您要使用 ADAM,應該不難找到這些電腦。 |
擷取到服務集合後,接著是 Then Else 區塊:
If colServices.Count = 0 Then
Wscript.Echo "ADAM is not installed."
Else
For Each objService in colServices
Wscript.Echo objService.Name & " -- " & objService.State
Next
End If
這裡的動作是檢查傳回集合的 Count 屬性是否等於 0,用來判斷及合理有多少項目。假使 Count 等於 0,表示集合裡有 no 個項目。換句話說,電腦上並沒有安裝 ADAM 的執行個體,因為因應的訊息已經明白指出。
如果 Count 大於 0,就表示至少找到一個 ADAM 的執行個體。我們已經準備了一個簡單的 For Each 迴圈,逐一處理所有的 ADAM 執行個體,並針對每一項傳回 Name 和 State 的執行個體 (執行中、已停止、暫停等)。
這樣就行了,只要執行這個指令碼,然後... 啊?還懷疑嗎?我知道了,要信任,也要查證!這我們懂,但這是兩回事,不妨試試,看會有什麼結果。 |