Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何判斷遠端電腦上使是有某個檔案,即使檔案不在共用資料夾內?


如何判斷遠端電腦上是否有某個檔案?

嗨,Scripting Guy!如何判斷遠端電腦上是否有某個檔案,即使檔案不在共用資料夾內?

-- SP

SP,您好。負責寫這篇專欄的 Scripting Guy 今天早上才動了一個小型的牙齦手術。(大概只有他的牙醫覺得這是小手術,Scripting Guy 可是嚇得手腳酸軟,覺得這是個小手術啊。) 最後英雄還是回來上班了,我看他不是耍帥就是發顛。(編按:答案你我心知肚明。)不管如何,雖然牙齦早就不腫也不痛了 (反正他中午止能吃優酪乳),他還是很希望替今天的專欄挑個簡單點的問題來答覆,這是醫生交代的。

確切的說,醫生囑咐他吃 Vicodin 和消炎陣痛藥,病人要休息咩。

您的問題是希望檢查遠端電腦上是否有某個檔案,而檔案可能不是存放在共用資料夾內。這樣有問題嗎?如果您使用 FileSystemObject,就可能有問題。但如果使用 WMI,那就好辦了:WMI 可以從普通舊資料夾找出檔案,就像找出共用資料夾裡的檔案一樣輕鬆。想要檢查遠端電腦上是否有某個檔案嗎?就跟拔牙一樣簡單!

可以這麼說。

打個比方,這個指令碼可用來檢查遠端電腦 atl-fs-01 上有沒有這個檔案 C:\Scripts\Test.vbs。

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

TechNet Script Center

這位 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

附註:如需使用指令碼管理檔案和資料夾的其他資訊,包括 FileNameExtension 等屬性的說明,請參閱《Microsoft Windows 2000 Scripting Guide》(英文)。


希望這有幫助,SP。當然我們很想留下來再多聊一點,但是晚餐時間已經到了,該回家囉。而且中午只能吃優酪乳,肚子好餓啊。幸好牙醫說晚餐可以吃,嗯,優酪乳。對了,還可以吃香蕉,嗯...不錯...

這樣好了,如果您真的想多聊聊這個指令碼,我們倒是不介意多待一下...


如需詳細資訊

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

 

回到頁首 回到頁首