嗨,Scripting Guy!

Hey,Scripting Guy!

歡迎使用全新的 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:可不可以用指令碼結合多個文字檔?


可不可以用指令碼結合多個文字檔?

嗨,Scripting Guy!從命令提示字元輸入命令 copy a.txt+b.txt ab.txt 會將 a.txt 的內容和 b.txt 的內容結合成一個名為 ab.txt 的新檔案。請問可不可以用指令碼做同樣的事情?

-- DL

DL,您好。我們在昨天的專欄裡談到一些處理文字檔的問題;更具體的講,我們討論了如何用指令碼來修改 .INI 檔案。我們當時說過,這並不是最好的辦法,但是它的確可以完成這項工作。沒錯,在這裡也是同樣的情況。我們可以用指令碼來結合文字檔嗎?是的,這是可行的。用這種方式可能會有點累贅,不過結果應該是沒問題的。

我們面臨的問題是,不論是 WSH 或是 VBScript 都沒有辦法用一個單一命令 (例如 objFile.AddTextFiles(“file1.log”,”file2.log”)) 來結合文字檔。這一點的確很遺憾,不過這並不會影響我們結合文字檔;只要多經歷幾個額外的步驟,還是可以達到同樣的效果。例如,假設我們要將 File1.log 和 File2.log 結合成一個單一檔案 (此檔案會被命名為 Output.txt),首先我們必須讀取 File1.log,將它的內容附加到 output.txt;然後再讀取 File2.log,再將「它」的內容附加到 Output.txt。事實上我們所用的指令碼大概會像下面這樣:

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 的新檔案。就是那麼簡單!


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首