当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 用vbs读取文本文件的最后一行

VBScript
用vbs脚本来关闭 HTML 页面的代码
用vbs实现确定是否安装了某个特定的补丁
用vbs确定用户的登录名的代码
用vbs找到映射到共享的所有驱动器并重新映射它们
可以从一台远程服务器运行 SP2 安装程序Install.vbs
用vbs判断一个日期是否在指定的时段内
vbs+hta中实现在单个 onClick 参数中包括多个子例程的代码
vbs中实现启动两个应用程序,一直等到其中一个程序结束,然后关闭另一个?
用vbs实现对文本文件中的项计数
用vbs对文本文件的内容进行排序
用vbscript把 Word 文档保存为文本文件的代码
用vbs返回 Internet Explorer 的下载控件和 Applet 的列表
用vbscript合并多个文本文件的代码
用vbscript防止本地用户更改其密码
用vbs针对一个 IP 地址范围运行脚本
用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
使用vbscript脚本在表单中进行选择的代码
一个把任何文件转成批处理的vbs脚本Any2Bat.vbs
windows脚本调试howto的方法
注册表的禁用与解锁方法集合

VBScript 中的 用vbs读取文本文件的最后一行


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

问:
您好,脚本专家!如何仅读取文本文件的最后一行?
-- BM
答:
您好,BM。如果您曾经想知道您好,脚本专家!与其它每日专栏(比如,知心姐姐)的不同之处,那么,下面是一种途径。假设有人在给知心姐姐的信中说:
知心姐姐:
我的生活一团糟,我需要采取一些措施来应对。我如何能扭转我的生活并且重新快乐起来?
绝望之人于代顿
知心姐姐绝不会给绝望之人这样的答复:
亲爱的绝望之人:
唉,您的生活不能变好了。很抱歉。
那么,您认为脚本专家会如何答复您关于读取文本文件的最后一行呢?答对了:
亲爱的 BM:
唉,您不能。很抱歉。
不过,请等一下,先不要走。的确,知心姐姐绝不会说,“您知道,Desperate,要使您快乐起来我无能为力。但是这有一个办法可以使您看起来是快乐的。”然而脚本专家却没有这样的疑虑。换句话说,我们无法为您提供仅读取文本文件最后一行的脚本。但是以下脚本可以看起来仅读取文本文件的最后一行:
复制代码 代码如下:

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
Loop
objFile.Close
Wscript.Echo strLine

我们此处遇到的问题是 FileSystemObject(用于处理文本文件的脚本对象)只知道一个方向:向前。它必须从文件开头开始,而且只能继续向文件的末尾运行。您无法指定其他起始位置且无法反向读取(即从末尾到开头)。实际上,您甚至无法重新读取文件:除非关闭然后再重新打开该文件,否则到达文件末尾后您无法重新读取该文件。这就是为什么涉及到文本文件时,教程的解决方法几乎都是一样的。
此处的解决方法是,我们实际上确实从头至尾读取整个文本文件。然而,我们只跟踪所读取的最后一行。读到文件的末尾时,我们将得到一个变量,它包含所读取的最后一行的值;它同时也是文件的最后一行。回显该变量的值时,看起来好像我们只读取了最后一行(尤其是没有其他东西要处理的时候,FileSystemObject 的速度非常快)。我们没有 - 我们实际上读取了整个文件 - 但是没有人会知道。这将是我们的小秘密。
至于代码本身,我们首先定义名为 ForReading 的常量并将其值设为 1;我们将使用该常量告诉 FileSystemObject 我们要打开待读取的文本文件。然后,我们创建 Scripting.FileSystemObject 的一个实例,并且使用 OpenTextFile 方法打开文件 C:\Scripts\Test.txt。接下来是下面这个代码块:
复制代码 代码如下:

Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
Loop

此处我们要做的只是逐行读取文件,直到文件的末尾(即读到文件流末尾)。每次读取某行时,我们用刚读取的文本替换变量 strLine 的值。例如,假设文本文件包含三行:
A
C
在我们的循环中读取行 1,因此将值 A 赋给 strLine。在下一个循环中读取第二行,这意味着将值 B 赋给 strLine。再循环一次并且将值 C 赋给 strLine。因为我们已到达文件末尾,故 strLine 保持值 C,该值恰好为文件的最后一行。然后关闭文件并回显 strLine 的值。所有人只知道我们所做的是读取 - 返回 - 文件最后一行的值。
是的,很隐秘。
不可否认,此脚本存在一个潜在的问题。假设文件末尾添加了几行空白行。脚本将忠实地返回空(空值)作为文本文件的最后一行。这就是它应该做的:毕竟,文件的最后一行是空白。但是假设这是某种类型的日志文件,出于某种原因,创建此日志的应用程序总是将空白行放到文件末尾。在这种情况下,可能您真正感兴趣的是文件中最后的非空白行。下面是修改后的脚本,它使用 Len 函数检查所读取的每行的长度。如果长度等于 0,则意味着此行为空白行,便不在变量 strLine 中存储该值:
复制代码 代码如下:

Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)
Do Until objFile.AtEndOfStream
strNextLine = objFile.ReadLine
If Len(strNextLine) > 0 Then
strLine = strNextLine
End If
Loop
objFile.Close
Wscript.Echo strLine
羡慕吧,知心姐姐!