1. 程式人生 > >VBS指令碼執行庫 ——文字檔案的建立、追加、刪除等

VBS指令碼執行庫 ——文字檔案的建立、追加、刪除等

文字檔案對於系統管理員來說是一個強大的系統管工具。這個對於現在的高階的圖形介面和多使用者的作業系統來說好象是不可能的。但是,簡單的文字檔案,比如 notepad 檔案,仍然是系統管理的一個關鍵元素。文字檔案是輕便而且便於維護的。他們佔用較少的磁碟空間不需要其它多餘的軟體支援。文字檔案可以簡單的工作並且非常容易攜帶。用文字檔案寫的指令碼檔案可以被複制和察看任何計算機的資訊,雖然它執行的系統不是 Windows.此外,它還提供了快捷,簡單,標準的辦法來向指令碼輸入和輸出資料。文字檔案可以儲存向指令碼中輸入的資料arguments)或者向指令碼中硬編碼。這樣你就不用向命令列中輸入100個伺服器的名字,指令碼可以從文字檔案中讀這些資訊。同樣,文字檔案為儲存指令碼獲取的資訊提供了快捷簡單的方法。這些資料可以直接寫到資料庫,但是這個要求在伺服器上作額外的配置,額外的指令碼程式碼,在指令碼執行時候額外的管理。但是資料可以存在文字檔案中,然後在稍後匯入到資料中去。FSO 提供一些讀寫文字檔案的方法。

Creating Text Files

FSO 讓你可以用現存在的文字工作,也可以讓你自己建立指令碼。為了建立一個新的文字檔案,簡單的建立一個 FSO 物件,然後呼叫 CreateTextFile 方法,輸入完整的檔案路徑資訊作為這個方法的引數。

例如,如下的指令碼程式碼在資料夾 C:/FSO 中建立了一個 Scriptlog.txt 的檔案:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("C:/FSO/ScriptLog.txt")

如果這個檔案存在,那麼 CreateTextFile 方法會建立一個。如果這個檔案已經存在,那麼CreateTextFile 方法會複寫存在的文字檔案,而以新的空白的檔案取代它。如果你希望這個檔案不被取代,那麼就用一個可以選擇 Overwrite 的引數。當這個引數設定成 False 的時候,攢在的檔案就不被複寫。當這個引數被設定成 True(預設的是 True),那麼就會複寫存在的檔案。例如,如下的指令碼如果建立的檔案存在的話就不會複寫。

Set objFile = objFSO.CreateTextFile("C:/FSO/ScriptLog.txt", False)

如果你將引數設定成False,並且檔案存在,那麼就會有一個執行的錯誤。因為如此,你可以檢查檔案是否存在,如果存在,那麼就作其它的操作,例如允許使用者更改一個新的檔名。

Creating File Names Within the Script

防止檔案存在產生錯誤的方法是用指令碼給文字檔案生成一個名字。因為檔名字生成器並不建立一個有意義的名字,這對於你想在未來要命名的日誌和其它檔案來說不是一個好的辦法。但是,這個對於需要臨時檔案的指令碼來說保證了有個特定的檔名。例如,你或許想讓你的指令碼將資料儲存在HTML 或者 XML 格式,然後將這些資料在 WEB 瀏覽器中顯示,然後將這個臨時檔案在web 瀏覽器關掉時刪除。在這種情況下,你可以用GetTempName 方法來生成一個特有的檔名。

為了生成一個特別的檔名,指令碼首先要建立一個 FSO 物件例項然後呼叫 GetTempName 方法(不用引數。)例如在 4.33 中的指令碼用一個 For Next 迴圈來隨機生成 10 檔名字。

Set objFSO = CreateObject("Scripting.FileSystemObject")
For i = 1 to 10
strTempFile = objFSO.GetTempName
Wscript.Echo strTempFile
Next

用 GetTempName 來生成檔案的名字生成的不是唯一的。部分原因是生成名稱的演算法,部 分是因為可能的名字的數量是有限的。檔名字被限制為 8 個位元組,而且前三個位元組規定為 rad,例如,你用指令碼來建立 10000 個檔名字,在第 9894 個檔名字之後就不再是唯一的了,剩下的 106 個 53 對是複製的。

在 4.34 中的示例指令碼用 GetTempName 方法來建立一個檔案,指令碼必須:

  1. 建立一個 FSO 物件例項。

  2. 建立一個給資料夾 C:/FSO 的變數叫做 strPath.

  3. 用 GetTempName 方法來生成一個單獨的檔名子。

  4. 用 BuildPath 的方法來合併資料夾名字和檔名字來建立一個完成的臨時檔案的名字。這個 整個路徑儲存在 strFullName 變數中。

  5. 呼叫 CreateTextFile 方法,用 strFullName 來作引數。

  6. 在建立了這個檔案之後,關閉這個檔案。在生產環境中,大多數情況下,你可能要向裡面寫 了資料之後再關閉它。

 Set objFSO = CreateObject("Scripting.FileSystemObject")
strPath = "C:/FSO"
strFileName = objFSO.GetTempName
strFullName = objFSO.BuildPath(strPath, strFileName)
Set objFile = objFSO.CreateTextFile(strFullName)
objFile.Close

Opening Text Files

用文字檔案來工作有三個主要的步驟。在你可以作其它的事情之前,你必須開啟文字檔案。這個你可以開啟存在的檔案或者建立一個新的文字檔案,建立結束之後,預設檔案是開啟的。每個方法都是返回一個TextStream 物件例項。

在你獲得了 TextStream 物件之後,你可以向這個檔案中寫或者讀這個檔案。但是你不能向同一個檔案讀和寫。換句話說,在同一個操作中,你不能開啟一個檔案,讀這個檔案然後再向這個檔案中寫東西。你必須讀完這個檔案後關閉,然後再開啟這個檔案,寫入資料,然後關閉。

當你開啟一個存在的檔案,這個檔案要麼是準備好被讀的,要麼是準備好被寫的。如果你建立一個新的文字檔案,這個文字檔案只是被讀的,沒有什麼其它原因的話,它沒有內容去被讀。最後,你要去關閉這個文字檔案,雖然它不是必須的,因為在指令碼結束的時候,它會自動關閉,但是這個對於程式實踐來說是個好的辦法。

為了開啟一個文字檔案:

  1. 建立一個 FSO 物件例項。

  2. 用:OpenTextFile 來開啟一個文字檔案。這個 OpenTextFile 需要兩個引數,一個是一個文 件的路徑,另外一個是跟著的引數:

For reading (parameter value = 1, constant = ForReading).

檔案被開啟之後只是被用來為讀作準備的,為了寫這個檔案,你必須再一次的開啟檔案,用引數 ForWriting 或者 ForAppending。

For writing (parameter value 2, constant = ForWriting).
 檔案被開啟,並且寫入的資料覆蓋了原來存在的資料,就是說舊的資料被刪除,新的被新增。用這個方法用新的資料來代替存在的資料。
For appending (parameter value 8, constant = ForAppending).
 檔案在這種模式下開啟,並且新的資料新增到檔案的末尾。用這個方法向存在的檔案中新增新的資料。

當開啟檔案的時候,你必須使用適當的引數。當你用讀的模式開啟一個檔案而試圖向裡面寫東西的時候,你會收到一個 bad file mode

的錯誤。你如果試圖開啟一個非文字檔案的話也會收到同樣的錯誤的。你可以直接用數值(比如 1 代表寫)或者建立一個常量然後賦值給它適當的值。例如,如下的兩種方法都可以開啟一個檔案並且準備被讀:

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForReading)
Set objFile2 = objFSO.OpenTextFile("C:/FSO/ScriptLog2.txt", 1)

但是在沒有定義這個常量的時候,你不能直接用。這是因為事實上 VB 指令碼並沒有這些 COM 物件常量。如下的指令碼會返回一個 invalid procedure call or argument 的錯誤並且失敗。這是因為ForReading 這個常量並沒有顯式的定義。因為它沒有定義,所以這變數預設情況下被賦值為 0,而 0 對於 OpenTextFile 來說並不是一個合法的引數:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForReading)

在 4.35 中的指令碼打開了 C:/FSO/Scriptlog.txt 準備讀,用了使用者自己定義的變數,並且賦值為 1.

Listing 4.35 Opening a Text File for Reading

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForReading)

Closing Text Files

所有的用指令碼開啟的文字檔案在指令碼結束的時候會自動關閉。因為如此,比不是必須的去顯式的關閉一個文字檔案。然而,關閉這個文字檔案卻是一個很好的程式實踐並且在下面的一些情況下,如果不關閉檔案的話,會產生一些錯誤。

Reread the file.

有些時候你或許希望用一個指令碼多次讀一個檔案。你或許開啟一個文字檔案然後將它所有的內容全部儲存給一個字串變數,然後搜尋這個字串來查詢特定的錯誤的程式碼。當這個錯誤找到了,你再逐行去讀取檔案,提煉出有錯誤的每一行。如果你嘗試多次去讀一個檔案,你不會收到你期待的結果,而是會遇到一個執行的錯誤。例如下的指令碼讀取一個文字檔案,返回檔案的內容到螢幕,然後嘗試重複這樣的過程:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", 1)
Wscript.Echo "Reading file the first time:"
strContents = objFile.ReadAll
Wscript.Echo strContents
Wscript.Echo "Reading file the second time:"
Do While objFile.AtEndOfStream = False
 strLine = objFile.ReadLine
 Wscript.Echo strLine
Loop

當在 cscript 下執行的是命令列的資訊如下:

Reading file the first time:

File line 1.

File line 2.

File line 3.

Reading file the second time:

第一次檔案是被讀取的,內容儲存在變數 strContents 上,第二次,檔案讀取的時候,沒什有資料回顯在螢幕上,這是因為檔案已經到達了檔案的末尾,沒有其它的資料給你讀了。為了讀取這個資料,你必須關閉這個檔案然後重新開啟它。你不能在讀到檔案的末尾之後去跳到檔案的開頭去了。TextStreamObject.Close 方法用來關閉一個文字檔案。例如,在 4.36 中的指令碼建立一個FSO物件例項,然後開啟一個文字檔案,然後在立即關閉了。為了訪問檔案的內容,你必須再一次的呼叫 OpenTextFile 方法去重新開啟這個檔案。

Listing 4.36 Opening and Closing a Text File

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", 1)
objFile.Close

Reading Text Files

在許多的企業指令碼中,讀取文字檔案的內容是個標準程序,你可以用這個功能來讀取命令列的引數。例如,你的文字檔案包含了計算機名字的列表,指令碼審計成讀取這個列表,然後在每個計算機上執行這個指令碼。搜尋滿足特定條件的日誌檔案。例如,你或許想找所有有錯誤的日誌。將日誌檔案中新增內容並且匯入到資料庫。例如,你或許有一個服務或者程式來儲存資訊到特定存文字檔案格式。然後你用指令碼來讀取這個檔案拷貝相關的資訊到資料庫中。

可以用 FSO 來都讀取文字檔案的內容,但是有以下幾點你需要牢記:FSO 只能讀取 ASCII 的文字檔案。你不能用 FSO 讀取unicode 或者

binary 檔案格式的檔案,比如 microsoft word 或者是 Microsoft excel .用 FSO讀取文字檔案的時候,只能有一種方式:從前到後。此外,FSO 讀取檔案的時候是逐行讀取的。如果你試圖返回前面的行,你必須從開始再重新讀取,直到特定的行。

你不能開啟一個檔案同時用來讀和寫。如果你開啟一個檔案是為了讀的,那麼你想修改檔案內容的時候,你必須重新開啟檔案。如果你嘗試在寫的模式下讀取檔案,那麼你會收到一個bad file mode 的錯誤。

還有讀取特定的字元然後停止也是我們常用的技巧。例如,如下的命令會讀取第一行的前 12 個字元Alerter.Shar,並且將它賦值給變數

strText,然後停止:strText = objTextFile.Read(12)

ReadLine 讀取文字檔案中每行的資訊然後在到達新的一行的之前停止。例如,如下的命令讀取第一行並且將它賦值給變數strText,然後停止。strText = objTextFile.ReadLine

為了逐行讀取整個檔案的內容,將 ReadLine 放在一個迴圈中。

ReadAll Reads the entire contents of a text file into a variable.

Skip 跳過特定的數目的字元之後停止。例如,如下的命令面跳過前面的 12 位元組,後操作都說從第 13 個字元開始。

objTextFile.Skip(12)

SkipLine 跳過一整行。例如,如下的程式碼先讀第一行,然後讀取第三行。跳過了第二行

strText = objTextFile.Readline
objTextFile.SkipLine
strText = objTextFile.Readline

雖然在單獨的一個字串中尋找東西是很簡單,但是不是要求特別快。用 ReadAll 方法在讀取近 6000 行的測試檔案的時候,每秒鐘搜尋大約 388kb。逐行讀取的話也會小於一分鐘的。

為了用 ReadAll 方法,開啟一個文字文檔案,然後呼叫 ReadAll 方法(不用引數的)例如在 4.38的指令碼,開啟檔案C:/FSO/Scriptlog.txt,然後讀取檔案的內容,蔣資料儲存在變數strContents 中,指令碼然後回顯這個變數的值,就是回顯了文字檔案的內容。

Listing 4.38 Reading a Text File Using the ReadAll Method

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForReading)
strContents = objFile.ReadAll
Wscript.Echo strContents
objFile.Close

Reading a Text File Line by Line

為了達到系統管理的目的,文字檔案有的時候像一個扁平的上資料庫一樣的工作。每一行代表資料庫的一個紀錄。例如,指令碼經常在文字檔案中讀取伺服器的名字,然後針對這些伺服器來執行操作。在這些情況下,文字檔案看起來和下面這些差不多的:

atl-dc-01
atl-dc-02
atl-dc-03
atl-dc-04

當文字檔案當做扁平資料庫的時候,指令碼被用來讀取每個紀錄然後針對每個紀錄作一些工作。例如,一個指令碼或許讀取第一個計算機名子,連線到它,實現一些功能。然後這個指令碼讀取第二個計算機的名字,連線到它,然後實現同樣的功能。這個程序直到讀取完了所有的計算機名字,然後結束。

ReadLine 方法可以讓你的指令碼讀取文字檔案中單個的行。為了這個方法,開啟一個文字檔案,然後用一個 Do Loop 迴圈直到檔案的

AtEndOfStream 屬性為真。在這個迴圈中,呼叫ReadLine

方法,儲存第一行的內容到一個變數,然後作一些動作。當指令碼執行迴圈的時候,熱它自動丟棄第一行的內容讀取第二行的內容到這個變數。這個過程持續進行直到檔案的結束。

例如,在 4.39 中的指令碼開啟檔案 C:/FSO/Serverlist.txt 然後逐行讀取整個檔案,將內容回顯在螢幕上:

Listing 4.39 Reading a Text File Using the ReadLine Method

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ServerList.txt", 1)
Do Until objFile.AtEndOfStream
 strLine = objFile.ReadLine
 Wscript.Echo strLine
Loop
objFile.Close

“Reading” a Text File from the Bottom to the Top

正如前面提到的,FSO 只能從文字檔案的前面讀到後面,你不能從後面向前面讀。這個對於日誌檔案來說有一些問題,大部分的日誌檔案是按照日期格式來寫的,它的最開始的第一個日誌被紀錄在第一行,第二個紀錄紀錄在第二行,依次類推。這就以為著你感興趣的事情,最新的日誌往往在檔案末尾。

有的時候你希望按照反日期的順序來顯示資訊,就是最近的紀錄最先顯示,最舊的紀錄最後顯示。雖然你不能從後面先前的讀取文字檔案,但是你要可以實現上面的目的,指令碼必須:

  1. 建立一個數組來儲存文字檔案的每行資訊

  2. 用 ReadLine 的方法讀取文字檔案的每行資訊,然後將每行的資訊作為陣列的一個獨立的元 素儲存在陣列中。

  3. 在螢幕上顯示陣列的資訊,從陣列的最後面開始,向前顯示。

例如,在 4.40 中的指令碼讀取檔案 C:/FSO/Scriptlog.txt 的資訊,然後將每行的資訊作為陣列

的一個元素儲存在陣列 arrFileLine 中。在整個檔案被讀了之後,從陣列的最後一個開始回顯陣列的資訊。為了做到這點,用了一個 for

迴圈,從陣列的最後一個元素,the upper bound of array 逐漸增長到第一個元素,the lower bound of array

Dim arrFileLines()
i = 0
 Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", 1)
Do Until objFile.AtEndOfStream
 Redim Preserve arrFileLines(i)
 arrFileLines(i) = objFile.ReadLine
 i = i + 1
Loop
objFile.Close
For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1
 Wscript.Echo arrFileLines(l)
Next

如果檔案的內容和下面的一樣:

6/19/2002    Success
6/20/2002    Failure
6/21/2002    Failure
6/22/2002    Failure
6/23/2002    Success

那麼在螢幕上回顯的資訊如下:

6/23/2002     Success
6/22/2002     Failure
6/21/2002     Failure
6/20/2002     Failure
6/19/2002     Success

Reading a Text File Character by Character

在一些定寬的文字檔案中,區域是受長度的限制的。第一個 field1 或許包含 15 個位元組,第 2個 field 或許含有十個,依次類推。那麼這樣的檔案看起來和下面的差不多:

Server Value Status
atl-dc-0119345   OK
atl-printserver-02    00042  OK
atl-win2kpro-0500000   Failed

在有些情況下,你或許只是想獲得 values 的值或者只是想獲得 status 的資訊。這個 value 的資訊,容易表明。Values 總是從第 26

個字元開始,不超過 5 個字元。為了獲得這些值,你只需要獲得第 26,27,28,29,30 個字元的資訊。

方法 Read 允許你讀取特定數目的位元組。它的一個單獨的引數就是你要讀的位元組的個數。例如,如下的指令碼程式碼示例,讀取後面的 7 個位元組,並將讀取的值存給變數 strCharacters:

strCharacters = objFile.Read(7)

用 Skip 和 SkipLine 方法,你可以獲得文字檔案中你選擇的特定字元。例如,在指令碼 4.41 中只是讀取每行的第 6 個位元組。為了做到這點,指令碼必須:

  1. 跳過每行前面五個位元組用 Skip(5)

  2. 用 Read(1)讀取第 6 個位元組

  3. 跳到下面一行。

Listing 4.41 Reading a Fixed-Width Text File

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", 1)
Do Until objFile.AtEndOfStream
 objFile.Skip(5)
 strCharacters = objFile.Read(1)
 Wscript.Echo strCharacters
 objFile.SkipLine
Loop

為了更好說明指令碼是如何工作的,我們假設指令碼檔案 C:/FSO/Scriptlog.txt 看起來是如下的樣子的:

XXXXX1XXXXXXXXXXXXXX
XXXXX2XXXXXXXXXXXXXXXXXXX
XXXXX3XXXXXXXXXXXXx
XXXXX4XXXXXXXXXXXXXXXXXXXXXXXXX

對於這個檔案的每行,前面的五個字元都是 x,第六個是數字,後面是隨機數量的 x。當指令碼4.41 執行的時候,指令碼會:

  1. 開啟文字檔案從第一行開始讀起。
  2. 跳過前面五個字元。
  3. 用 Read 載方法讀取第六個字元
  4. 回顯字元在螢幕上
  5. 跳到下面一行重複上面的程序,直到指令碼執行結束。.

Writing to Text Files

像文字檔案中寫入資料是寫系統管理指令碼的另外一個強大的功用。文字檔案提供了一種方法可以讓你將指令碼獲得的輸入儲存在其中。輸入可以替代現有的文字或者是新增到現有的文字後面。文字文檔案也可以紀錄指令碼的執行情況。這個對於debug 指令碼來說費城有用。將指令碼的執行紀錄放在一個文字檔案中,你可以過陣子來察看這個日誌去決定指令碼實際執行了哪些而哪些沒有執行。FSO 給你提供了向文字檔案中寫如資料的能力。為了用 FSO 指令碼向一個文字檔案中寫入資料,你必須:

  1. 建立一個 FSO 物件例項。

  2. 用 OpenTextFile 方法開啟這個文字檔案,你可以以兩種方法開啟:

For writing (parameter value 2, constant = ForWriting).

在這個模式下,寫入新的資料會覆蓋舊的資料。(舊的資料會被刪除,新的資料新增上去。)

用這個模式,是將存在的檔案換上新的內容。

For appending (parameter value 8, constant = ForAppending).

在這種模式下,資料寫在原來檔案的末尾。用這種模式向現有的檔案中新增資料。

  1. 用或者 Write,WriteLine,WriteBlankLine 方法來向文字檔案中寫入資料。

  2. 關閉文字檔案

向文字檔案中寫資料的三種方法在表格 4.9 中:

Table 4.9 Write Methods Available to the FileSystemObject

Method Description

Write 向文字檔案中寫入資料,不是新增檔案到末尾。不會自動換行。

例如,如下程式碼寫入兩個單獨的字串:

objFile.Write ("This is line 1.")
objFile.Write ("This is line 2.")

MethodDescription

返回的資料類似如下:

This is line 1.This is line 2.

WriteLine 向文字檔案中寫入資料後新增一個換行符號,然後區自動換行的。

比如,如下的程式碼:

objFile.WriteLine ("This is line 1.")
objFile.WriteLine ("This is line 2.")

結果輸出的資訊如下:

This is line 1.

This is line 2.

WriteBlankLines 向文字檔案中寫入特定數目空白的行。例如如下的程式碼向文字檔案中寫入兩行獨立的文字,然後用空白的行分開:

objFile.Writeline ("This is line 1.")
objFile.WriteBlankLines(1)
objFile.Writeline ("This is line 2.")

輸出的結果如下:

This is line 1.

This is line 2.

除了在表格 4.9 中的方法之外,VB 指令碼提供了常量 VbTab 來向文字檔案中寫入。VbTab

向兩個字元中插入一個空格。為了建立一個空格分隔的檔案,程式碼和下面的類似:

objTextFile.WriteLine(objService.DisplayName & vbTab & objService.State)

FSO 的一個弱點就是它不能直接修改特定的行的資訊。你不能寫類似下面的命令:跳過到第五行,更改一些資料,然後儲存成新的檔案。為了修改在一個十行檔案中的第五行,你的指令碼必須

  1. .讀取整個 10 行
  2. .將 1-4 行寫回檔案。
  3. 寫入修改好的第五行的內容。
  4. 寫入第 6 行到第 10 行的內容。

Overwriting Existing Data

在系統管理中,簡潔是一種美德。例如,假如你的指令碼每天晚上執行,在你的 DC 上從事件日誌中獲得日誌,將這些事件寫入資料庫中,紀錄哪個計算機可以成功的連線到,哪個不可以。基於一些歷史的目的,你或許希望跟蹤明年一整年的所有成功和失敗的紀錄。這個對於指令碼剛開始生效和網路不穩定的情況下來說,都是非常重要的。從另外的情況來說,你或許只是希望剛才指令碼執行的時候發生了什麼。換句話說說,你不是希望要一個日誌中過去的 365 天的資訊,而是要距離最近的資訊。它讓你可以很快的開啟檔案並且查詢看指令碼是否按照計劃的執行。

當你的文字檔案用 ForWriting 模式開啟的,任何寫入的新的資料會替代原來存在的檔案。例如,假如你的文字檔案裡面儲存了整個莎士比亞的故事全集,但是你用指令碼以 ForWriting 模式打開了這個文字,並且向裡面寫了一個字母 a,那麼當你的這個檔案寫完關閉之後,它就只是包含一個字母 a,原來的資料就全部丟失了。

這個指令碼以 ForWriting 模式開啟指令碼 C:/FSO/Scriptlog.txt 然後將當前的日期和時間寫入檔案。每當指令碼執行的時候,舊的時間和日期被新的取代,這個文字檔案就永遠只是有單獨的一個日期的值。

Listing 4.42 Overwriting Existing Data

Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForWriting)
objFile.Write Now
objFile.Close

Appending New Data to Existing Data

許多指令碼被設計成為在特定的時間間隔的時候執行,收據資料,儲存資料。這些指令碼的是用來分析趨勢或者在過去的時間內部的使用情況。在這些情況下,你就不希望刪除現在存在的資料而去替代成新的資料。

例如,假如你用你的指令碼監視程序使用量。在任何一個時間點上,程序的使用量應該是在 0 到100 之間的一個值,對於它自己來說,單個的值沒有什麼意義。為了獲得程序使用的一個完整的圖景,你需要重複不斷的監視使用情況並紀錄它的值。如果你的程序在每幾秒鐘之內返回的資料是9%,17%,92%,90%,79%,88%,91%那麼你的程序使用是非常高的。這個就可以對比出這個時間內的使用情況。

如果以 ForAppending 的模式開啟一個檔案,你可以使資料不是覆蓋現有的資料,它的資料是新增到檔案的底部。例如,在 4.43 中的指令碼開啟一個文字檔案,並且將當前的日期和時間寫入檔案。因為是以 ForAppending

的模式開啟的檔案,當前的日期會解除安裝檔案的底部。如果你在不同的時候分別執行指令碼,你的指令碼結束時候大約如下面的資訊:

6/25/2002 8:49:47 AM
6/25/2002 8:49:48 AM
6/25/2002 8:50:33 AM
6/25/2002 8:50:35 AM

Listing 4.43 Appending Data to a Text File

Const ForAppending = 8
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForAppending)
objFile.WriteLine Now
objFile.Close

上面的指令碼用 WriteLine 方法寫入資料保證每個日期都是獨佔一行的。如果這個指令碼用 Write

的方法來寫的話,那麼這個指令碼執行結束的時候,資料寫在一起,如下的樣子:

6/25/2002 8:49:47 AM6/25/2002 8:49:48 AM6/25/2002 8:50:33 AM6/25/2002 8:50:35 AM