◎VBS腳本運行庫手冊之五 ——文本文件的建立、追加、刪除等

文本文件對於系統管理員來說是一個強大的系統管工具。這個對於現在的高級的圖形界面和多用戶的操作系統來說好象是不可能的。但是,簡單的文本文件,比如 notepad 文件,仍然是系統管理的一個關鍵元素。文本文件是輕便而且便於維護的。他們佔用較少的磁盤空間不需要其它多餘的軟件支持。文本文件可以簡單的工作並且非常容易攜帶。用文本文件寫的腳本文件可以被複制和察看任何計算機的信息,雖然它運行的系統不是 Windows.此外,它還提供了快捷,簡單,標準的辦法來向腳本輸入和輸出數據。文本文件可以存儲向腳本中輸入的數據arguments)或者向腳本中硬編碼。這樣你就不用向命令行中輸入100個服務器的名字,腳本可以從文本文件中讀這些信息。同樣,文本文件爲存儲腳本獲取的信息提供了快捷簡單的方法。這些數據可以直接寫到數據庫,但是這個要求在服務器上作額外的配置,額外的腳本代碼,在腳本運行時候額外的管理。但是數據可以存在文本文件中,然後在稍後導入到數據中去。FSO 提供一些讀寫文本文件的方法。

Creating Text Files

FSO 讓你可以用現存在的文本工作,也可以讓你自己創建腳本。爲了創建一個新的文本文件,簡單的創建一個 FSO 對象,然後調用 CreateTextFile 方法,輸入完整的文件路徑信息作爲這個方法的參數。

例如,如下的腳本代碼在文件夾 C:/FSO 中創建了一個 Scriptlog.txt 的文件:

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

2   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 文件名字。

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

2   For i = 1 to 10

3     strTempFile = objFSO.GetTempName

4     Wscript.Echo strTempFile

5   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. 在創建了這個文件之後,關閉這個文件。在生產環境中,大多數情況下,你可能要向裏面寫    了數據之後再關閉它。

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

2   strPath = "C:/FSO"

3   strFileName = objFSO.GetTempName

4   strFullName = objFSO.BuildPath(strPath, strFileName)

5   Set objFile = objFSO.CreateTextFile(strFullName)

6   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

1 Const ForReading = 1

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

3 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

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

2  Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", 1)

3  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

1 Const ForReading = 1

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

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

4 strContents = objFile.ReadAll

5 Wscript.Echo strContents

6 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

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

2   Set objFile = objFSO.OpenTextFile("C:/FSO/ServerList.txt", 1)

3   Do Until objFile.AtEndOfStream

4     strLine = objFile.ReadLine

5     Wscript.Echo strLine

6   Loop

7   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

1 Dim arrFileLines()

2     i = 0

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

4     Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", 1)

5     Do Until objFile.AtEndOfStream

6      Redim Preserve arrFileLines(i)

7      arrFileLines(i) = objFile.ReadLine

8      i = i + 1

9     Loop

10    objFile.Close

11    For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1

12     Wscript.Echo arrFileLines(l)

13    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

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

2   Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", 1)

3   Do Until objFile.AtEndOfStream

4    objFile.Skip(5)

5    strCharacters = objFile.Read(1)

6    Wscript.Echo strCharacters

7    objFile.SkipLine

8   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).

在這種模式下,數據寫在原來文件的末尾。用這種模式向現有的文件中添加數據。

3. 用或者 Write,WriteLine,WriteBlankLine 方法來向文本文件中寫入數據。

4. 關閉文本文件

向文本文件中寫數據的三種方法在表格 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

1 Const ForWriting = 2

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

3 Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForWriting)

4 objFile.Write Now

5 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

1 Const ForAppending = 8

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

3 Set objFile = objFSO.OpenTextFile("C:/FSO/ScriptLog.txt", ForAppending)

4 objFile.WriteLine Now

5 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

 

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