◎VBS腳本運行庫手冊之四 ——管理文件

Managing Files

管理文件系統的最終任務還是歸結爲管理單獨的文件。作爲一個系統管理員,你的工作是跟蹤存儲在計算機上的文件。例如,你需要知道正確的診斷工具是否被複制到了 server 上,你需要知道特定的文件(比如遊戲文件或者音樂文件)是否被複制到了文件服務器上了,儘管你用了組策略去阻止他們將文件拷貝到文件的server。你需要知道是否有的文件放在計算機上已經有幾個月沒有去訪問了,而這些功能通過類似知道磁盤的剩餘空間這樣的操作是無法知道的。此外爲了跟蹤這些文件,你也需要動態的管理他們:需要複製,需要移動,需要重新命名,需要刪除。FSO 提供了一些方法來幫助你完成這些管理任務。

Binding to a File 

FSO 給你提供了一些方法,比如 CopyFile,DeleteFile

允許你的腳本不用綁定一個特定的文件就可以對文件實例進行操作。而其它的任務,就需要文件對象。比如,爲了獲得一些屬性,你的腳本首先就需要綁定到一個文件,然後再獲得文件的屬性。GetFile方法允許你綁定到一個獨立的文件。爲了做到這點,你先創建一個 FSO 實例,然後創建一個文件對象。當你用 GetFile 方法的時候,你必須:1、確定文件的路徑:這個路徑可以是一個本地路徑,也可以是一個 UNC 路徑(例如://accounting/receivables/scriptlog.txt)在路徑當中你不能用通配符也不能有多個文件。用 GetFile 方法你在同一個時刻只能綁定一個單獨的文件。2、當綁定的對象分配給一個變量的時候就要用到 Set 這個關鍵詞。 

例如,下面腳本綁定到了文件:C:/FSO/Scriptlog.txt

1 Set objFSO = CreateObject("Scripting.FileSystemObject")

2   objFSO.GetFile("C:/FSO/ScriptLog.txt")

一般來講,你最好用絕對路徑來作 GetFile 的參數。這樣確保腳本總是可以在文件中運行。但是,用相對路徑也是可以的。例如,如下的腳本代碼會綁定到

Scriptlog.txt 會成功,因爲腳本和這個文件在同一個文件夾裏面: 

objFSO.GetFile("ScriptLog.txt")

同樣,下面的代碼實例如果這個腳本和這個文件在同一個文件夾也會綁定到 Scriptlog.txt

objFSO.GetFile("./ScriptLog.txt")

注意:FSO 不會用路徑環境信息去搜索文件。例如,你可以在命令行中敲如 calc.exe 來打開計算機,而無論你當前的目錄是在哪裏,因爲操作系統默認的情況下去搜索所有的文件的。但是用這個GetFile方法的時候,它不是這樣的工作的。

如下腳本除非是在文件夾C:/Windows/System32 的文件夾下,否則都不會運行成功的。 

objFSO.GetFile("calc.exe")

有時知道文件是否存在是十分重要的,這個可以作爲軟件清單的一部分。例如你或許希望檢查所有的郵件服務器來看特定的腳本是否存在。用腳本來實現系統管理任務來說,知道腳本存在與否很重要的。比如你或許希望當你複製、移動、刪除或者操作不存在的文件的時候,腳本報錯。爲了避免出現錯誤,你可以用 FileExists方法來檢查文件是否存在。FileExists 方法要求一個單獨的參數:文件的路徑,然後返回一個特定的 Boolean 值:如果文件存在,返回的是 True,如果文件不存在,返回的是 False

如下面腳本用 FileExists 方法來檢查文件 C:/FSO/Scriptlog.txt 是否存在,如果存在,用 GetFile 方法來綁定到這個文件,如果不存在,腳本回顯一個 messagefile does not exist

1     Set objFSO = CreateObject("Scripting.FileSystemObject")

2     If objFSO.FileExists("C:/FSO/ScriptLog.txt") Then

3     Set objFile = objFSO.GetFile("C:/FSO/ScriptLog.txt")

4     Else 

5     Wscript.Echo "File does not exist.?

6     End If 

你不能用通配符來檢查文件夾中特定類型的文件是否存在,你也不能用通配符拉來檢查文件夾中所有的文件。如下面腳本,無論在文件夾

C:/FSO/下存在多少文件,都不會報錯出來,而是總是返回一個 False. 

WScript.Echo objFSO.FileExists("C:/FSO/*.*")

如果你希望遵循一些條件原則檢查一些文件而不是基於路徑,你有下面兩個選擇:

1、用 GetFolder

對象來綁定一個文件夾,然後返回文件的屬性,這樣重複操作直到篩選出你感興趣的。例如,你可以列舉出所有的文件和文件的擴展名,然後跟蹤看有多少個後綴名    

.doc 的文件。

2、用 WMI,它允許你創建更多的目標查詢。比如選出所有後綴名爲.doc 的文件。你可以用計數的辦法來返回你要的特定的條目。如果數值是 0,那麼,最少有一個是.doc 的文件。

 Deleting a File 

FSO 來創建腳本刪除文件讓你可以自動執行類似與磁盤清理之類的操作。例如,你可以用腳本定期查詢和刪除所有的臨時文件。你也可以依照一些規則來刪除文件,比如刪除六個月都沒有被訪問的文件,或者特定的後綴名的文件,比如(.bmp 或者.mp3)你可以首先創建 FSO 對象實例,然後調用 DeleteFile 方法來刪除文件,輸入文件路徑作爲參數。  

如下面腳本刪除了文件 C:/FSO/Scriptlog.txt

1     Set objFSO = CreateObject("Scripting.FileSystemObject")

2   objFSO.DeleteFile("C:/FSO/ScriptLog.txt")

默認的情況下,DeleteFile 方法不會刪除只讀文件。事實上,當你嘗試刪除一個只讀文件時,腳本會報錯出來。爲了避免這樣的錯誤出現,如想刪除只讀文件的話,需添加強制參數,當強制參數設成 True

的時候,那麼 DeleteFile 可以刪除任何文件。如下面這行代碼可以刪除文件 Scriptlog.txt,即使它只是一個只讀文件。

1 objFSO.DeleteFile("C:/FSO/ScriptLog.txt", True)

2 Deleting a Set of Files

有時候你希望刪除特定的、單獨的文件。更有可能的是你可能想用腳本來刪除一系列的文件。如在週末你或許想刪除一些存盤了的日誌文件或所有的臨時文件。你可以通過通配符來刪除一個文件夾之內的一些文件。但是你不能用 DeleteFile 方法來直接刪除多個文件夾內部的文件。你可以通過用篩選每個數據夾的辦法來逐個刪除每個文件夾內部的文件。如果你想刪除多個文件夾內部的特定類型的文件(比如刪除計算機上全部的.TMP 文件)你應該用 WMI 而不是用 FSO。爲了刪除一系列文件,調用 DeleteFile 方法,根據文件的名字或者後綴名添加通配符來提供文件夾的路徑。例如,下面的代碼用來刪除文件夾 C:/FSO 文件夾下的所有後綴名爲.doc 的文件。

objFSO.DeleteFile("C:/FSO/*.doc")

下面的這行代碼用來刪除所有文件名帶有 log 的文件:

objFSO.DeleteFile("C:/FSO/*log.* ")

正如前面提到的那樣,DeleteFile 方法不刪除標記爲只讀的文件。如果你的腳本嘗試去刪除一個只讀的文檔,腳本會報錯,雖然你用了 On Error Resume Next 語句。例如你想刪除 1000 txt 文件,並且只有一個文件標記爲只讀了。當腳本嘗試去刪除這個文件的時候,會產生一個腳本運行的錯誤,這個 DeleteFile 方法中止。腳本不去嘗試去刪除其它的文件,雖然其它的文件不是隻讀的。因爲這個原因,你可以用可選擇的:強制參數,將它的值設置成 True。當這個參數設置成 True 的時候,DeleteFile 方法可以刪除只讀文件。當這個參數被設置成 False 的時候,就不能刪除只讀文件。

下面腳本用來刪除文件夾 C:/FSO 下的所有文件,爲了確保刪除包括只讀文件在內的文件,強制參數被設置成 True。並且使用了這個 DeleteReadOnly 常量。

1   Const DeleteReadOnly = True

2   Set objFSO = CreateObject("Scripting.FileSystemObject")

3   objFSO.DeleteFile("C:/FSO/*.txt"), DeleteReadOnly

果你想刪除所有不是隻讀的文件怎麼辦呢?在這種情況下,你可以返回一個集合,用文件屬性來獲得文件屬性,是否爲只讀,如果是就不刪除,否則就刪除。

 

Copying a File 

拷貝文件,無論是從計算機上的一個文件夾到另外一個文件夾還是從一個計算機到另外一個計算機,都是一個非常常見的管理任務。如你希望拷貝一個監視的腳本到你所有的服務器上面來取代過去的 DLL 文件。CopyFile方法提供了這種任務管理的辦法。CopyFile 方法需要兩個必備參數和一個可選的參數:

1Source 要拷貝的文件的源文件的路徑。

2Destination 目標文件夾的路徑。爲了確保在目標文件夾也是同樣的名字,將一個脫尾符放在文件夾的結束之前( / )

  objFSO.CopyFile "C:/FSO/ScriptLog.txt" , "D:/Archive/"

  如果你想重新命名該文件,你可以將全路徑寫成如下的格式:

  objFSO.CopyFile "C:/FSO/ScriptLog.txt" , "D:/Archive/NewFileName.txt"   如果目標文件夾不存在,則會自動創建。

3Overwrite可選。默認情況下,CopyFile

方法不能複製到目標文件夾存在的同名文件。這導致錯誤。比如你要更高的版本覆蓋存在的文件,那麼將這個參數設置成 True。下面腳本拷貝文件 C:/FSO/Scriptlog.txt 到文件夾 D:/Archive

   The original file, C:/FSO/ScriptLog.txt.

   The copied file, D:/Archive/ScriptLog.txt.

爲了保證拷貝的正常進行,即使存在 D:/Archive/Scriptlog.txt,腳本將可選參數 Overwrite設置成 True(用常量 OverWriteExisting

1 Const OverwriteExisting = True

2 Set objFSO = CreateObject("Scripting.FileSystemObject")

3 objFSO.CopyFile "C:/FSO/ScriptLog.txt" , "D:/Archive/", overwriteExisting 

 

當你確定一個目標文件夾的時候,脫尾的反斜線是十分必要的。(例如D:/Archive/)如果你的反斜線在,那麼文件會被拷貝到 Archive

文件夾,如果反斜線不在的話,腳本的 CopyFile嘗試去建立一個叫做 D:/Achive 的文件夾。如果這個文件夾存在,那麼會產生一個”Permission denied Error”的錯誤出來,拷貝的進程會失敗的。這個對於只讀文件來說也是錯誤的,雖然你可能將強制參數設置成

True。如果沒有反斜線,你必須先將原來的文件刪除,然後再調用CopyFile 方法來實現。

Copying a Set of Files

通配符提供了一種拷貝整個文件夾中所有的文件的方法。你可以用腳本複製一些具有共同參數的文件。例如下列腳本拷貝在 C:/FSO 中所有的 txt 文件到 D:/Archive.

1 Const OverwriteExisting = True

2 Set objFSO = CreateObject("Scripting.FileSystemObject")

3 objFSO.CopyFile "C:/FSO/*.txt" , "D:/Archive/" , OverwriteExisting

CopyFile 的方法中添加通配符來拷貝文件的時候,只是拷貝當前文件夾的文件。而用CopyFolder

的方法,正好相反,它也拷貝子文件夾的信息和文件。如下的腳本代碼語句拷貝文件夾 C:/FSO 中所有的文件,而不拷貝子文件夾的信息。

objFSO.CopyFile "C:/FSO/*.*" , "D:/Archive/"

Moving a File 

如你的磁盤空間很低了,你或許希望將文件移動到一個新的位置;如果你的計算機換了規則,你或許希望移動特定的診斷工具取代原來的。在其它的一些情況下,你或許不希望存在這個文件的副本,而是將它移動到一個新的位置。MoveFile

方法讓你將文件從一個地方移動到另外一個地方。MoveFile 方法和 CopyFile 的方法類似,你需要創建一個 FSO 對象,然後調用 MoveFile

的方法,需要兩個參數:

1、需要移動文件的完整路徑

2、需要移動到的目標文件夾的路徑,包括脫尾符(反斜線)

下例中腳本將 C:/FSO/Scriptlog.log 移動到 D 盤的 Archive 文件夾 

1     Set objFSO = CreateObject("Scripting.FileSystemObject")

2     objFSO.MoveFile "C:/FSO/ScriptLog.log" , "D:/Archive/"

Moving a Set of Files

你也可以用通配符來用一個操作移動多個文件。如爲移動所有在文件夾 FSO 中以 data開頭的文件,你可以用以下的參數: C:/FSO/Data*.*

通配符可以用來移動特定的文件。因爲文件的類型一般是用後綴名來標識的。如下例中腳本移動所有的日誌文件到 D:/Archive

1 Set objFSO = CreateObject("Scripting.FileSystemObject")

2   objFSO.MoveFile "C:/FSO/*.log" , "D:/Archive/"

Renaming a File 

FSO 並沒有提供一種直接的方法來重新命名一個文件。但是和 MoveFolder 的方法可以重新命名文件夾一樣,你也可以用 MoveFile

的方法來重新命名文件。爲了重新命名一個文件,你可以用 MoveFile 的方法,但是目標文件夾應爲當前的文件夾。

如在下例腳本中,將Scriptlog.txt 重新命名爲 Backuplog.txt。而在技術上是腳本實際上將 C:/FSO/Scriptlog.txt 移動到一個新的路徑 C:/FSO/Backuplog.txt,結果是將文件重新命名了。

1 Set objFSO = CreateObject("Scripting.FileSystemObject")

2     objFSO.MoveFile "C:/FSO/ScriptLog.txt" , "C:/FSO/BackupLog.txt" 

 

 

文件有些屬性對於文件的管理來說十分重要,如屬性 DateLastAccssed 告訴你最後打開這個文件的日期。屬性Size告訴你文件有多少個 bytes,系統管理員可以通過 windows 資源管理器或者命令行工具去訪問文件的屬性。雖然這些工具可以返回計算機上文件的信息,但是他們不是被設計成用來保存和操作文件屬性的。此外,這些工具大多功能有限,不能使系統管理員很好的通過屬性來週期性的清理磁盤或者尋找出滿足特定屬性的文件集合。

幸運的是,你可以通過 FSO 來獲得計算機上任何文件的詳細信息。和其它的工具相比,FSO可以讓你查詢一個文件或者一組文件的信息。

 

Attributes            文件的位圖屬性。

DateCreated          文件的創建日期。

DateLastAccessed           數據的最後訪問日期。

DateLastModified       數據的最後更改日期。

Drive                 磁盤驅動器和託尾符(例如:C:)代表文件存在的磁盤上。

Name                     文件的名字,不包含文件的路徑

ParentFolder           父文件夾的名字。例如,C:/Windows/System32/Scrrun.dll

的父文件夾名字是 Windows

Path                文件的路徑,比如 C:/Windows/System32/Scrrun.dll

ShortName             MS-DOS類型的文件名,符合8.3 命名規則的。

ShortPath            MS-DOS-style 文件名字。符合 8.3 命名規則的。

Size                    文件的大小,單位是 bytes

Type                    文件類型,是在註冊表區中對於此文件類型的字符串描述。

爲了訪問這些屬性,你必須:

1. 創建一個 FSO 對象實例。

2. GetFile 方法創建一個對象的 reference。腳本必須給 GetFile 提供文件的路徑參數。

3. Echo(或者其它的處理辦法)來表達出文件的屬性。

如下面的腳本用 GetFile 的方法來綁定到文件 C:/Windows/System32/Scrrun.dll 然後返回一些它的屬性:

1 Set objFSO = CreateObject("Scripting.FileSystemObject")

2     Set objFile = objFSO.GetFile("c:/windows/system32/scrrun.dll")

3     Wscript.Echo "Date created: " & objFile.DateCreated

4     Wscript.Echo "Date last accessed: " & objFile.DateLastAccessed

5     Wscript.Echo "Date last modified: " & objFile.DateLastModified

6     Wscript.Echo "Drive: " & objFile.Drive

7     Wscript.Echo "Name: " & objFile.Name

8     Wscript.Echo "Parent folder: " & objFile.ParentFolder

9     Wscript.Echo "Path: " & objFile.Path

10 Wscript.Echo "Short name: " & objFile.ShortName

11 Wscript.Echo "Short path: " & objFile.ShortPath

12 Wscript.Echo "Size: " & objFile.Size

13 Wscript.Echo "Type: " & objFile.Type

和文件夾一樣,文件有些屬性可以通過 FSO 返回和配置,有些屬性比如位圖屬性就不能通過 FSO 來獲得的。

Normal 0           沒有這樣的屬性設置爲 True。??

Read-only  1       文件爲只讀。

Hidden      2       文件在 Windows 瀏覽器中是隱藏的。

System      4       文件是操作系統必須的。

Archive       32      存盤,文件標記爲需要備份的。

Alias         64      此文件是其它文件的快捷方式

Compressed  2048    此文件是壓縮的。

想獲得文件的這些屬性,用GetFile 方法來綁定一個文件,在你創建完了這個文件對象的reference

之後,你可以用邏輯與操作來決定這些屬性。如果沒有任何屬性被設置了,那麼這個值就是 0。如下面腳本綁定了文件 C:/FSO/Scriptlog.txt

然後檢查每個屬性並用FSO 返回屬性的值。

1   Set objFSO = CreateObject("Scripting.FileSystemObject")

2   Set objFile = objFSO.GetFile("C:/FSO/ScriptLog.txt")

3   If objFile.Attributes AND 0 Then

4   Wscript.Echo "No attributes set."

5   End If

6   If objFile.Attributes AND 1 Then

7   Wscript.Echo "Read-only."

8   End If

9   If objFile.Attributes AND 2 Then

10  Wscript.Echo "Hidden file."

11  End If

12  If objFile.Attributes AND 4 Then

13  Wscript.Echo "System file."

14  End If

15  If objFile.Attributes AND 32 Then

16  Wscript.Echo "Archive bit set."

17  End If

18  If objFile.Attributes AND 64 Then

19  Wscript.Echo "Link or shortcut."

20  End If

21  If objFile.Attributes AND 2048 Then

22  Wscript.Echo "Compressed file."

23  End If

Configuring File Attributes

除了列舉文件的屬性之外,FSO 提供了配置如下屬性的一些辦法:

1ReadOnly 2Hidden 3System 4Archive

爲了配置文件的這些屬性,腳本可以用如下的進程:

1. GetFile 的方法綁定一個文件。

2. 檢查你要更改的文件的屬性。如你想將一個文件設置成只讀的那麼就檢查它是否是已經是已讀了。

3. 如果不是隻讀的,那麼用邏輯 XOR 操作來觸發這個開關。這樣可以使文件變成只讀的。但    是如果文件已經是隻讀的,那麼不要用邏輯 XOR

操作,如果你用了,那麼這個屬性就被移掉了。

下面腳本用 AND 操作來檢查只讀開關是否已經打開,從而確定文件C:/FSO/TestScript.vbs是否爲只讀。如果爲只讀,腳本用 XOR

操作來將其改成非只讀的。

1 Set objFSO = CreateObject("Scripting.FileSystemObject")

2   Set objFile = objFSO.GetFile("C:/FSO/TestScript.vbs")

3   If objFile.Attributes AND 1 Then

4     objFile.Attributes = objFile.Attributes XOR 1

5   End If

你也用如下的語句來同時去更改系統、存盤、隱藏等屬性

objFile.Attributes = objFile.Attributes AND 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章