Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOutputFile = objFSO.CreateTextFile("output.txt")
Set objTextFile = objFSO.OpenTextFile("c:\logs\file1.log", ForReading)
strText = objTextFile.ReadAll
objTextFile.Close
objOutputFile.WriteLine strText
Set objTextFile = objFSO.OpenTextFile("c:\logs\file2.log ", ForReading)
strText = objTextFile.ReadAll
objTextFile.Close
objOutputFile.WriteLine strText
objOutputFile.Close
想必您也發現了,這實在不是很科學的辦法。我們首先定義了一個用來開啟每個記錄檔的常數 (ForReading)。接著,我們建立了 FileSystemObject 的執行個體 (用來操控文字檔的指令碼技術),並且利用 CreateTextFile 方法來建立一個名叫 Output.txt 的新檔案。
然後我們開啟第一個檔案 (C:\Logs\File1.log) 進行讀取。我們利用 ReadAll 方法讀入整個文字檔,並將這項資訊儲存在變數 strText 中。關閉 File1.log,再利用 WriteLine 方法將剛讀入的資訊附加到新檔案 Output.txt。完成之後,再對下一個檔案 (C:\Logs\File2.log) 重複這個處理程序。當我們讀入第二個檔案之後,Output.txt 便會包含第一個檔案中的所有資訊「再加上」第二個檔案中的所有資訊。嘿,我們辦到了!
好吧!我知道您想說什麼:沒錯,上面的指令碼可以行得通,但是您必須事先知道資料夾 C:\Logs 中所有檔案的名稱。如果能讓指令碼自己去擷取 C:\Logs 中的所有檔案,然後再把它們結合起來,不是更理想嗎?嗯...我們從來沒想到這一點!您是說像下面這樣嗎:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOutputFile = objFSO.CreateTextFile("output.txt")
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _
& "ResultClass = CIM_DataFile")
For Each objFile In FileList
Set objTextFile = objFSO.OpenTextFile(objFile.Name, ForReading)
strText = objTextFile.ReadAll
objTextFile.Close
objOutputFile.WriteLine strText
Next
objOutputFile.Close
我們在這裡實際上做的,只不過是擷取 C:\Logs 資料夾中所有檔案的集合;也就是 WMI 查詢的 Associators 所做的:
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _
& "ResultClass = CIM_DataFile")
取得這個集合之後,我們用一個 For-Each 迴圈開啟每一個檔案,然後再讀入文字 (使用 ReadAll 方法,就像前面的做法一樣)。接著關閉檔案,並且將文字附加到我們的輸出檔。然後再回到迴圈的開頭,對集合中的下一個檔案重複這個處理程序。您看,不費吹灰之力,我們就擷取到 C:\Logs 中所有檔案的文字,並且將它們結合成名叫 output.txt 的新檔案。就是那麼簡單! |