用vbs計(jì)算某個(gè)詞在日志文件中的出現(xiàn)次數(shù)
更新時(shí)間:2007年03月26日 00:00:00 作者:
問(wèn):
您好,腳本專家!如何計(jì)算 Failure 一詞在日志文件中的出現(xiàn)次數(shù)?這里有個(gè)問(wèn)題:由于日志文件一個(gè)接一個(gè)地寫(xiě)入事件,因而創(chuàng)建了一個(gè)非常之長(zhǎng)的文本行。
-- FS
答:
您好,F(xiàn)S。根據(jù)您電子郵件的其余部分來(lái)看,您的日志文件與下面的有些相似:
Failure 2/7/2006 8:25 AM Failure 2/7/2006 9:45 AM Success
2/7/2006 3:10 PM Failure 2/8/2006 9:15 AM Success 2/7/2006 3:01 PM
正如您提到的,您首先想到的是使用 InStr 函數(shù)來(lái)查看是否 Failure 出現(xiàn)在日志文件中每行的某個(gè)地方;然后您可以通過(guò)活動(dòng)計(jì)數(shù)器計(jì)算找到該詞的次數(shù),這與我們?cè)谧蛱斓膶谥醒菔镜姆椒ǚ浅O嗨?。這是個(gè)好主意,但是,正如您所發(fā)現(xiàn)的,在該方案中有一個(gè)重大的缺陷:從技術(shù)角度來(lái)說(shuō),您的日志文件僅包含一行。因此,盡管實(shí)際存在很多實(shí)例,但您的腳本總是報(bào)告只發(fā)現(xiàn) Failure 的一個(gè)實(shí)例。您在郵件中寫(xiě)道:但是我被難住了,因?yàn)闊o(wú)法將單行拆為多行。
唉,您對(duì)我們一點(diǎn)信心都沒(méi)有。試試這個(gè)看看是不是合適:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\scripts\test.log", ForReading)
strContents = objFile.ReadAll
objFile.Close
i = 0
arrLines = Split(strContents, " ")
For Each strLine in arrLines
If InStr(strLine, "Failure") Then
i = i + 1
End If
Next
Wscript.Echo "Number of failures: " & i
當(dāng)然,我們還有其他一些方法也能夠解決此問(wèn)題。我們采用此方法,因?yàn)樗耆呛夏畛醯南敕?,而且我們認(rèn)為它對(duì)于每個(gè)人來(lái)說(shuō)都非常容易理解。我們提到這一點(diǎn)只是為了防止有人讀到此處時(shí)想,“嘿,我可不會(huì)這么解決這個(gè)問(wèn)題?!睕](méi)問(wèn)題:這不是唯一的答案。它只是答案的一種。
好了,那么腳本本身呢?嗯,我們首先定義了一個(gè)名為 ForReading 的常量;我們會(huì)在稍后打開(kāi)日志文件時(shí)使用此常量。接下來(lái)我們創(chuàng)建 Scripting.FileSystemObject 的實(shí)例并使用 OpenTextFile 方法打開(kāi)文件 C:\Scripts\Test.log。文件打開(kāi)后,我們使用 ReadAll 方法以將此文件的全部?jī)?nèi)容讀取到變量 strContents 中,然后關(guān)閉 Test.log 文件。
您清楚了嗎?接下來(lái)我們將值 0 賦于名為 i 的計(jì)數(shù)器變量;我們將使用 i 作為活動(dòng)計(jì)數(shù)器來(lái)計(jì)算我們遇到 Failure 一詞的每個(gè)實(shí)例。然后我們使用下面這行代碼:
arrLines = Split(strContents, " ")
還記得您說(shuō)過(guò)的,您被難住,因?yàn)槿罩疚募麄€(gè)是非常之長(zhǎng)的一行嗎?嗯,我們?cè)谶@里主要是將您的日志文件(或至少在變量 strContents 中存儲(chǔ)的那個(gè)版本)分成一組較短的行。在您的日志文件中,單個(gè)詞語(yǔ)以空格分開(kāi)。在這行代碼中,我們使用 Split 函數(shù)將 strContents 的值“拆分”為數(shù)組;通過(guò)對(duì)空格拆分(即,通過(guò)每次遇到空格便在數(shù)組中創(chuàng)建新項(xiàng))我們得到一個(gè)數(shù)組,其開(kāi)頭如下:
Failure
2/7/2006
8:25
AM
Failure
2/7/2006
9:45
AM
Success
當(dāng)然,它看起來(lái)很好笑,但是現(xiàn)在我們可以建立一個(gè) For Each 循環(huán)來(lái)遍歷數(shù)組中的每項(xiàng);更重要的是,我們還可以使用 InStr 方法查看是否可在這些行的任意行中找到 Failure 一詞。如果可以,我們將增加計(jì)數(shù)器變量 i 的值。所有這些均由下面這段代碼執(zhí)行:
For Each strLine in arrLines
If InStr(strLine, "Failure") Then
i = i + 1
End If
Next
在我們遍歷 For Each 循環(huán)后,我們所要做的只是回顯 failure,然后就完成了。
現(xiàn)在,檢查:我們所要做的只是回顯在日志文件中找到的 failure 數(shù)量。您的腳本可能在完成回顯所有 failure 之前超時(shí)很長(zhǎng)時(shí)間。(但我們?nèi)哉J(rèn)為與名人共同編寫(xiě)腳本要比觀看與名人共舞或滑冰更有意思。)
您好,腳本專家!如何計(jì)算 Failure 一詞在日志文件中的出現(xiàn)次數(shù)?這里有個(gè)問(wèn)題:由于日志文件一個(gè)接一個(gè)地寫(xiě)入事件,因而創(chuàng)建了一個(gè)非常之長(zhǎng)的文本行。
-- FS
答:
您好,F(xiàn)S。根據(jù)您電子郵件的其余部分來(lái)看,您的日志文件與下面的有些相似:
Failure 2/7/2006 8:25 AM Failure 2/7/2006 9:45 AM Success
2/7/2006 3:10 PM Failure 2/8/2006 9:15 AM Success 2/7/2006 3:01 PM
正如您提到的,您首先想到的是使用 InStr 函數(shù)來(lái)查看是否 Failure 出現(xiàn)在日志文件中每行的某個(gè)地方;然后您可以通過(guò)活動(dòng)計(jì)數(shù)器計(jì)算找到該詞的次數(shù),這與我們?cè)谧蛱斓膶谥醒菔镜姆椒ǚ浅O嗨?。這是個(gè)好主意,但是,正如您所發(fā)現(xiàn)的,在該方案中有一個(gè)重大的缺陷:從技術(shù)角度來(lái)說(shuō),您的日志文件僅包含一行。因此,盡管實(shí)際存在很多實(shí)例,但您的腳本總是報(bào)告只發(fā)現(xiàn) Failure 的一個(gè)實(shí)例。您在郵件中寫(xiě)道:但是我被難住了,因?yàn)闊o(wú)法將單行拆為多行。
唉,您對(duì)我們一點(diǎn)信心都沒(méi)有。試試這個(gè)看看是不是合適:
復(fù)制代碼 代碼如下:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("c:\scripts\test.log", ForReading)
strContents = objFile.ReadAll
objFile.Close
i = 0
arrLines = Split(strContents, " ")
For Each strLine in arrLines
If InStr(strLine, "Failure") Then
i = i + 1
End If
Next
Wscript.Echo "Number of failures: " & i
好了,那么腳本本身呢?嗯,我們首先定義了一個(gè)名為 ForReading 的常量;我們會(huì)在稍后打開(kāi)日志文件時(shí)使用此常量。接下來(lái)我們創(chuàng)建 Scripting.FileSystemObject 的實(shí)例并使用 OpenTextFile 方法打開(kāi)文件 C:\Scripts\Test.log。文件打開(kāi)后,我們使用 ReadAll 方法以將此文件的全部?jī)?nèi)容讀取到變量 strContents 中,然后關(guān)閉 Test.log 文件。
您清楚了嗎?接下來(lái)我們將值 0 賦于名為 i 的計(jì)數(shù)器變量;我們將使用 i 作為活動(dòng)計(jì)數(shù)器來(lái)計(jì)算我們遇到 Failure 一詞的每個(gè)實(shí)例。然后我們使用下面這行代碼:
arrLines = Split(strContents, " ")
還記得您說(shuō)過(guò)的,您被難住,因?yàn)槿罩疚募麄€(gè)是非常之長(zhǎng)的一行嗎?嗯,我們?cè)谶@里主要是將您的日志文件(或至少在變量 strContents 中存儲(chǔ)的那個(gè)版本)分成一組較短的行。在您的日志文件中,單個(gè)詞語(yǔ)以空格分開(kāi)。在這行代碼中,我們使用 Split 函數(shù)將 strContents 的值“拆分”為數(shù)組;通過(guò)對(duì)空格拆分(即,通過(guò)每次遇到空格便在數(shù)組中創(chuàng)建新項(xiàng))我們得到一個(gè)數(shù)組,其開(kāi)頭如下:
Failure
2/7/2006
8:25
AM
Failure
2/7/2006
9:45
AM
Success
當(dāng)然,它看起來(lái)很好笑,但是現(xiàn)在我們可以建立一個(gè) For Each 循環(huán)來(lái)遍歷數(shù)組中的每項(xiàng);更重要的是,我們還可以使用 InStr 方法查看是否可在這些行的任意行中找到 Failure 一詞。如果可以,我們將增加計(jì)數(shù)器變量 i 的值。所有這些均由下面這段代碼執(zhí)行:
For Each strLine in arrLines
If InStr(strLine, "Failure") Then
i = i + 1
End If
Next
在我們遍歷 For Each 循環(huán)后,我們所要做的只是回顯 failure,然后就完成了。
現(xiàn)在,檢查:我們所要做的只是回顯在日志文件中找到的 failure 數(shù)量。您的腳本可能在完成回顯所有 failure 之前超時(shí)很長(zhǎng)時(shí)間。(但我們?nèi)哉J(rèn)為與名人共同編寫(xiě)腳本要比觀看與名人共舞或滑冰更有意思。)
相關(guān)文章
多進(jìn)程的實(shí)現(xiàn)投票的vbs腳本
多進(jìn)程的實(shí)現(xiàn)投票的vbs腳本...2007-02-02
VBScript編寫(xiě)Windows防止鎖屏腳本程序
這篇文章主要為大家介紹了VBScript編寫(xiě)Windows防止鎖屏腳本程序示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2022-05-05
用vbs實(shí)現(xiàn)隨機(jī)讀取文件的一行內(nèi)容的腳本
用vbs實(shí)現(xiàn)隨機(jī)讀取文件的一行內(nèi)容的腳本...2007-10-10
修復(fù)Windows上面的WScript的腳本(.vbs)不能執(zhí)行了
修復(fù)Windows上面的WScript的腳本(.vbs)不能執(zhí)行了...2007-03-03
把任意文件轉(zhuǎn)成vbs文件的file2vbs的vbs代碼
文章作者:xiaolu [BST] 信息來(lái)源:邪惡八進(jìn)制信息安全團(tuán)隊(duì)(www.eviloctal.com) 這個(gè)不是exe2vbs 所有類型的文件都可以轉(zhuǎn)化的 不過(guò)限于string的大小 文件不能太大 我測(cè)試過(guò)3m的文件是可以的2008-05-05

