文件的創建:
FSO 讓你可以用現存在的文本工作,也可以讓你自己創建腳本。爲了創建一個新的文本文件,簡單的創建一個 FSO 對象,然後調用 CreateTextFile 方法,輸入完整的文件路徑信息作爲這個方法的參數
例如:(在c:\windows文件夾創建一個xxwl.ini文件)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("c:\windows\xxwl.ini")
如果這個文件不存在,那麼 CreateTextFile 方法會創建一個。如果這個文件已經存在,那麼CreateTextFile 方法會複寫存在的文本文件,並以新的空白的文件取代它。
如果不想這個文件被取代,那麼就用一個可以選擇的參數 Overwrite 。當這個參數設置成 False 的時候,這個文件就不被複寫。當這個參數被設置成 True(默認的是 True)時,那麼就會被複寫也就是清空。
例如:(在c:\windows文件夾創建一個xxwl.ini文件,如果文件存在,而又不想被複寫那麼就用如下代碼)
Set objFile = objFSO.CreateTextFile("c:\windows\xxwl.ini", False)
如果你將參數設置成False,並且文件存在,那麼就會有一個運行的錯誤。因爲如此,你可以檢查文件是否存在,如果存在,那麼就作其它的操作:
例如:(需要在c:\windows文件夾創建一個xxwl.ini文件,如果這個文件存在就顯示其中的內容如果不存在就創建一個)
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("c:\windows\xxwl.ini") Then
Set objFile =
objFSO.OpenTextFile("c:\windows\xxwl.ini", 1)
txt = objFile.ReadAll
Wscript.Echo txt
Else
Set objFolder = objFSO.GetFile("c:\windows\xxwl.ini")
End If
創建臨時文件的方法:
爲了生成一個臨時文件名,腳本首先要創建一個 FSO 對象實例然後調用 GetTempName 方法(不用參數。)
例如:(需要創建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 對是重複的。
例如:(要在c:\xxwl\生成一個臨時的文件)
Set objFSO = CreateObject("Scripting.FileSystemObject")
strPath = "C:\xxwl"
strFileName = objFSO.GetTempName
strFullName = objFSO.BuildPath(strPath, strFileName)
Set objFile = objFSO.CreateTextFile(strFullName)
objFile.Close
這裏如果文件夾xxwl不存在就會提示錯誤,那麼就要先檢查了,檢查和創建文件夾的方法會在文件夾操作中學習
像文本文件中寫入數據是寫系統管理腳本的另外一個強大的功用。文本文件提供了一種方法可以讓你將腳本獲得的輸入存儲在其中。輸入可以替代現有的文字或者是添加到現有的文字後面。文本文文件也可以紀錄腳本的執行情況。這個對於debug 腳本來說費城有用。將腳本的執行紀錄放在一個文本文件中,你可以過陣子來察看這個日誌去決定腳本實際執行了哪些而哪些沒有執行。FSO 給你提供了向文本文件中寫如數據的能力。爲了用 FSO 腳本向一個文本文件中寫入數據,你必須:
1. 創建一個 FSO 對象實例。
2. 用 OpenTextFile 方法打開這個文本文件,你可以以兩種方法打開:
For writing (parameter value 2, constant = ForWriting).
例如:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile ("c:\windows\xxwl.ini", 2,
True)
在這個模式下,寫入新的數據會覆蓋舊的數據。(舊的數據會被刪除,新的數據添加上去。)
用這個模式,是將存在的文件換上新的內容。
For appending (parameter value 8, constant = ForAppending).
例如:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile ("c:\windows\xxwl.ini", 8,
True)
在這種模式下,數據寫在原來文件的末尾。用這種模式向現有的文件中添加數據。
3. 用或者 Write,WriteLine,WriteBlankLine 方法來向文本文件中寫入數據。
4. 關閉文本文件
向文本文件中寫數據的三種方法在表格如下:
Write 向文本文件中寫入數據,不是添加文件到末尾。不會自動換行。
例如,如下代碼寫入兩個單獨的字符串:
objFile.Write ("This is line 1.")
objFile.Write ("This is line 2.")
返回的數據類似如下:
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.
除了以上方法之外,VB 腳本提供了常量 VbTab 來向文本文件中寫入。VbTab
向兩個字符中插入一個空格。爲了創建一個空格分隔的文件,代碼和下面的類似:
objTextFile.WriteLine(objService.DisplayName & vbTab & objService.State)
FSO 的一個弱點就是它不能直接修改特定的行的信息。你不能寫類似下面的命令:跳過到第五行,更改一些數據,然後保存成新的文件。爲了修改在一個十行文件中的第五行,你的腳本必須
1. .讀取整個 10 行
2. .將 1-4 行寫回文件。
3. 寫入修改好的第五行的內容。
4. 寫入第 6 行到第 10 行的內容。
在系統管理中,簡潔是一種美德。例如,假如你的腳本每天晚上運行,在你的 DC 上從事件日誌中獲得日誌,將這些事件寫入數據庫中,紀錄哪個計算機可以成功的連接到,哪個不可以。基於一些歷史的目的,你或許希望跟蹤明年一整年的所有成功和失敗的紀錄。這個對於腳本剛開始生效和網絡不穩定的情況下來說,都是非常重要的。從另外的情況來說,你或許只是希望剛纔腳本運行的時候發生了什麼。換句話說說,你不是希望要一個日誌中過去的 365 天的信息,而是要距離最近的信息。它讓你可以很快的打開文件並且查找看腳本是否按照計劃的運行。
當你的文本文件用 ForWriting 模式打開的,任何寫入的新的數據會替代原來存在的文件。例如,假如你的文本文件裏面存儲了整個莎士比亞的故事全集,但是你用腳本以 ForWriting 模式打開了這個文本,並且向裏面寫了一個字母 a,那麼當你的這個文件寫完關閉之後,它就只是包含一個字母 a,原來的數據就全部丟失了。
這個腳本以 ForWriting 模式打開腳本 C:\FSO\Scriptlog.txt 然後將當前的日期和時間寫入文件。每當腳本運行的時候,舊的時間和日期被新的取代,這個文本文件就永遠只是有單獨的一個日期的值。
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", ForWriting)
objFile.Write Now
objFile.Close
許多腳本被設計成爲在特定的時間間隔的時候運行,收據數據,保存數據。這些腳本的是用來分析趨勢或者在過去的時間內部的使用情況。在這些情況下,你就不希望刪除現在存在的數據而去替代成新的數據。
例如,假如你用你的腳本監視進程使用量。在任何一個時間點上,進程的使用量應該是在 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
Const ForAppending = 8
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", 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
用文本文件來工作有三個主要的步驟。在你可以作其它的事情之前,你必須打開文本文件。這個你可以打開存在的文件或者創建一個新的文本文件,創建結束之後,默認文件是打開的。每個方法都是返回一個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).
文件在這種模式下打開,並且新的數據添加到文件的末尾。用這個方法向存在的文件中添加新的數據。
當打開文件的時候,你必須使用適當的參數。當你用讀的模式打開一個文件而試圖向裏面寫東西的時候,你會收到一個的錯誤。你如果試圖打開一個非文本文件的話也會收到同樣的錯誤的。你可以直接用數值(比如 1 代表寫)或者創建一個常量然後賦值給它適當的值。
例如,如下的兩種方法都可以打開一個文件並且準備被讀:
例一:(讀取方式打開C:\windows\xxwl.ini)
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", ForReading)
例二:(讀取方式打開C:\windows\xxwl.ini)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", 1)
但是在沒有定義這個常量ForReading 的時候,你不能直接用。這是因爲事實上 VB 腳本並沒有這些 COM 對象常量。如下的腳本會返回一個錯誤並且失敗。這是因爲ForReading 這個常量並沒有顯式的定義。因爲它沒有定義,所以這變量默認情況下被賦值爲 0,而 0 對於 OpenTextFile 來說並不是一個合法的參數:
所有的用腳本打開的文本文件在腳本結束的時候會自動關閉。但是我們要養成關閉文件的一個好的習慣,這樣就可以避免產生的一些錯誤。
有些時候你或許希望用一個腳本多次讀一個文件。你或許打開一個文本文件然後將它所有的內容全部保存給一個字符串變量,然後搜索這個字符串來查找特定的錯誤的代碼。當這個錯誤找到了,你再逐行去讀取文件,提煉出有錯誤的每一行。如果你嘗試多次去讀一個文件,你不會收到你期待的結果,而是會遇到一個運行的錯誤。例如下的腳本讀取一個文本文件,返回文件的內容到屏幕,然後嘗試重複這樣的過程:
Set objFSO =
CreateObject("Scripting.FileSystemObject")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\windows\xxwl.ini", 1)
Wscript.Echo "第一次讀取文件"
strContents = objFile.ReadAll
Wscript.Echo strContents
Wscript.Echo "文件讀取完畢"
Do While objFile.AtEndOfStream = False
strLine = objFile.ReadLine
Wscript.Echo strLine
Loop
第一次文件是被讀取的,內容存儲在變量 strContents 上,第二次,文件讀取的時候,沒什有數據回顯在屏幕上,這是因爲文件已經到達了文件的末尾,沒有其它的數據給你讀了。爲了讀取這個數據,你必須關閉這個文件然後重新打開它。你不能在讀到文件的末尾之後去跳到文件的開頭去了。TextStreamObject.Close 方法用來關閉一個文本文件。例如,下面的腳本創建一個FSO對象實例,然後打開一個文本文件,然後在立即關閉了。爲了訪問文件的內容,你必須再一次的調用 OpenTextFile 方法去重新打開這個文件。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", 1)
objFile.Close
在許多的企業腳本中,讀取文本文件的內容是個標準進程,你可以用這個功能來讀取命令行的參數。例如,你的文本文件包含了計算機名字的列表,腳本審計成讀取這個列表,然後在每個計算機上運行這個腳本。搜索滿足特定條件的日誌文件。例如,你或許想找所有有錯誤的日誌。將日誌文件中添加內容並且匯入到數據庫。例如,你或許有一個服務或者程序來保存信息到特定存文本文件格式。然後你用腳本來讀取這個文件拷貝相關的信息到數據庫中。
可以用 FSO 來都讀取文本文件的內容,但是有以下幾點你需要牢記:FSO 只能讀取 ASCII 的文本文件。你不能用 FSO 讀取unicode 或者
binary 文件格式的文件,比如 microsoft word 或者是 Microsoft excel .用 FSO讀取文本文件的時候,只能有一種方式:從前到後。此外,FSO 讀取文件的時候是逐行讀取的。如果你試圖返回前面的行,你必須從開始再重新讀取,直到特定的行。
你不能打開一個文件同時用來讀和寫。如果你打開一個文件是爲了讀的,那麼你想修改文件內容的時候,你必須重新打開文件。如果你嘗試在寫的模式下讀取文件,那麼你會收到一個的錯誤。
還有讀取特定的字符然後停止也是我們常用的技巧:
讀取第一行的前 12 個字符並且將它賦值給變量 strText
strText = objTextFile.Read(12)
讀取一行並且將它賦值給變量strText
strText = objTextFile.ReadLine
跳過前面的 12 字節 從第 13 個字符開始
objTextFile.Skip(12)
先讀第一行,然後讀取第三行。跳過了第二行
strText = objTextFile.Readline
objTextFile.SkipLine
strText = objTextFile.Readline
跳過3行
For i=1 to 3
objTextFile.ReadLine
Next
正如前面提到的,FSO 只能從文本文件的前面讀到後面,你不能從後面向前面讀。這個對於日誌文件來說有一些問題,大部分的日誌文件是按照日期格式來寫的,它的最開始的第一個日誌被紀錄在第一行,第二個紀錄紀錄在第二行,依次類推。這就以爲着你感興趣的事情,最新的日誌往往在文件末尾。
有的時候你希望按照反日期的順序來顯示信息,就是最近的紀錄最先顯示,最舊的紀錄最後顯示。雖然你不能從後面先前的讀取文本文件,但是你要可以實現上面的目的,腳本必須:
1. 創建一個數組來存儲文本文件的每行信息
2. 用 ReadLine 的方法讀取文本文件的每行信息,然後將每行的信息作爲數組的一個獨立的元 素存儲在數組中。
3. 在屏幕上顯示數組的信息,從數組的最後面開始,向前顯示。
例如,下面的腳本讀取文件 c:\windows\xxwl.ini的信息,然後將每行的信息作爲數組
的一個元素存儲在數組 arrFileLine 中。在整個文件被讀了之後,從數組的最後一個開始回顯數組的信息。爲了做到這點,用了一個 for循環,從數組的最後一個元素, 逐漸增長到第一個元素,
Dim arrFileLines()
i = 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", 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
如果文件的內容和下面的一樣:
1ddd
2ccc
3bbb
4aaa
那麼在屏幕上回顯的信息如下:
4aaa
3bbb
2ccc
1ddd
在一些定寬的文本文件中,區域是受長度的限制的。第一個 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 方法,你可以獲得文本文件中你選擇的特定字符。
例如,下面腳本是讀取每行的第 6 個字節。爲了做到這點,腳本必須:
1. 跳過每行前面五個字節用 Skip(5)
2. 用 Read(1)讀取第 6 個字節
3. 跳到下面一行。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\windows\xxwl.ini", 1)
Do Until objFile.AtEndOfStream
objFile.Skip(5)
strCharacters = objFile.Read(1)
Wscript.Echo strCharacters
objFile.SkipLine
Loop
爲了更好說明腳本是如何工作的,我們假設腳本文件 c:\windows\xxwl.ini 看起來是如下的樣子的:
xxxxxxxaXXXXXXXXXXXXXX
XXXXXbXXXXXXXXXXXXXXXXXXX
XXXXXcXXXXXXXXXXXXx
XXXXXdXXXXXXXXXXXXXXXXXXXXXXXXX
對於這個文件的每行,前面的五個字符都是 x,第六個是數字,後面是隨機數量的 x。當腳本 運行的時候,腳本會:
1. 打開文本文件從第一行開始讀起。
2. 跳過前面五個字符。
3. 用 Read 載方法讀取第六個字符
4. 回顯字符在屏幕上
5. 跳到下面一行重複上面的進程,直到腳本運行結束。.
OpenTextFile 方法
打開指定的文件並返回一個 TextStream 對象,可以通過這個對象對文件進行讀、寫或追加。
object.OpenTextFile(filename[, iomode[, create[, format]]])
參數
object
必選項。 object 應爲 FileSystemObject 的名稱。
filename
必選項。 指明要打開文件的字符串表達式。
iomode
可選項。 可以是三個常數之一: ForReading 、 ForWriting 或 ForAppending 。
create
可選項。 Boolean 值,指明當指定的 filename 不存在時是否創建新文件。 如果創建新文件則值爲 True ,如果不創建則爲 False 。 如果忽略,則不創建新文件。
format
可選項。 使用三態值中的一個來指明打開文件的格式。 如果忽略,那麼文件將以 ASCII 格式打開。
設置
iomode 參數可以是下列設置中的任一種:
常數 值 描述
ForReading 1 以只讀方式打開文件。 不能寫這個文件。
ForWriting 2 以寫方式打開文件
ForAppending 8 打開文件並從文件末尾開始寫。
format 參數可以是下列設置中的任一種:
值 描述
TristateTrue 以 Unicode 格式打開文件。
TristateFalse 以 ASCII 格式打開文件。
TristateUseDefault 使用系統默認值打開文件。
說明
下面的代碼說明了如何使用 OpenTextFile 方法打開文件並追加文本:
var fs, a, ForAppending;
ForAppending = 8;
fs = new ActiveXObject("Scripting.FileSystemObject");
//可以是三個常數之一: ForReading 、 ForWriting 或 ForAppending
//分別是 1 ,2 ,3
a = fs.OpenTextFile("c:\\testfile.txt", 1, false);
...
a.Close();