這位 Scripting Guy 希望挑個簡單的問題來答覆,看起來這裡不用寫太多程式碼。咱們先把遠端電腦的名稱指派給一個叫做 strComputer 的變數:
strComputer = "atl-fs-01"
劇情從此急轉而下 (至少對這篇專欄來說很不尋常),還帶出一個有趣的問題:可以在本機電腦上執行同樣的指令碼嗎?當然可以,只要指派一個點 (.) 給 strComputer 變數即可:
strComputer = "."
附註:為何要添加這個點?很簡單,建構 WMI 路徑時,這個點可用來指出本機電腦,即便您不知道本機電腦的名稱也沒關係。 |
將電腦名稱指派給 strComputer 後,連線至 atl-fs-01 上的 WMI 服務,指令碼如下:
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_DataFile Where Name = 'C:\\Scripts\\Test.vbs'")
這裡擷取 atl-fs-01 上名稱等於 C:\Scripts\Test.vbs 的所有檔案 (WMI 裡的 Name 屬性相當於檔案路徑)。您的眼睛沒有花,路徑的確是 C:\\Scripts\\Test.vbs,絕不是服用止痛藥過多造成的副作用 (Scripting Guy 怎麼會需要止痛藥),而是 \ 在 WMI 本來就是保留字元。每次在查詢中使用 \,前面要再加上另一個 \ 作為「逸出」字元。看起來雖蠢,可是有其作用。
等等,我們說到哪了?(猛男,講到止痛藥啦!)對喔,剛才說過,查詢會傳回一組名為 C:\Scripts\Test.vbs 的檔案集合。為了判斷檔案是否存在,得察看集合的 Count,也就是集合中的項目數。假設 Count 等於 0,表示集合中空空如也,得知 atl-fs-01 上沒有任何叫做 C:\Scripts\test.vbs 的檔案,傳回檔案並不存在的訊息。如果 Count 不等於 0 (由於檔案路徑是獨一無二的,另一個唯一的可能是 Count 等於 1),即可傳回 atl-fs-01 上的確有檔案的訊息。
怎樣,很簡單吧!只需要使用這些程式碼就可辦到了:
strComputer = "atl-fs-01"
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService. _
ExecQuery("Select * From CIM_DataFile Where Name = 'C:\Scripts\Test.vbs'")
If colFiles.Count = 0 Then
Wscript.Echo "The file does not exist on the remote computer."
Else
Wscript.Echo "The file exists on the remote computer."
End If
答案就出現了。WMI 橫豎必須與遠端電腦連線,因此無論檔案是否在共用資料夾內,WMI 都會幫您搜出來。
問得好,假設您要尋找 Test.vbs 檔案,但不確定所在的資料夾,WMI 有沒有在資料夾未知的情況下找出檔案呢?當然沒問題。今天不會深入分析指令碼,但是無論檔案存放在哪個資料夾,指令碼都會搜尋 atl-fs-01 裡有沒有名為 Test.vbs 的檔案。
strComputer = "atl-fs-01"
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService. _
ExecQuery("Select * From CIM_DataFile Where FileName = 'Test' and Extension = 'vbs'")
If colFiles.Count = 0 Then
Wscript.Echo "The file does not exist on the remote computer."
Else
Wscript.Echo "The file exists on the remote computer."
End If
希望這有幫助,SP。當然我們很想留下來再多聊一點,但是晚餐時間已經到了,該回家囉。而且中午只能吃優酪乳,肚子好餓啊。幸好牙醫說晚餐可以吃,嗯,優酪乳。對了,還可以吃香蕉,嗯...不錯...
這樣好了,如果您真的想多聊聊這個指令碼,我們倒是不介意多待一下... |