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

所属分类: 脚本专栏 / vbs 阅读数: 622
收藏 0 赞 0 分享
问:
您好,脚本专家!如何仅读取文本文件的最后一行?
-- 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 
羡慕吧,知心姐姐!
更多精彩内容其他人还在看

VBS实现截图功能

本文给大家分享了下2种通过VBS实现截图功能的代码,第一个是纯VBS实现,第二种方法是通过把简短的第三方工具集合到VBS脚本来实现更加丰富的功能。
收藏 0 赞 0 分享

VBS中Run和Exec的区别

这篇文章主要介绍了VBS中Run和Exec的区别,需要的朋友可以参考下
收藏 0 赞 0 分享

VBS获取GZIP压缩的HTTP内容的实现代码

这篇文章主要介绍了VBS获取GZIP压缩的HTTP内容的实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享

VC中实现文字竖排的简单方法(推荐)

下面小编就为大家带来一篇VC中实现文字竖排的简单方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

对一个vbs脚本病毒的病毒原理分析

这篇文章主要介绍了对一个vbs脚本病毒的病毒原理分析的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

vbs判断磁盘类型和检测硬盘剩余空间的实现代码

这篇文章主要介绍了vbs判断磁盘类型和检测硬盘剩余空间的实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享

VBS调用WMI遍历搜索硬盘文件并计数的方法

这篇文章主要介绍了VBS调用WMI遍历搜索硬盘文件并计数的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

vbs 查找硬盘分区中指定扩展名文件的实现代码

vbs 用于查找硬盘所有分区中指定扩展名文件的代码,有需要的朋友可以参考下。挺实用的一段代码,用来深入学习vbs,确实不错
收藏 0 赞 0 分享

vbs Size 属性使用介绍(获取文件大小)

为大家介绍vbs属性之size属性,供大家学习参考。Size 属性 对于文件,返回指定文件的字节数;对于文件夹,返回该文件夹中所有文件和子文件夹的字节数
收藏 0 赞 0 分享

vbs获取当前路径的代码

有时候我们需要获取执行当前vbs的路径,那么就可以参考下面的代码,一般用来可以删除自身等操作
收藏 0 赞 0 分享
查看更多