文件系統管理是系統管理的一個關鍵性任務。WSH 和 VB 腳本在這個領域都沒有提供相關的功能。幸運的是,你可以通過 script runtime
庫來管理這些關鍵的系統組件,比如磁盤,文件夾和文件。這兩種主要的腳本語言,VB 腳本語言和 JS 腳本語言起初的時候都是設計給客戶端來編寫 IE 的。正是因爲如此,這兩個腳本語言都有一些侷限性。例如VB 腳本和JS 腳本內部都沒有提供訪問文件管理的一些任務,比如:複製、移動、刪除文件等。這樣做的目的是爲了保護消費者。大多數的的網站不可能讓用戶通過網頁去刪除它們硬盤上的東西。儘管如此,腳本已經從類似的HTML 的按鈕之類的開始迅速的發展了。隨着 ASP 的到來,瀏覽器的編寫者要求在 server 上管理文件。而隨着 WSH 的到來,系統管理員要求有在 web 瀏覽器外來管理文件了。
爲了滿足這個要求,微軟發佈的了 Script Runtime Library。它是一個單獨的 DLL 文件,scrrun.dll 文件,用來給腳本的編寫者們提供一些文件管理的能力,包括以下內容:
1、獲取文件系統的信息,包括獲得磁盤、文件和文件夾上的信息。
2、複製,移動和刪除文件及文件夾
3、創建和讀寫文本文件。
除了這些功能之外,Script Runtime Library 提供了創建字典的能力。也可以用來對腳本進行編譯,使腳本成爲加密的。
Note:
這章只是討論 FileSystemObject 和 Dictionary 的部分,對於 Encode 部分不作討論,Script Runtime Library
也是 windows 2000 的一部分,它在你安裝或者升級微軟的應用程序的時候也隨着升級和安裝了:這些應用程序有以下幾個:
1、WSH 2、VB 腳本 3、IE 瀏覽器 4、Microsoft Office 5、FileSystemObject
正如它的名字一樣,FSO 設計用來幫助你管理文件系統,FSO
允許你獲取重要的文件組件信息,包括硬盤、文件夾、文件;也提供一般的系統管理的任務,比如複製、刪除、移動文件和文件夾。此外FSO 允許你讀寫文本文件。
用 FSO 其實有些用詞不當,因爲實際上 FSO 包含很多個對象,每個對象被設計成用來完成特定的目的。組成 FSO
的對象列在了下表中:
Drive 代表系統中磁盤或者磁盤的集合
File 代表系統中的一個文件或者文件的集合
Folder 代表文件系統中的一個文件夾或者多個文件夾
TextStream 代表文本文件中的讀取、寫入或者提交字符串
※ 磁盤管理
磁盤管理是系統管理的一個重要的部分。作爲一個系統管理員,知道安裝在這個計算機上磁盤是十分重要的,當然,知道這個磁盤的屬性、磁盤類型、子盤大小、總共和剩餘空間也是同等重要的。作爲一個腳本的編寫者,你有兩個主要的選擇來管理磁盤:WMI
& FSO。一般來講,WMI 更是管理磁盤的首選項,主要有以下幾個原因:1、WMI 能返回一些 FSO 無法返回的屬性,比如磁道、扇面等。
2、FSO 不能返回一個目標磁盤。而是返回所有的磁盤,然後進行篩選出你感興趣的磁盤。而你可以用 WMI 通過磁盤符號來返回特定的磁盤,WMI 可以用來返回遠程計算機上磁盤的信息,但是 FSO 不可以,除非它用 wshcontroller對象。
雖然 WMI 或許是獲得磁盤信息的最好工具。但是這裏至少有兩個原因使你必須去熟悉 FSO。
第一:因爲有些低端的操作系統無法安裝 WMI,所以只能使用 FSO;
第二:最重要的一點是因爲:腳本的編寫者們在想到獲取磁盤信息的時候就會用到 FSO,而你作爲系統管理員,可能會來看其它人的腳本,這樣就需要了解 FSO。注:外國人寫的真是拗口,我理解這句話的意思就是說FSO比WMI應用的更廣泛一些。
※ 如何返回磁盤信息
在你管理計算機的磁盤之前,你需要知道你的計算機上實際上有多少磁盤可以使用。FSO 允許你管理安裝在計算機上的所有磁盤,包括移動硬盤和網絡硬盤(就是只要是有盤符的就可以了)爲了返回這個集合,你需要首先創建一個 FSO 實例,然後創建磁盤屬性的對象。當這個集合返回後,你可用一個 For Each 的循環來重述這個集合。
例如,下面的腳本就是要返回安裝在本地計算機上的磁盤集合然後返回它們的盤符:
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set colDrives = objFSO.Drives
3 For Each objDrive in colDrives
4 Wscript.Echo "Drive letter: " & objDrive.DriveLetter
5 Next
※如何綁定指定磁盤
如果你事先知道要綁定的磁盤(例如C 盤或一個共享文件夾//accounting/receivables),你可以用 GetDrive
的方法來直接綁定磁盤。這樣你可以不用去篩選就獲得特定磁盤的信息。GetDrive 需要一個單獨的參數:磁盤符號或者是共享文件夾的 UNC 路徑。你可以用如下的幾種格式:C C: C:/
在下面的腳本中首先創建一個 FSO 對象,然後用 GetDrive 的方法來直接綁定C盤,然後回顯可用的磁盤空間:
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set objDrive = objFSO.GetDrive("C:")
3 Wscript.Echo "Available space: " & objDrive.AvailableSpace
注意,這裏沒有 For Each
循環,你就可以獲得磁盤的屬性。因爲腳本是返回一個單獨的磁盤對象,而不是所有對象的集合。因此也就不用篩選了。
※如何列舉磁盤驅動器的屬性
磁盤集合的作用總是用來監視和列舉的。作爲一個系統管理員,你需要知道計算機上的可用磁盤,也需要知道磁盤的序列號、可用空間等信息。在你獲得當前磁盤的集合或者單個磁盤的時候,你就可以獲得下表列出的所有屬性。
1、AvailableSpace——報告磁盤上可以使用的空間,單位是 bytes。如果想以 kb 爲單位返回,除以 1024,如果想以 M 爲單位返回,則除以
1.048,576。這個屬性返回的是可用的磁盤空間的總數。如果一個磁盤啓用了磁盤限額,那麼他返回的數字可能比實際的要小。
2、DriveLette——返回特定磁盤的盤符。這個盤符不包含那麼冒號。例如軟盤返回的是A,而不是A:
3、DriveType——整數的值代表不同的磁盤類型:1:移動硬盤 2:硬盤 3:網絡硬盤
4:CD-ROM 5:RAM 磁盤
4、FreeSpace——返回磁盤剩餘空間的總額。單位是 bytes,如果是返回的單位是 kb,就除以 1024,如果是以 M 爲單位,除以
1,048,576。注意:這個和磁盤可用空間不一樣,剩餘的磁盤空間不會考慮磁盤限額。
5、FileSystem——返回文件系統的類型(FAT,FAT32,NTFS)
6、IsReady——標識磁盤是否可以訪問。這個值來判斷軟盤和CD-ROM是否爲空
7、Path——磁盤路徑。對於本地磁盤,返回盤符和脫尾符(就是那個冒號),比如A:對於網絡磁盤,就返回它的 UNC 路徑。
8、RootFolder——返回磁盤根目錄下的文件夾。
9、SerialNumber——磁盤的生產商給磁盤分配的序列號。對於軟盤和網絡硬盤來說,它們的值是 0。
10、ShareName——分配給網絡驅動去的共享名稱。
11、TotalSize——報告整個的磁盤空間,單位是 bytes,如果想以 kb 爲單位,除以 1024,如果想以 M 爲單位返回,則單位爲 1,048,576。
12、VolumeName——分配給磁盤的卷名。
爲了列舉安裝在計算機裏的磁盤的屬性,創建一個 FSO 實例,然後創建一個 FSO 屬性的對象,用 For Each 循環,來重現各個磁盤的配置。對於集合當中的每個磁盤,你可以返回一個或者的屬性。如下列腳本列舉出安裝在計算機上所有磁盤的所有屬性。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set colDrives = objFSO.Drives
3 For Each objDrive in colDrives
4 Wscript.Echo "Available space: " & objDrive.AvailableSpace
5 Wscript.Echo "Drive letter: " & objDrive.DriveLetter
6 Wscript.Echo "Drive type: " & objDrive.DriveType
7 Wscript.Echo "File system: " & objDrive.FileSystem
8 Wscript.Echo "Is ready: " & objDrive.IsReady
9 Wscript.Echo "Path: " & objDrive.Path
10 Wscript.Echo "Root folder: " & objDrive.RootFolder
11 Wscript.Echo "Serial number: " & objDrive.SerialNumber
12 Wscript.Echo "Share name: " & objDrive.ShareName
13 Wscript.Echo "Total size: " & objDrive.TotalSize
14 Wscript.Echo "Volume name: " & objDrive.VolumeName
15 Next
上述腳本有個潛在的缺點,就是如果沒有軟盤或者光驅裏面沒有光盤,會產生一個 disk not ready 的錯誤出來。當磁盤沒有準備好的時候用 FSO 來訪問會有些錯誤的。雖然 FSO 可以標識那些沒有準備好的磁盤,但是你訪問它的一些屬性的時候會報錯出來,比如 AvailableSpace 或 FreeSpace。如果磁盤沒有準備好,你只可以訪問如下的四個屬性:DriveLetter、DriveType、IsReady、ShareName。所有嘗試訪問其它屬性都會報錯。
幸運的是,IsReady 屬性允許你用腳本來檢查一個磁盤是否準備好了。IsReady 返回一個 Boolean 值,如果這個值是true,則磁盤準好了,你可以訪問它的所有屬性,否則如果這個值是false,則磁盤沒有準備好,只能返回上面的四個屬性了。可以對每個磁盤,用 IsReady 屬性來保證磁盤是準備好的。如果是就返回磁盤的盤符和剩餘空間,如果不是就只返回磁盤的盤符。
1 Set objFSO = CreateObject("Scripting.FileSystemObject")
2 Set colDrives = objFSO.Drives
3 For Each objDrive in colDrives
4 If objDrive.IsReady = True Then
5 Wscript.Echo "Drive letter: " & objDrive.DriveLetter
6 Wscript.Echo "Free space: " & objDrive.FreeSpace
7 Else
8 Wscript.Echo "Drive letter: " & objDrive.DriveLetter
9 End If
10 Next
Note:這個問題不會發生在 WMI 上(如果軟盤或者光驅中沒有盤,腳本就會失敗),WMI 只是認爲返回的空間爲 Null 。