Share via


嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何確定某檔案是否存在,如果存在,怎麼結束指令碼?


如何確定某檔案是否存在,如果存在,怎麼結束指令碼?

嗨,Scripting Guy!我要如何檢查看某檔案是否存在,如果存在,怎麼結束指令碼?

-- TO

TO,您好。檢查檔案的存在至少有兩種方法 (這是此處真正的關鍵,結束指令碼很簡單)。其中一種方法是使用 FileSystemObject,另外一種方法則是採用 WMI,我們今天兩種方法都會說明。為什麼?這樣一來,如果有人跑來求助的話,我們就可以說:「好呀,可是我們得完成這篇專欄,因為我們要解釋兩種指令碼,可能會花點時間。」

好啦,只有一部分是實話:實際上選擇其中一種方法來取代另一種方法是有理由的。一般人通常覺得 FileSystemObject 的指令碼寫起來比較簡單,唯一的問題是 FileSystemObject 主要是設計運作在本機電腦上。WMI 指令碼則傾向於比較複雜一點 (儘管如此,等下您會發現它們還是很簡單),不過 WMI 指令碼可以用在遠端電腦上,就跟用在本機電腦上一樣方便。這是什麼意思?也就是說,如果您是在本機電腦上工作 ,可能會想要使用 FileSystemObject。如果是在遠端電腦上工作,就必須使用 WMI。

根據 Scripting Guys 重要的傳統,讓我們先做簡單的。先來瞧一瞧 FileSystemObject 指令碼,它會檢查 C:\Scripts\Test.txt 檔案的存在。如果找到此檔案,即會結束指令碼,如果找不到此檔案,那麼指令碼會顯示一則相關訊息。

指令碼如下:

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 向我們解釋兩種方法來確定某檔案是否存在的那一天,你跑到哪去了?」在此之前,就挑您覺得最合理的指令碼使用囉。


如需詳細資訊

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

 

回到頁首 回到頁首