VBS读写文件以及OpenTextFile方法

文件的创建:

FSO 让你可以用现存在的文本工作,也可以让你自己创建脚本。为了创建一个新的文本文件,简单的创建一个 FSO 对象,然后调用 CreateTextFile 方法,输入完整的文件路径信息作为这个方法的参数

例如:(在c:\windows文件夹创建一个xxwl.ini文件)

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.CreateTextFile("c:\windows\xxwl.ini")  

如果这个文件不存在,那么 CreateTextFile 方法会创建一个。如果这个文件已经存在,那么CreateTextFile 方法会复写存在的文本文件,并以新的空白的文件取代它。

如果不想这个文件被取代,那么就用一个可以选择的参数 Overwrite 。当这个参数设置成 False 的时候,这个文件就不被复写。当这个参数被设置成 True(默认的是 True)时,那么就会被复写也就是清空。

例如:(在c:\windows文件夹创建一个xxwl.ini文件,如果文件存在,而又不想被复写那么就用如下代码)

Set objFile = objFSO.CreateTextFile("c:\windows\xxwl.ini", False)

如果你将参数设置成False,并且文件存在,那么就会有一个运行的错误。因为如此,你可以检查文件是否存在,如果存在,那么就作其它的操作:

例如:(需要在c:\windows文件夹创建一个xxwl.ini文件,如果这个文件存在就显示其中的内容如果不存在就创建一个)

Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("c:\windows\xxwl.ini") Then
   Set objFile = objFSO.OpenTextFile("c:\windows\xxwl.ini", 1)
txt = objFile.ReadAll
Wscript.Echo txt
Else
Set objFolder = objFSO.GetFile("c:\windows\xxwl.ini")
End If
创建临时文件的方法:

为了生成一个临时文件名,脚本首先要创建一个 FSO 对象实例然后调用 GetTempName 方法(不用参数。)

例如:(需要创建10个临时文件名)

Set objFSO = CreateObject("Scripting.FileSystemObject")

For i = 1 to 10

strTempFile = objFSO.GetTempName

 Wscript.Echo strTempFile

Next

用 GetTempName 来生成文件的名字生成的不是唯一的。部分原因是生成名称的算法,部分是因为可能的名字的数量是有限的。文件名字被限制为 8 个字节,而且前三个字节规定为rad,例如,你用脚本来创建 10000 个文件名字,在第 9894 个文件名字之后就不再是唯一的了,剩下的 106 个 53 对是重复的。

例如:(要在c:\xxwl\生成一个临时的文件)

Set objFSO = CreateObject("Scripting.FileSystemObject")

strPath = "C:\xxwl"

strFileName = objFSO.GetTempName

strFullName = objFSO.BuildPath(strPath, strFileName)

Set objFile = objFSO.CreateTextFile(strFullName)

objFile.Close

这里如果文件夹xxwl不存在就会提示错误,那么就要先检查了,检查和创建文件夹的方法会在文件夹操作中学习

像文本文件中写入数据是写系统管理脚本的另外一个强大的功用。文本文件提供了一种方法可以让你将脚本获得的输入存储在其中。输入可以替代现有的文字或者是添加到现有的文字后面。文本文文件也可以纪录脚本的执行情况。这个对于debug 脚本来说费城有用。将脚本的执行纪录放在一个文本文件中,你可以过阵子来察看这个日志去决定脚本实际执行了哪些而哪些没有执行。FSO 给你提供了向文本文件中写如数据的能力。为了用 FSO 脚本向一个文本文件中写入数据,你必须:

1. 创建一个 FSO 对象实例。

2. 用 OpenTextFile 方法打开这个文本文件,你可以以两种方法打开:

For writing (parameter value 2, constant = ForWriting).

例如:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile ("c:\windows\xxwl.ini", 2, True)

在这个模式下,写入新的数据会覆盖旧的数据。(旧的数据会被删除,新的数据添加上去。)

用这个模式,是将存在的文件换上新的内容。

For appending (parameter value 8, constant = ForAppending).

例如:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile ("c:\windows\xxwl.ini", 8, True)

在这种模式下,数据写在原来文件的末尾。用这种模式向现有的文件中添加数据。

3. 用或者 Write,WriteLine,WriteBlankLine 方法来向文本文件中写入数据。

4. 关闭文本文件

向文本文件中写数据的三种方法在表格如下:

Write 向文本文件中写入数据,不是添加文件到末尾。不会自动换行。

例如,如下代码写入两个单独的字符串:

objFile.Write ("This is line 1.")

objFile.Write ("This is line 2.")

返回的数据类似如下:

This is line 1.This is line 2.

WriteLine     向文本文件中写入数据后添加一个换行符号,然后区自动换行的。

比如,如下的代码:

objFile.WriteLine ("This is line 1.")

objFile.WriteLine ("This is line 2.")

结果输出的信息如下:

This is line 1.

This is line 2.

WriteBlankLines 向文本文件中写入特定数目空白的行。例如如下的代码向文本文件中写入两行独立的文字,然后用空白的行分开:

objFile.Writeline ("This is line 1.")

objFile.WriteBlankLines(1)

objFile.Writeline ("This is line 2.")

输出的结果如下:

This is line 1.

This is line 2.

除了以上方法之外,VB 脚本提供了常量 VbTab 来向文本文件中写入。VbTab

向两个字符中插入一个空格。为了创建一个空格分隔的文件,代码和下面的类似:

objTextFile.WriteLine(objService.DisplayName & vbTab & objService.State)

FSO 的一个弱点就是它不能直接修改特定的行的信息。你不能写类似下面的命令:跳过到第五行,更改一些数据,然后保存成新的文件。为了修改在一个十行文件中的第五行,你的脚本必须

1. .读取整个 10 行

2. .将 1-4 行写回文件。

3. 写入修改好的第五行的内容。

4. 写入第 6 行到第 10 行的内容。

在系统管理中,简洁是一种美德。例如,假如你的脚本每天晚上运行,在你的 DC 上从事件日志中获得日志,将这些事件写入数据库中,纪录哪个计算机可以成功的连接到,哪个不可以。基于一些历史的目的,你或许希望跟踪明年一整年的所有成功和失败的纪录。这个对于脚本刚开始生效和网络不稳定的情况下来说,都是非常重要的。从另外的情况来说,你或许只是希望刚才脚本运行的时候发生了什么。换句话说说,你不是希望要一个日志中过去的 365 天的信息,而是要距离最近的信息。它让你可以很快的打开文件并且查找看脚本是否按照计划的运行。

当你的文本文件用 ForWriting 模式打开的,任何写入的新的数据会替代原来存在的文件。例如,假如你的文本文件里面存储了整个莎士比亚的故事全集,但是你用脚本以 ForWriting 模式打开了这个文本,并且向里面写了一个字母 a,那么当你的这个文件写完关闭之后,它就只是包含一个字母 a,原来的数据就全部丢失了。

这个脚本以 ForWriting 模式打开脚本 C:\FSO\Scriptlog.txt 然后将当前的日期和时间写入文件。每当脚本运行的时候,旧的时间和日期被新的取代,这个文本文件就永远只是有单独的一个日期的值。

Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", ForWriting)

objFile.Write Now

objFile.Close


许多脚本被设计成为在特定的时间间隔的时候运行,收据数据,保存数据。这些脚本的是用来分析趋势或者在过去的时间内部的使用情况。在这些情况下,你就不希望删除现在存在的数据而去替代成新的数据。  

例如,假如你用你的脚本监视进程使用量。在任何一个时间点上,进程的使用量应该是在 0 到100 之间的一个值,对于它自己来说,单个的值没有什么意义。为了获得进程使用的一个完整的图景,你需要重复不断的监视使用情况并纪录它的值。如果你的进程在每几秒钟之内返回的数据是9%,17%,92%,90%,79%,88%,91%那么你的进程使用是非常高的。这个就可以对比出这个时间内的使用情况。

如果以 ForAppending 的模式打开一个文件,你可以使数据不是覆盖现有的数据,它的数据是添加到文件的底部。例如,在 4.43 中的脚本打开一个文本文件,并且将当前的日期和时间写入文件。因为是以 ForAppending

的模式打开的文件,当前的日期会卸载文件的底部。如果你在不同的时候分别运行脚本,你的脚本结束时候大约如下面的信息:  

6/25/2002 8:49:47 AM

6/25/2002 8:49:48 AM

6/25/2002 8:50:33 AM

6/25/2002 8:50:35 AM

 

Const ForAppending = 8

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", ForAppending)

objFile.WriteLine Now

objFile.Close

上面的脚本用 WriteLine 方法写入数据保证每个日期都是独占一行的。如果这个脚本用 Write

的方法来写的话,那么这个脚本运行结束的时候,数据写在一起,如下的样子:

6/25/2002 8:49:47 AM6/25/2002 8:49:48 AM6/25/2002 8:50:33 AM6/25/2002 8:50:35 AM

用文本文件来工作有三个主要的步骤。在你可以作其它的事情之前,你必须打开文本文件。这个你可以打开存在的文件或者创建一个新的文本文件,创建结束之后,默认文件是打开的。每个方法都是返回一个TextStream 对象实例。

在你获得了 TextStream 对象之后,你可以向这个文件中写或者读这个文件。但是你不能向同一个文件读和写。换句话说,在同一个操作中,你不能打开一个文件,读这个文件然后再向这个文件中写东西。你必须读完这个文件后关闭,然后再打开这个文件,写入数据,然后关闭。

当你打开一个存在的文件,这个文件要么是准备好被读的,要么是准备好被写的。如果你创建一个新的文本文件,这个文本文件只是被读的,没有什么其它原因的话,它没有内容去被读。最后,你要去关闭这个文本文件,虽然它不是必须的,因为在脚本结束的时候,它会自动关闭,但是这个对于程序实践是需要了解的。

为了打开一个文本文件:

1. 创建一个 FSO 对象实例。

2. 用:OpenTextFile 来打开一个文本文件。这个 OpenTextFile 需要两个参数,一个是一个文件的路径,另外一个是跟着的参数:

        For reading (parameter value = 1, constant = ForReading).

       文件被打开之后只是被用来为读作准备的,为了写这个文件,你必须再一次的打开文件,用参数 ForWriting 或者 ForAppending。

        For writing (parameter value 2, constant = ForWriting).

       文件被打开,并且写入的数据覆盖了原来存在的数据,就是说旧的数据被删除,新的被添加。用这个方法用新的数据来代替存在的数据。

       For appending (parameter value 8, constant = ForAppending).

       文件在这种模式下打开,并且新的数据添加到文件的末尾。用这个方法向存在的文件中添加新的数据。

当打开文件的时候,你必须使用适当的参数。当你用读的模式打开一个文件而试图向里面写东西的时候,你会收到一个的错误。你如果试图打开一个非文本文件的话也会收到同样的错误的。你可以直接用数值(比如 1 代表写)或者创建一个常量然后赋值给它适当的值。

例如,如下的两种方法都可以打开一个文件并且准备被读:

例一:(读取方式打开C:\windows\xxwl.ini)

Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", ForReading)

例二:(读取方式打开C:\windows\xxwl.ini)

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", 1)

但是在没有定义这个常量ForReading 的时候,你不能直接用。这是因为事实上 VB 脚本并没有这些 COM 对象常量。如下的脚本会返回一个错误并且失败。这是因为ForReading 这个常量并没有显式的定义。因为它没有定义,所以这变量默认情况下被赋值为 0,而 0 对于 OpenTextFile 来说并不是一个合法的参数:

所有的用脚本打开的文本文件在脚本结束的时候会自动关闭。但是我们要养成关闭文件的一个好的习惯,这样就可以避免产生的一些错误。

有些时候你或许希望用一个脚本多次读一个文件。你或许打开一个文本文件然后将它所有的内容全部保存给一个字符串变量,然后搜索这个字符串来查找特定的错误的代码。当这个错误找到了,你再逐行去读取文件,提炼出有错误的每一行。如果你尝试多次去读一个文件,你不会收到你期待的结果,而是会遇到一个运行的错误。例如下的脚本读取一个文本文件,返回文件的内容到屏幕,然后尝试重复这样的过程:


    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objFile = objFSO.OpenTextFile("c:\windows\xxwl.ini", 1)

    Wscript.Echo "第一次读取文件"

    strContents = objFile.ReadAll

    Wscript.Echo strContents

    Wscript.Echo "文件读取完毕"

    Do While objFile.AtEndOfStream = False

        strLine = objFile.ReadLine

        Wscript.Echo strLine

    Loop

第一次文件是被读取的,内容存储在变量 strContents 上,第二次,文件读取的时候,没什有数据回显在屏幕上,这是因为文件已经到达了文件的末尾,没有其它的数据给你读了。为了读取这个数据,你必须关闭这个文件然后重新打开它。你不能在读到文件的末尾之后去跳到文件的开头去了。TextStreamObject.Close 方法用来关闭一个文本文件。例如,下面的脚本创建一个FSO对象实例,然后打开一个文本文件,然后在立即关闭了。为了访问文件的内容,你必须再一次的调用 OpenTextFile 方法去重新打开这个文件。

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", 1)

objFile.Close

在许多的企业脚本中,读取文本文件的内容是个标准进程,你可以用这个功能来读取命令行的参数。例如,你的文本文件包含了计算机名字的列表,脚本审计成读取这个列表,然后在每个计算机上运行这个脚本。搜索满足特定条件的日志文件。例如,你或许想找所有有错误的日志。将日志文件中添加内容并且汇入到数据库。例如,你或许有一个服务或者程序来保存信息到特定存文本文件格式。然后你用脚本来读取这个文件拷贝相关的信息到数据库中。

可以用 FSO 来都读取文本文件的内容,但是有以下几点你需要牢记:FSO 只能读取 ASCII 的文本文件。你不能用 FSO 读取unicode 或者

binary 文件格式的文件,比如 microsoft word 或者是 Microsoft excel .用 FSO读取文本文件的时候,只能有一种方式:从前到后。此外,FSO 读取文件的时候是逐行读取的。如果你试图返回前面的行,你必须从开始再重新读取,直到特定的行。

你不能打开一个文件同时用来读和写。如果你打开一个文件是为了读的,那么你想修改文件内容的时候,你必须重新打开文件。如果你尝试在写的模式下读取文件,那么你会收到一个的错误。

还有读取特定的字符然后停止也是我们常用的技巧:

读取第一行的前 12 个字符并且将它赋值给变量 strText

strText = objTextFile.Read(12)

读取一行并且将它赋值给变量strText

strText = objTextFile.ReadLine

跳过前面的 12 字节 从第 13 个字符开始

objTextFile.Skip(12)

先读第一行,然后读取第三行。跳过了第二行

strText = objTextFile.Readline
objTextFile.SkipLine
strText = objTextFile.Readline

跳过3行
For i=1 to 3
objTextFile.ReadLine
Next

正如前面提到的,FSO 只能从文本文件的前面读到后面,你不能从后面向前面读。这个对于日志文件来说有一些问题,大部分的日志文件是按照日期格式来写的,它的最开始的第一个日志被纪录在第一行,第二个纪录纪录在第二行,依次类推。这就以为着你感兴趣的事情,最新的日志往往在文件末尾。

有的时候你希望按照反日期的顺序来显示信息,就是最近的纪录最先显示,最旧的纪录最后显示。虽然你不能从后面先前的读取文本文件,但是你要可以实现上面的目的,脚本必须:  

1. 创建一个数组来存储文本文件的每行信息

2. 用 ReadLine 的方法读取文本文件的每行信息,然后将每行的信息作为数组的一个独立的元      素存储在数组中。

3. 在屏幕上显示数组的信息,从数组的最后面开始,向前显示。

例如,下面的脚本读取文件 c:\windows\xxwl.ini的信息,然后将每行的信息作为数组

的一个元素存储在数组 arrFileLine 中。在整个文件被读了之后,从数组的最后一个开始回显数组的信息。为了做到这点,用了一个 for循环,从数组的最后一个元素, 逐渐增长到第一个元素,

Dim arrFileLines()

 i = 0

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("C:\windows\xxwl.ini", 1)

Do Until objFile.AtEndOfStream

Redim Preserve arrFileLines(i)

arrFileLines(i) = objFile.ReadLine

i = i + 1

Loop

objFile.Close

 For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1

 Wscript.Echo arrFileLines(l)

Next

如果文件的内容和下面的一样:

1ddd

2ccc

3bbb

4aaa

那么在屏幕上回显的信息如下:

4aaa

3bbb

2ccc

1ddd

在一些定宽的文本文件中,区域是受长度的限制的。第一个 field1 或许包含 15 个字节,第 2个 field 或许含有十个,依次类推。那么这样的文件看起来和下面的差不多:

Server Value Status

atl-dc-0119345     OK

atl-printserver-02      00042    OK

atl-win2kpro-0500000     Failed

在有些情况下,你或许只是想获得 values 的值或者只是想获得 status 的信息。这个 value 的信息,容易表明。Values 总是从第 26 个字符开始,不超过 5 个字符。为了获得这些值,你只需要获得第 26,27,28,29,30 个字符的信息。

方法 Read 允许你读取特定数目的字节。它的一个单独的参数就是你要读的字节的个数。

例如,如下的脚本代码示例,读取后面的 7 个字节,并将读取的值存给变量 strCharacters:

strCharacters = objFile.Read(7)

用 Skip 和 SkipLine 方法,你可以获得文本文件中你选择的特定字符。

例如,下面脚本是读取每行的第 6 个字节。为了做到这点,脚本必须:

1. 跳过每行前面五个字节用 Skip(5)

2. 用 Read(1)读取第 6 个字节

3. 跳到下面一行。

 Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.OpenTextFile("c:\windows\xxwl.ini", 1)

Do Until objFile.AtEndOfStream

objFile.Skip(5)

strCharacters = objFile.Read(1)

Wscript.Echo strCharacters

objFile.SkipLine

Loop

为了更好说明脚本是如何工作的,我们假设脚本文件 c:\windows\xxwl.ini 看起来是如下的样子的:

xxxxxxxaXXXXXXXXXXXXXX

XXXXXbXXXXXXXXXXXXXXXXXXX

XXXXXcXXXXXXXXXXXXx

XXXXXdXXXXXXXXXXXXXXXXXXXXXXXXX

对于这个文件的每行,前面的五个字符都是 x,第六个是数字,后面是随机数量的 x。当脚本 运行的时候,脚本会:

1. 打开文本文件从第一行开始读起。

2. 跳过前面五个字符。

3. 用 Read 载方法读取第六个字符

4. 回显字符在屏幕上

5. 跳到下面一行重复上面的进程,直到脚本运行结束。.

 

OpenTextFile 方法

  打开指定的文件并返回一个 TextStream 对象,可以通过这个对象对文件进行读、写或追加。

  object.OpenTextFile(filename[, iomode[, create[, format]]])

  参数

  object

  必选项。 object 应为 FileSystemObject 的名称。

  filename

  必选项。 指明要打开文件的字符串表达式。

  iomode

  可选项。 可以是三个常数之一: ForReading 、 ForWriting 或 ForAppending 。

  create

  可选项。 Boolean 值,指明当指定的 filename 不存在时是否创建新文件。 如果创建新文件则值为 True ,如果不创建则为 False 。 如果忽略,则不创建新文件。

  format

  可选项。 使用三态值中的一个来指明打开文件的格式。 如果忽略,那么文件将以 ASCII 格式打开。

  设置

  iomode 参数可以是下列设置中的任一种:

  常数 值 描述

  ForReading 1 以只读方式打开文件。 不能写这个文件。

  ForWriting 2 以写方式打开文件

  ForAppending 8 打开文件并从文件末尾开始写。

  format 参数可以是下列设置中的任一种:

  值 描述

  TristateTrue 以 Unicode 格式打开文件。

  TristateFalse 以 ASCII 格式打开文件。

  TristateUseDefault 使用系统默认值打开文件。

  说明

  下面的代码说明了如何使用 OpenTextFile 方法打开文件并追加文本:

  var fs, a, ForAppending;

  ForAppending = 8;

  fs = new ActiveXObject("Scripting.FileSystemObject");

  //可以是三个常数之一: ForReading 、 ForWriting 或 ForAppending

  //分别是 1 ,2 ,3

  a = fs.OpenTextFile("c:\\testfile.txt", 1, false);

  ...

  a.Close();

你可能感兴趣的:(it,读写)