当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 用vbs计算某个词在日志文件中的出现次数

VBScript
用vbs检索在运行对话框中键入的一系列命令的代码
编写可以打开文本文件并打乱在该文件中所找到的单词顺序的vbs脚本
在 HTA 中暂停脚本的方法
运行脚本之前,如何确定计算机上的默认脚本宿主的代码
用vbs实现删除名称中有撇号的文件夹
用vbs将输出内容写到屏幕以覆盖当前屏幕上的内容的方法
用vbs实现配置无人登录计算机时使用的屏幕保护程序
用vbs更改 Internet Explorer 的标题栏
用vbs读取文本文件的最后一行
用vbs实现重新启动 Internet Explorer
用vbs实现禁用服务
用vbs确定计算机是否有 USB 2.0 端口的代码
用vbs列出注册表中 Run 项中的所有项目
用vbs将名称截断以使其最多包含 16 个字符的代码
用vbs将本地文件替换为在文件服务器上找到的新版本
用vbs确定脚本正在哪一个帐户下运行
用vbs确定可移动驱动器的连接时间
用vbs记录屏幕保护程序的开始时间和结束时间
用vbs计算某个词在日志文件中的出现次数
vbs病毒的简单例子源代码解析

VBScript 中的 用vbs计算某个词在日志文件中的出现次数


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 42 ::
收藏到网摘: n/a

问:
您好,脚本专家!如何计算 Failure 一词在日志文件中的出现次数?这里有个问题:由于日志文件一个接一个地写入事件,因而创建了一个非常之长的文本行。
-- FS
答:
您好,FS。根据您电子邮件的其余部分来看,您的日志文件与下面的有些相似:
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 函数来查看是否 Failure 出现在日志文件中每行的某个地方;然后您可以通过活动计数器计算找到该词的次数,这与我们在昨天的专栏中演示的方法非常相似。这是个好主意,但是,正如您所发现的,在该方案中有一个重大的缺陷:从技术角度来说,您的日志文件仅包含一行。因此,尽管实际存在很多实例,但您的脚本总是报告只发现 Failure 的一个实例。您在邮件中写道:但是我被难住了,因为无法将单行拆为多行。
唉,您对我们一点信心都没有。试试这个看看是不是合适:
复制代码 代码如下:

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
当然,我们还有其他一些方法也能够解决此问题。我们采用此方法,因为它完全吻合您最初的想法,而且我们认为它对于每个人来说都非常容易理解。我们提到这一点只是为了防止有人读到此处时想,“嘿,我可不会这么解决这个问题。”没问题:这不是唯一的答案。它只是答案的一种。
好了,那么脚本本身呢?嗯,我们首先定义了一个名为 ForReading 的常量;我们会在稍后打开日志文件时使用此常量。接下来我们创建 Scripting.FileSystemObject 的实例并使用 OpenTextFile 方法打开文件 C:\Scripts\Test.log。文件打开后,我们使用 ReadAll 方法以将此文件的全部内容读取到变量 strContents 中,然后关闭 Test.log 文件。
您清楚了吗?接下来我们将值 0 赋于名为 i 的计数器变量;我们将使用 i 作为活动计数器来计算我们遇到 Failure 一词的每个实例。然后我们使用下面这行代码:
arrLines = Split(strContents, " ")
还记得您说过的,您被难住,因为日志文件整个是非常之长的一行吗?嗯,我们在这里主要是将您的日志文件(或至少在变量 strContents 中存储的那个版本)分成一组较短的行。在您的日志文件中,单个词语以空格分开。在这行代码中,我们使用 Split 函数将 strContents 的值“拆分”为数组;通过对空格拆分(即,通过每次遇到空格便在数组中创建新项)我们得到一个数组,其开头如下:
Failure
2/7/2006
8:25
AM
Failure
2/7/2006
9:45
AM
Success
当然,它看起来很好笑,但是现在我们可以建立一个 For Each 循环来遍历数组中的每项;更重要的是,我们还可以使用 InStr 方法查看是否可在这些行的任意行中找到 Failure 一词。如果可以,我们将增加计数器变量 i 的值。所有这些均由下面这段代码执行:
For Each strLine in arrLines
If InStr(strLine, "Failure") Then
i = i + 1
End If
Next
在我们遍历 For Each 循环后,我们所要做的只是回显 failure,然后就完成了。
现在,检查:我们所要做的只是回显在日志文件中找到的 failure 数量。您的脚本可能在完成回显所有 failure 之前超时很长时间。(但我们仍认为与名人共同编写脚本要比观看与名人共舞或滑冰更有意思。)