VBS之玩转文件管理系统

边听音乐边工作

文中有彩蛋!

阅读本文需要有VBS(Visual Basic Scripting)语言的基本编程,属于中级教程。VBS对于Windows简直如直刺心脏的利剑,软件测试人员学会使用它是必须哒!就算不是计算机编程人员,不是软件测试人员,也建议你掌握VBS语言,这是一个最好玩,最小巧,简单易学,又最有用,不需要安装任何平台的语言啦!其实只要你初步了解任何一门语言,也能看懂这个教程的。

平时,工作常常需要对Windows文件系统进行增删改查的工作。

对于需要批量进行文件操作的时候,反复做相同的事费事费力,此时VBS就可以帮上大忙了。

例如,我们临时要将大量的word文档转换为pdf文件,是不是要上网搜小软件又怕有病毒木马?不要着急下载小软件,自己动手就可以轻松解决这些问题。

VBS处理文件管理的小栗子

用记事本把下面这段代码【1】,存为vbs文件,保存在需要批量转换文件的文件夹下,直接运行。

On Error Resume Next

Const wdExportFormatPDF = 17

Set oWord = WScript.CreateObject("Word.Application")

Set fso = WScript.CreateObject("Scripting.Filesystemobject")

Set fds=fso.GetFolder(".")

Set ffs=fds.Files

For Each ff In ffs

If (LCase(Right(ff.Name,4))=".doc" Or LCase(Right(ff.Name,4))="docx" ) And Left(ff.Name,1)"~" Then

Set oDoc=oWord.Documents.Open(ff.Path)

odoc.ExportAsFixedFormat Left(ff.Path,InStrRev(ff.Path,"."))&"pdf",wdExportFormatPDF

If Err.Number Then

MsgBox Err.Description

End If

End If

Next

odoc.Close

oword.Quit

Set oDoc=Nothing

Set oWord =Nothing

MsgBox "Word文件已全部轩换为PDF格式!"

短短的20行代码就解决问题啦。所有当前目录下的word文档都转换为pdf文件。怎么样?很方便吧?

那就让我们我们开始学起来吧!

彩蛋来咯!

VBS运行Windows系统程序

Vbs其实是一种简单的Basic语言,进行简单的没有什么神奇的,只提供了编程的一个基本框架,用户可以使用Vbs来定义变量、过程和函数,vbs也提供了一些内部函数和对象,但是它提供了一条极为方便、功能也相当强的命令——CreateObject,这条命令可以访问windows系统内安装的所有com对象,并且可以调用这些部件中存放的命令。

WSH也就是用来解析Vbs的宿主,本身包含了几个常用对象:

1、Scripting.FileSystemObject—> 提供一整套文件系统操作函数

2、Scripting.Dictionary—> 用来返回存放键值对的字典对象

3、Wscript.Shell—> 提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS环境变量,读取链接中的设置

4、Wscript.NetWork—> 提供网络连接和远程打印机管理的函数。(其中,所有Scripting对象都存放在SCRRUN.DLL文件中,所有的Wscript对象都存放在WSHOM.ocx文件中。)

如何使用FSO对象返回一个TextStream对象,此对象可以被读取与写入:

CreateObject 函数返回 FileSystemObject 对象 (fso)。CreateTextFile 方法创建一个文件作为 TextStream 对象 (a),然后 WriteLine 方法在此文件中写入一行文本。最后 Close 方法刷新缓冲区并关闭文件。

FSO对象模型

FSO,全称FileSystemObject。文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,对微软的office产品直接操作,在Vbs中对桌面和文件系统进行访问的顶级对象是FileSystemObject(FSO),这个对象特别复杂,是vbs进行文件操作的核心。

例如,不但可以对文件进行操作,对Excel直接进行操作:

Drive对象:包含储存设备的信息,包括硬盘、光驱、ram盘、网络驱动器

Drives集合:提供一个物理和逻辑驱动器的列表

File对象:检查和处理文件

Files集合:提供一个文件夹中的文件列表

Folder对象:检查和处理文件夹

Folders集合:提供文件夹中子文件夹的列表

Textstream对象:读写文本文件

设计FSO

FSO对象模式编程,分三步:

使用CreateObject方法来创建FSO对象

在新创建对象上使用适当的方法

访问对象的属性。

FSO 对象模式包含在 Scripting 类型库中,该库位于 Scrrun.dll 文件中。因而,要使用 FSO 对象模式,必须把 Scrrun.dll 放在 Web 服务器的适当系统目录中。

创建FSO对象

这其实是创建了FSO的一个实例。也可以这样来写:

Scripting 是类型库的名字,而 FileSystemObject 则是想要创建的对象的名字。

使用适当的方法

例如,要创建一个新的对象,则使用CreateTextFile或CreateFolder(FSO 对象模式不支持驱动器的创建或删除)。要删除对象,则使用FSO对象DeleteFile和DeleteFolder方法,或File和Folder对象的Delete方法。也可以使用适当的方法,来复制和移动文件与文件夹。

FSO的常见方法:

BulidPath:把文件路径信息添加到现有的文件路径上

CopyFile:复制文件(第2个参数若为true,表示覆盖)

CopyFolder:复制文件夹

CreateFolder:创建文件夹

CreateTextFile:创建文本并返回一个TextStream对象

DeleteFile:删除文件

DeleteFolder:删除文件夹及其中所有内容,如果有子文件夹也都删除

DriveExits:确定驱动器是否存在

FileExits:确定一个文件是否存在

FolderExists:确定某文件夹是否存在

GetAbsolutePathName:返回一个文件夹或文件的绝对路径

GetBaseName:返回一个文件或文件夹的基本路径

GetDrive:返回一个dreve对象

GetDriveName:返回一个驱动器的名字

GetExtensionName:返回扩展名

GetFile:返回一个file对象

GetFileName:返回文件夹中文件名称

GetFolder:返回一个文件夹对象

GetParentFolderName:返回一个文件夹的父文件夹

GetSpecialFolder:返回指向一个特殊文件夹的对象指针

GetTempName:返回一个可以被createtextfile使用的随机产生的文件或文件夹的名称

MoveFile:移动文件

MoveFolder:移动文件夹

OpenTextFile:打开一个存在的文件并返回一个TextStream对象

做个小练习:检测C:\temp文件夹是否存在,如果存在则拷贝到D盘,并且删除,如果不存在,则建立文件夹。

Dim fso,s

Set fso=WScript.CreateObject("Scripting.fileSystemObject")

If(fso.FolderExists("c:\temp")) Then '判断文件夹是否存在

s="已经存在"

'存在,则拷贝到D盘

fso.Copyfolder "c:\temp","d:\temp"

s=s+",已经拷贝"

fso.Deletefolder("c:\temp")

Else

s="不存在"

Set foldr=fso.CreateFolder("c:\temp") '不存在则建立

End If

Msgbox(s)

Set fso=nothing

可以使用统配符,来方便操作:

访问与处理现有驱动器和文件夹

要访问现有驱动器、文件或文件夹,则使用 FileSystemObject 对象中的适当的 "get" 方法:

GetDrive

GetFolder

GetFile

访问现有文件:

不要对新创建的对象使用 "get" 方法,因为 "create" 函数已经返回那个对象的一个句柄。例如,如果使用 CreateFolder方法创建了一个新的文件夹,则不要使用 GetFolder 方法来访问它的属性,如 Name、Path、Size等等。只需设一个变量给 CreateFolder 函数,来获得新创建文件夹的句柄名,然后访问它的属性、方法和事件。

要在 VBScript 中这样做,则使用下面的代码:

获取有关驱动器的信息

可以用 Drive 对象来获得有关各种驱动器的信息,这些驱动器是实物地或通过网络连接到系统上的。它的属性可以用来获得下面的信息内容:

驱动器的总容量,以字节为单位(TotalSize 属性)

驱动器的可用空间是多少,以字节为单位(AvailableSpace 或 FreeSpace 属性)

哪个号被赋给了该驱动器(DriveLetter 属性)

驱动器的类型是什么,如可移动的、固定的、网络的、CD-ROM 或 RAM 磁盘(DriveType 属性)

驱动器的序列号(SerialNumber 属性)

驱动器使用的文件系统类型,如 FAT、FAT32、NTFS 等等(FileSystem 属性)

驱动器是否可以使用(IsReady 属性)

共享和/或卷的名字(ShareName 和 VolumeName 属性)

驱动器的路径或根文件夹(Path 和 RootFolder 属性)

Drive对象的用法示例

s = "Drive " & UCase(drvPath) & " - "

s = s & drv.VolumeName & "----"

s = s & "Total Space: " & FormatNumber(drv.TotalSize / 1024, 0)

s = s & " Kb" & "---"

s = s & "Free Space: " & FormatNumber(drv.FreeSpace / 1024, 0)

s = s & "Kb"

End Sub

处理文件夹

使用 Folder 和 FileSystemObject 对象,来操作文件夹和获得有关它们的信息:

Sub ShowFolderInfo()

Dim fso, fldr, s ' 获得 FileSystemObject 的实例。

Set fso = CreateObject("Scripting.FileSystemObject") ' 获得 Drive 对象。

Set fldr = fso.GetFolder("c:")

' 打印父文件夹名字。

Msgbox "Parent folder name is: " & fldr

' 打印驱动器名字。

Msgbox "Contained on drive " &fldr.Drive

' 打印根文件名。

If fldr.IsRootFolder= True Then

Msgbox "This is the root folder."

Else

Msgbox "This folder isn't a root folder."

End If

' 用 FileSystemObject 对象创建新的文件夹。

fso.CreateFolder ("C:\Bogus")

Msgbox "Created folder C:\Bogus"

' 打印文件夹的基本名字。

Msgbox "Basename = " & fso.GetBaseName("c:\bogus")

' 删除新创建的文件夹。

fso.DeleteFolder ("C:\Bogus")

Msgbox "Deleted folder C:\Bogus"

End Sub

处理文件

有两种主要的文件处理类型:

创建、添加或删除数据,以及读取文件

移动、复制和删除文件

创建文本(三种方式)

Dim fso,f1

Set fso=CreateObject("Scripting.FileSystemObject")

Set f1=fso.CreateTextFile("C:\testfile.txt",True)

Dim fso,f2

Const ForWriting=2

Set fso=CreateObject("Scripting.FileSystemObject")

Set f2=fso.OpenTextFile("c:\test.txt",ForWriting,True)

写文件

一旦创建了文本文件,使用下面的三个步骤向文件添加数据:

打开文本文件。

写入数据。

关闭文件。

读文件

(ReadAll)

Sub WriteFiles

Dim fso,tf

Set fso=CreateObject("Scripting.FileSystemObject")

Set tf=fso.CreateTextFile("C:\testfile.txt",True)

'写一行,并且带有新行字符

tf.WriteLine("Testing 1,2,3.")

'写一行

tf.Write("This is a test.")

'向文件写三个新行字符

tf.WriteBlankLines(3)

tf.close

End Sub

Sub ReadFiles

Dim fso,ts,s

Const ForReading=1

Set fso=CreateObject("Scripting.FileSystemObject")

Set ts=fso.OpenTextFile("C:\testfile.txt",ForReading)

Msgbox "Reading file"

s=ts.ReadLine

Msgbox s

ts.close

End Sub

移动、删除和复制文件:

在驱动器 C 的根目录中创建一个文本文件,向其中写一些信息,然后把它移动到 \tmp 目录中,并在 \temp 中做一个备份,最后把它们从两个目录中删掉。

Sub ManipFiles

Dim fso,f1,f2,f3

Set fso=CreateObject("Scripting.FileSystemObject")

Set f1=fso.CreateTextFile("C:\testfile.txt",True)

Msgbox "Writing file"

f1.Write("This is a test")

f1.close

Msgbox "Moving file to C:\tmp"

Set f2=fso.getFile("C:\testfile.txt")

If not fso.FolderExists("C:\tmp") Then

Set foldr=fso.CreateFolder("C:\tmp")

Else

If fso.FileExists("C:\tmp\testfile.txt") Then

fso.DeleteFile("C:\tmp\testfile.txt")

End If

End If

f2.Move("C:\tmp\testfile.txt")

Msgbox "Copying file to c:\temp"

If not fso.FolderExists("C:\temp") Then

Set foldr=fso.CreateFolder("C:\temp")

End If

f2.Copy("C:\temp\testfile.txt")

Msgbox "Moving file to c:\temp"

Set f2=fso.GetFile("C:\tmp\testfile.txt")

Set f3=fso.GetFile("C:\temp\testfile.txt")

f2.Delete

f3.Delete

fso.DeleteFolder("C:\temp")

fso.DeleteFolder("C:\tmp")

Msgbox "All Done!"

End Sub

常见的指针变量:

atendofstream属性:当处于文件结尾的时候这个属性返回true。一般用循环检测是否到达文件末尾。例如:do while ffile.atendofstreamtrue

ffile.read(10)

loop

atendofline属性:如果已经到了行末尾,这个属性返回true。

Column属性(当前字符位置的列号)和line属性(文件当前行号):在打开一个文件后,行和列指针都被设置为1。

在文件中跳行:skip(x)跳过x个字符;skipline跳过一行

在文件中写入字符:可以用2-写入和8-追加的方式来写入

其方法有:write(x)写入x字符串;writeline(x)写入x代表的一行

writeblanklines(n) 写入n个空行

注意:最后一定要使用close方法关闭文件。读文件后一定要关闭,才能以写的方式打开。

一旦有了对象的句柄,就可以访问它的属性。例如,要获得特定文件夹的名字,首先创建该对象的一个实例,然后用适当的方法获得它的句柄(在这个例子中是 GetFolder 方法,因为该文件夹已经存在了)。

在windows中,文件的属性(f.Attributes)一般用数字来表示:

0代表normal,即普通文件未设置任何属性。 1代表只读文件。

2代表隐藏文件。 4代表系统文件。 16代表文件夹或目录。

32代表存档文件。 1024代表链接或快捷方式。

系统文件夹

一般指的系统文件夹:\windows\system32,临时文件夹,windows文件夹,例如

setfs=wscript.createobject(“scripting.filesystemobject”)

setwshshell=wscript.createobject(“wscript.shell”)

osdir=wshshell.expandenvironmentstrings(“%systemroot%”)

set f =fs.getfolder(osdir)

wscript.echo f

当然,还有简单的方法那就是使用getspecialfolder()

这个方法使用3种值:

表示windows文件夹,相关常量是windowsfolder

1系统文件夹,相关常量是systemfolder

2临时目录,相关常量temporaryfolder

例如:

setfs=wscript.createobject(“scripting.filesystemobject”)

setwfolder=fs.getspecialfolder(0) ‘返回windows目录

setwfolder=fs.getspecialfolder(1) ‘返回system32\

setwfolder=fs.getspecialfolder(2)'返回临时目录

【参考资料】

1、https://www.cnblogs.com/Mr-nie/p/8029085.html

2、http://www.jb51.net/shouce/vbscript/index.html

3、《VBS脚本教程》

4、《VBScript Third Edition》

如果阅读本文有收获,您的打赏支持与肯定将是对作者最大的鼓励!诚挚感谢!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180224G17DIS00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券