用vbscript合并多個(gè)文本文件的代碼
更新時(shí)間:2007年04月02日 00:00:00 作者:
問(wèn):
嗨,Scripting Guy!在命令提示符中,可以執(zhí)行命令“copy a.txt+b.txt ab.txt”來(lái)提取 a.txt 和 b.txt 的內(nèi)容,然后將它們合并到名為 ab.txt 的新文件中。可以使用腳本來(lái)實(shí)現(xiàn)相同的操作嗎?
-- DL
答:
嗨,DL。在昨天的專欄文章中,我們探討了有關(guān)文本文件的問(wèn)題;更具體地講,我們討論如何使用腳本來(lái)修改 .INI 文件。我們提到,這種解決方法盡管不是很巧妙,但可以達(dá)到目的。就今天的問(wèn)題來(lái)說(shuō),同樣是這種情況。我們可以使用腳本來(lái)合并文本文件嗎?是的,可以。只不過(guò)有一點(diǎn)繁瑣,但效果很好。
我們所遇到的難題是,WSH 和 VBScript 都無(wú)法通過(guò)一條命令來(lái)合并文本文件,例如,objFile.AddTextFiles("file1.log","file2.log")。這有點(diǎn)讓人失望,但我們不會(huì)就此罷手,我們依然可以合并文本文件;只不過(guò)需要多執(zhí)行幾個(gè)步驟罷了。例如,要將 File1.log 和 File2.log 合并為一個(gè)文件(我們將其命名為 Output.txt),需要先讀取 File1.log,將該文件的內(nèi)容附加到 output.txt 末尾,然后讀取 File2.log,再將該 文件的內(nèi)容附加到 Output.txt 末尾。事實(shí)上,我們必須使用類似下面的腳本:
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
正如您所看到的一樣,該腳本并不是特別復(fù)雜。首先,我們定義一個(gè)常量 (ForReading),用于打開每個(gè)日志文件。接下來(lái),創(chuàng)建一個(gè) FileSystemObject(用于處理文本文件的腳本技術(shù))實(shí)例,并使用 CreateTextFile 方法創(chuàng)建一個(gè)名為 Output.txt 的新文件。
然后,打開第一個(gè)文件 (C:\Logs\File1.log) 來(lái)讀取其中的內(nèi)容。我們使用 ReadAll 方法讀入整個(gè)文本文件,并將該信息存儲(chǔ)在變量 strText 中。然后,關(guān)閉 File1.log,并使用 WriteLine 方法將剛讀入的信息附加到新文件 Output.txt 的末尾。接下來(lái),對(duì)下一個(gè)文件 (C:\Logs\File2.log) 執(zhí)行相同的過(guò)程。讀入第二個(gè)文件后,Output.txt 將包含第一個(gè)文件以及 第二個(gè)文件中的所有信息。哈哈,我們成功了!
我們知道您在想什么:不錯(cuò),盡管上述腳本可以實(shí)現(xiàn)目的,但問(wèn)題是您必須“事先”知道文件夾 C:\Logs 中所有文件的名稱。那么,編寫一個(gè)腳本以獲取 C:\Logs 中的所有文件并將它們合并在一起,豈不是更好?嗯,我們還未曾這樣想過(guò)。您所說(shuō)的是不是類似下面的腳本:
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
實(shí)際上,我們?cè)诖颂巿?zhí)行的全部操作是獲取 C:\Logs 文件夾中所有文件的集合;這是通過(guò)以下 WMI Associators of 查詢實(shí)現(xiàn)的:
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _
& "ResultClass = CIM_DataFile")
在獲取這一集合后,我們可以立即使用 For-Each 循環(huán)打開每個(gè)文件并讀入其中的文本(使用 ReadAll 方法,與上文中的代碼相同)。然后關(guān)閉該文件,將文本附加到輸出文件的末尾。接下來(lái)再執(zhí)行一次循環(huán),對(duì)集合中的下一個(gè)文件執(zhí)行相同的過(guò)程。只需片刻,就可以將 C:\Logs 中所有文件的所有文本提取出來(lái),并將它們合并為一個(gè)名為 output.txt 的新文件。整個(gè)過(guò)程就是這么簡(jiǎn)單。
嗨,Scripting Guy!在命令提示符中,可以執(zhí)行命令“copy a.txt+b.txt ab.txt”來(lái)提取 a.txt 和 b.txt 的內(nèi)容,然后將它們合并到名為 ab.txt 的新文件中。可以使用腳本來(lái)實(shí)現(xiàn)相同的操作嗎?
-- DL
答:
嗨,DL。在昨天的專欄文章中,我們探討了有關(guān)文本文件的問(wèn)題;更具體地講,我們討論如何使用腳本來(lái)修改 .INI 文件。我們提到,這種解決方法盡管不是很巧妙,但可以達(dá)到目的。就今天的問(wèn)題來(lái)說(shuō),同樣是這種情況。我們可以使用腳本來(lái)合并文本文件嗎?是的,可以。只不過(guò)有一點(diǎn)繁瑣,但效果很好。
我們所遇到的難題是,WSH 和 VBScript 都無(wú)法通過(guò)一條命令來(lái)合并文本文件,例如,objFile.AddTextFiles("file1.log","file2.log")。這有點(diǎn)讓人失望,但我們不會(huì)就此罷手,我們依然可以合并文本文件;只不過(guò)需要多執(zhí)行幾個(gè)步驟罷了。例如,要將 File1.log 和 File2.log 合并為一個(gè)文件(我們將其命名為 Output.txt),需要先讀取 File1.log,將該文件的內(nèi)容附加到 output.txt 末尾,然后讀取 File2.log,再將該 文件的內(nèi)容附加到 Output.txt 末尾。事實(shí)上,我們必須使用類似下面的腳本:
復(fù)制代碼 代碼如下:
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
正如您所看到的一樣,該腳本并不是特別復(fù)雜。首先,我們定義一個(gè)常量 (ForReading),用于打開每個(gè)日志文件。接下來(lái),創(chuàng)建一個(gè) FileSystemObject(用于處理文本文件的腳本技術(shù))實(shí)例,并使用 CreateTextFile 方法創(chuàng)建一個(gè)名為 Output.txt 的新文件。
然后,打開第一個(gè)文件 (C:\Logs\File1.log) 來(lái)讀取其中的內(nèi)容。我們使用 ReadAll 方法讀入整個(gè)文本文件,并將該信息存儲(chǔ)在變量 strText 中。然后,關(guān)閉 File1.log,并使用 WriteLine 方法將剛讀入的信息附加到新文件 Output.txt 的末尾。接下來(lái),對(duì)下一個(gè)文件 (C:\Logs\File2.log) 執(zhí)行相同的過(guò)程。讀入第二個(gè)文件后,Output.txt 將包含第一個(gè)文件以及 第二個(gè)文件中的所有信息。哈哈,我們成功了!
我們知道您在想什么:不錯(cuò),盡管上述腳本可以實(shí)現(xiàn)目的,但問(wèn)題是您必須“事先”知道文件夾 C:\Logs 中所有文件的名稱。那么,編寫一個(gè)腳本以獲取 C:\Logs 中的所有文件并將它們合并在一起,豈不是更好?嗯,我們還未曾這樣想過(guò)。您所說(shuō)的是不是類似下面的腳本:
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
實(shí)際上,我們?cè)诖颂巿?zhí)行的全部操作是獲取 C:\Logs 文件夾中所有文件的集合;這是通過(guò)以下 WMI Associators of 查詢實(shí)現(xiàn)的:
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Logs'} Where " _
& "ResultClass = CIM_DataFile")
在獲取這一集合后,我們可以立即使用 For-Each 循環(huán)打開每個(gè)文件并讀入其中的文本(使用 ReadAll 方法,與上文中的代碼相同)。然后關(guān)閉該文件,將文本附加到輸出文件的末尾。接下來(lái)再執(zhí)行一次循環(huán),對(duì)集合中的下一個(gè)文件執(zhí)行相同的過(guò)程。只需片刻,就可以將 C:\Logs 中所有文件的所有文本提取出來(lái),并將它們合并為一個(gè)名為 output.txt 的新文件。整個(gè)過(guò)程就是這么簡(jiǎn)單。
您可能感興趣的文章:
相關(guān)文章
用VBScript實(shí)現(xiàn)壓縮目錄中的所有文件(Zip)
下面的腳本主要是將制定目錄中得文件,單個(gè)壓縮為zip格式的文件,需要的朋友可以參考下2012-01-01vbs 錯(cuò)誤捕獲器,用于捕獲內(nèi)部錯(cuò)誤并進(jìn)行手工處理
vbs中的錯(cuò)誤捕獲器,用于捕獲內(nèi)部錯(cuò)誤并進(jìn)行手工處理2009-08-08VBS教程:VBscript語(yǔ)句-If...Then...Else 語(yǔ)句
If...Then...Else 語(yǔ)句用于計(jì)算條件是否為 True 或 False,并且根據(jù)計(jì)算結(jié)果指定要運(yùn)行的語(yǔ)句。通常,條件是使用比較運(yùn)算符對(duì)值或變量進(jìn)行比較的表達(dá)式。If...Then...Else 語(yǔ)句可以按照需要進(jìn)行嵌套2006-11-11VBS 十六進(jìn)制異或加密實(shí)現(xiàn)代碼
文件不要過(guò)大,最好不要超過(guò) 100 KB,密鑰不要用數(shù)字,不想改了。理論上支持任何二進(jìn)制文件格式2013-07-07關(guān)于腳本調(diào)用外部對(duì)像和類型庫(kù)
主要是用于flash網(wǎng)頁(yè)木馬調(diào)用方法,是flash的一個(gè)bug吧,大家以后要小心了2008-06-06