Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("C:\Scripts\Test.txt") Then
Wscript.Quit
Else
Wscript.Echo "The file does not exist."
End If
跟您說過這很簡單,我們開始會先建立 Scripting.FileSystemObject 的執行個體,接著呼叫 FileExists 方法,將正在討論的檔案的完整路徑傳遞給方法。若 FileExists 傳回 True,表示找不到該檔案,屆時會使用 Wscript.Quit 來結束指令碼。若找不到 FileExists,就會使用此行程式碼來回應我們無法找到該檔案:
Wscript.Echo "The file does not exist."
要做的大致上就這些,
順道一提,每次處理 FileSystemObject 的時候使用 FileExists 方法是個不錯的主意。FileSystemObject 功能強大,但也很敏感:只要一有不對勁,它就很容易出錯。最慘的是,即使使用 On Error Resume Next 也沒有用,如果 FileSystemObject 嘗試處理一個不存在的檔案或資料夾,那您的指令碼就很可能會失敗,即使使用 On Error Resume Next 也一樣。這個問題有解決的辦法嗎?只要在嘗試繫結檔案或資料夾之前,使用 FileExists (或是其同組方法,FolderExists) 就可以了。
好啦,今天就到此為止,喔,對了,我們說過要說明兩種指令碼,對吧?(我們腦袋在想什麼?)我們提過,您還可以使用 WMI 檢查檔案的存在。使用 WMI 的好處是相同的指令碼可以對遠端電腦,也可以對本機電腦執行,只要變更電腦的名稱就可以了。
下面是 WMI 指令碼,會檢查 C:\Scripts\Test.txt 的存在,如果找到該檔案,就會結束:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * From CIM_Datafile Where Name = 'C:\\Scripts\\Test.txt'")
If colFiles.Count > 0 Then
Wscript.Quit
Else
Wscript.Echo "The file does not exist."
End If
就像我們說過的,有點複雜又不會太複雜到不能處理。開始會先將變數 strComputer 的值設成一個點,在 WMI 完美的世界中,點是代表本機電腦。可是我們不是說過可以對遠端電腦使用相同的程式碼嗎?是呀,我們是這樣說過,那還不簡單:只要將 strComputer 的值設成遠端電腦的名稱就行了。例如,此行程式碼會使指令碼針對 atl-fs-01 電腦來執行:
strComputer = "atl-fs-01"
接下來會連接到 WMI 服務,然後使用 ExecQuery 方法來選取 CIM_Datafile 類別的所有執行個體,其中 Name 屬性等於 C:\\Scripts\\Test.txt。還有不要慌,您眼睛沒有花。在 WMI 中,\ 是保留字元,這表示查詢中只要出現 \,該字元就必須要「逸出」,單純只是意味著會在 \ 前面加上第二個 \。因此像是 C:\Scripts\Test.txt 的檔案路徑,就會被寫成 C:\\Scripts\\Test.txt。嘿,有效最重要,對吧?
附註:附帶一提,情況有可能更糟,要是我們有個像 \\atl-fs-01\public\scripts 的路徑,那會被寫成:\\\\atl-fs-01\\public\\scripts,使每個 \ 都加倍。 |
我們的查詢傳回一個集合,其中包含在電腦上稱為 C:\Scripts\Test.txt 的所有檔案 (不用說,不一定會有這類的檔案)。為了確定是否有找到該檔案,我們會檢查傳回集合的 Count 屬性。如果 Count 大於 0,就表示找到了該檔案,接著會呼叫 Wscript.Quit,然後結束指令碼。如果 Count 小於 0,表示找不到此類檔案,而會回應一則相關訊息。
就這樣,您有不只一種,而是兩種方法來確定某檔案是否存在,如果存在的話,結束指令碼。好耶,有天肯定會有人說:「Scripting Guys 向我們解釋兩種方法來確定某檔案是否存在的那一天,你跑到哪去了?」在此之前,就挑您覺得最合理的指令碼使用囉。 |