您好,TH。如果您曾经去过嘉年华会,那么毫无疑问您曾被一些杂耍游戏所吸引。扔出棒球击倒几个牛奶罐?将一枚一角硬币投入玻璃碗?用飞镖刺破气球,看在上帝的份上?!?那能有多难?
然而,如果您从未去过嘉年华会,给您一句忠告:实际上,那些东西比看上去要难得多。原因就在于某些事听起来似乎应该很容易,但这并不意味实际上会容易。您会惊讶于将一个橡皮圈扔到玻璃瓶上有多难和多昂贵。
|
注意。如果您心意已决,一定要去试试这些游戏,在此处 可以找到一些有益的提示。全方位的脚本专家客户服务! |
我们提到这些是因为您的问题可以作为理想的嘉年华游戏。毕竟,它听起来再简单不过:您只需打开文本文件,跳到最后一行并进行更改。那能有多难?然而,由于 FileSystemObject(用于读写文本文件的脚本编写技术)的限制,实际上要难的多。这并不意味着无法做到;只是乍一看时,脚本要比预想的稍微复杂一些。您知道,有备无患。
换句话说,脚本将如下所示:
Const ForReading = 1
Const ForWriting = 2
Dim arrFileLines()
i = 0
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:/Scripts/Test.txt", ForReading)
Do Until objFile.AtEndOfStream
Redim Preserve arrFileLines(i)
arrFileLines(i) = objFile.ReadLine
i = i + 1
Loop
objFile.Close
intLastLine = Ubound(arrFileLines)
intNumber = arrFileLines(intlastLine)
intNumber = intNumber + 1
Set objFile = objFSO.OpenTextFile("c:/scripts/test.txt", ForWriting)
For i = 0 to Ubound(arrFileLines) - 1
objFile.WriteLine arrFileLines(i)
Next
objFile.WriteLine intNumber
objFile.Close
在我们解释脚本如何运行前,假定您有一个类似如下的文本文件:
A
B
C
D
E
31
当然,它可能与以上所示的不完全一样,但关键是有几行文本(而且,您很可能并不确定有多少行文本),后面跟有备份号。下次运行脚本时,您希望文本文件应如下所示:
A
B
C
D
E
32
换句话说,除从 31 增加到 32 的备份号外所有内容都相同。面对 FileSystemObject 的限制(必须打开一个文件进行读取或写入,但不能同时进行读写;无法直接跳至文件最后一行等),我们该如何去做呢?
好吧,我们先创建一对常量:ForReading 和 ForWriting。稍后,我们会在脚本中用它们在适当模式下打开文本文件。(正如我们刚才说过的,您必须打开一个文本文件进行读取或写入;不能同时执行两项操作。)然后定义一个名为 arrFileLines 的数组变量;我们将使用此变量存储文本文件的现有内容。为什么会是这样?我们将稍后解释。
打开文件 C:/Scripts/Test.txt 后,我们使用以下代码块逐行读取文件,并将各行存储为数组 arrFileLines 中的项目:
Do Until objFile.AtEndOfStream
Redim Preserve arrFileLines(i)
arrFileLines(i) = objFile.ReadLine
i = i + 1
Loop
我们这样做有两个原因。首先,我们要能访问并更改文件中的最后一行。FileSystemObject 没有可以让我们直接跳至文件中的最后一行的方法;然而,通过将各行存储在数组中,我们能使 VBScript 访问数组的最后一项(也是文件中的最后一行)。此外,FileSystemObject 不允许我们更改文本文件中的一行;我们必须改为用新文件替换 Test.txt 中的现有内容。此新文件将包括 Test.txt 中的前 x 行(未更改)以及新修改的最后一行。通过将现有内容存储在数组中,我们可以很容易地重新调用文件中除最后一行外的所有行。
可能现在还不是很明确,但我们实际更新文件后就会较为清楚了。是的,还有其他一些方法也可以做到这一点,但这种方法(无论您相信与否)似乎是最简单、最直接的方法。
读取文件后我们立刻将其关闭,然后使用下面三行代码计算当前备份号并将其加 1:
intLastLine = Ubound(arrFileLines)
intNumber = arrFileLines(intlastLine)
intNumber = intNumber + 1
我们的任务就是用 Ubound 函数确定数组中最后一项的索引号。(数组中的项分配有索引号:数组中的第一项为项目 0,数组中的第二项为项目 1,以此类推。)知道最后一项的索引号后(本例中索引号为 5,因为我们的数组中有 6 项或者说有 6 行)我们就可以将最后一项的值分配给变量 intNumber。具体如下:
intNumber = arrFileLines(intlastLine)
数组中最后一项的值为 31;这是因为我们文本文件中的最后一行为 31。然后,我们使用下行代码将现有的值加 1(在本例中,将 31 加 1):
intNumber = intNumber + 1
明白了吗?到目前为止我们所做的就是将备份号从 31 加到 32。但这的确就是我们需要做的全部工作:现在我们可以重新打开文件 C:/Scripts/Test.txt 并用修改后的内容替换当前内容。为此,我们使用以下代码块将除最后一行外的所有现有行写入文件:
For i = 0 to Ubound(arrFileLines) - 1
objFile.WriteLine arrFileLines(i)
Next
换句话说,我们将把下列行写入文本文件:
A
B
C
D
E
为什么我们不写入最后一行呢?请记住,在我们的数组中最后一行为:
31
我们要将新增加的值 (32) 作为文件中新的最后一行。因此,我们使用下行代码将值 32(表示当前备份号)加到文本文件末尾:
objFile.WriteLine intNumber
然后关闭文件,大功告成。现在,正如我们所期望的那样,文本文件如下所示:
A
B
C
D
E
32
当然,有点不公平的是您可以因为把硬币投入碗中得到一只玩具熊,但是您可能无法因为在文本文件中增加最后一行的值而得到一只玩具熊。生活有时非常残酷,不是吗?