vbs脚本手册资料_第1页
vbs脚本手册资料_第2页
vbs脚本手册资料_第3页
vbs脚本手册资料_第4页
vbs脚本手册资料_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OVBS脚本运行库手册之一一一磁盘操作

文件系统管理是系统管理的一个关键性任务。WSII和VB脚本在这个领域都没有提供相关的

功能。幸运的是,你可以通过scriptruntime

库来管理这些关键的系统组件,比如磁盘,文件夹和文件。这诙种主要的脚本语言,VB脚本

语言和JS脚本语言起初的时候都是设计给客户端来编写IE的。正是因为如此,这两个脚

本语言都有一些局限性。例如VB脚本和JS脚本内部都没有提供访问文件管理的一些任务,

比如:复制、移动、删除文件等。这样做的目的是为了保护消费者。大多数的的网站不可能

让用户通过网页去删除它们硬盘:上的东西。尽管如此,脚木已经从类似的HTML的按钮之类

的开始迅速的发展了。随着ASP的到来,浏览器的编写者要求在server上管理文件。而随

着WSH的到来,系统管理员要求有在web浏览器外来管理文件了。

为了满足这个要求,微软发布的了ScriptRuntimeLibrab。它是一个单独的DLL文

件,scrrun.dll文件,用来给脚本的编写者们提供一些文件管理的能力,包括以下内容:

1、获取文件系统的信息,包括获得磁盘、文件和文件夹上的信息。

2、史制,移动和删除文件及文件夹

3、创建和读写文本文件。

除了这些功能之外,ScriptRuntimeLibrary提供了创建字典的能力。也可以用来对脚本进

行编译,使脚本成为加密的。

Note:

这章只是讨论FileSystemObJect和Dictionary的部分,对于Encode部分不作讨论,

ScriptRuntimeLibrary

也是windows2000的一部分,它在你安装或者升级微软的应用程序的时候也随着升级和安

装了:这些应用程序有以下几个:

1、NSH2、VB脚本3、IE浏览器4、MicrosoftOffice5、FileSystemObject

正如它的名字一样,FSO设计用来帮助你管理文件系统,FSO

介许你获取重要的文件组件信息,包括硬盘、文件夹、文件:也提供一般的系统管理的任务,

比如复制、删除、移动文件和文件夹。此外FSO允许你读写文本文件。

用FSO其实有些用词不当,因为实际上FSO包含很多个对象,每个对象被设计成用来完成

特定的目的。组成FSO

的对象列在了下表中:

Drive代表系统中磁盘或者磁盘的集合

File代表系统中的一个文件或者文件的集合

Folder代表文件系统中的一个文件夹或者多个文件夹

Textstream代表文本文件中的读取、写入或者提交字符串

派磁盘管理

磁盘管理是系统管理的一个重要的部分。作为一个系统管理员,知道安装在这个计算机上磁

盘是十分重要的,当然,知道这个磁盘的属性、磁盘类型、子盘大小、总共和剩余空间也是

同等重要的。作为一个脚本的编写者,你有两个主要的选择来管理磁盘:NM1

&FS0。一般来讲,WM!更是管理磁盘的首选项,主要有以下几个原因:1、WMI能返回一些

FSO无法返回的属性,比如磁道、扇面等。

2、FSO不能返回一个目标磁盘。而是返回所有的磁盘,然后进行筛选出你感兴趣的磁盘。而

你可以用WM1通过磁盘符号及返回特定的磁盘,WMI可以用来返回远程计免机上磁盘的信

息,但是FS0不可以,除非它用wshconlrollcr对象。

虽然WMI或许是获得磁盘信息的最好工具。但是这里至少有两个原因使你必须去熟悉FSOo

第一:因为有些低端的操作系统无法安装WMI,所以只能使用FSO;

第二:最重要的一点是因为:脚本的编写者们在想到获取磁盘信息的时候就会用到FSO,而

你作为系统管理员,可能会来存其它人的脚本,这样就需要了解FSO.注:外国人写的真是

拗口,我理解这句话的意思就是说FSO比WMI应用的更广泛一些。

X如何返回磁盘信息

在你管理计算机的磁盘之前,你需要知道你的计算机上实际上有多少磁盘可以使用。FSO允

许你管理安装在计算机上的所有磁盘,包括移动硬盘和网络硬盘(就是只要是有盘符的就可

以了)为了返回这个集合,你需要首先创建一个FSO实例,然后创建磁盘属性的对象。当这

个集合返回后,你可用一个ForEach的循环来重述这个集合。

例如,下面的脚本就是要返回安装在本地计舞机上的磁盘集合然后返回它们的盘符:

1SetobjFSO=CreateObject("Scripting.FileSystemObject")

2SetcolDrives=objFSO.Drives

3ForEachobjDrivcincolDrives

4Wscript.Echo“Driveletter:"&objDrive.DriveLetter

5Next

※如何绑定指定磁盘

如果你事先知道要绑定的磁盘(例如C盘或•个共享文件夹\\accounting\receivables),

你可以用GetDrive

的方法来直接绑定磁盘。这样你可以不用去筛选就获得特定磁盘的信息。GetDrive需要一个

单独的参数:磁盘符号或者是共享文件夹的UNC路径。你可以用如下的几种格式:CC:

C:\

在下面的脚本中首先创建一个FSO对象,然后用GetDrive的方法来直接绑定C盘,然后回

显可用的磁盘空间:

1SetobjFSO=CreateObject(*Scripting.FileSystemObject*)

2SetobjDrive=objFSO.GetDrive("C:")

3Wscript.Echo"Availablespace:"&objDrive.AvailableSpace

注意,这里没有ForEach

循环,你就可以获得磁盘的属性。因为脚本是返回•个单独的磁盘对象,而不是所有对象的

集合。因此也就不用筛选了。

※如何列举磁盘驱动器的属性

磁盘集合的作用总是用来监视和列举的。作为一个系统管理员,你需要知道计算机上的可用

磁盘,也需要知道磁盘的序列号、可用空间等信息。在你获得当前磁盘的集合或者单个磁盘

的时候,你就可以获得下表列出的所有属性。

1、AvailableSpace---报告磁盘上可以使用的空间,单位是bytes。如果想以kb为单位返

回,除以1024,如果想以M为单位返回,则除以

1.048,576。这个属性返回的是可用的磁盘空间的总数。如果•个磁盘启用了磁盘限额,那么

他返回的数字可能比实际的要小。

2.DriveLette一一返回特定磁盘的盘符。这个盘符不包含那么冒号。例如软盘返回的是A,

而不是A:

3.DriveType一一整数的值代表不同的磁盘类型:1:移动硬盘2:硬盘3:网络硬盘

4:CD-ROM5:RAM磁盘

4.FrccSpace一一返回磁盘剩余空间的总额。单位是bytes,如果是返回的单位是kb,就除

以1024,如果是以M为单位,除以

1,048,576»注意:这个和磁盘可用空间不一样,剩余的磁盘空间不会考虑磁盘限额。

5、FileSystem——返回文件系统的类型(FAT,FAT32,NTFS)

6.IsReady一一标识磁盘是否可以访问。这个值来判断软盘和CD-ROM是否为空

7.Path一一磁盘路径。对于本地磁盘,返回盘符和脱尾符(就是那个冒号),比如A:对于

网络磁盘,就返回它的UNC路径。

8、RootFolder---返回磁盘根目录下的文件夹。

9、SerialNumber一一磁盘的生产商给磁盘分配的序列号。对丁•软盘和网络硬盘来说,它们的

值是0。

10、ShareName---分配给网络驱动去的共享名称。

11、TotalSize一一报告整个的磁盘空间,单位是bytes,如果想以kb为单位,除以1024,

如果想以M为单位返回,则单位为1,048,576。

12、VolumeName---分配给磁盘的卷名。

为了列举安装在计算机里的磁盘的属性,创建一个FSO实例,然后创建一个FSO属性的对

象,用ForEach循环,来重现各个磁盘的配置。对于集合当中的每个磁盘,你可以返回一

个或者的属性。如下列脚本列举出安装在计算机上所有磁盘的所有属性。

1SetobjFSO=CreateObject("Scripting.FileSystemObject")

2SetcolDrives=objFSO.Drives

3EorEachobjDriveincolDrives

4Wscript.Echo“Availablespace:"&objDrive..AvailableSpace

5Wscript.Echo“Driveletter:"&objDrive.DriveLetter

6Wscript.Echo"Drivetype:"&objDrive.DriveType

7Wscript.Echo"Filesystem:"&objDrive.FileSystem

8Wscript.Echo“Isready:"&objDrive.IsReady

9Wscript.Echo"Paih:"&objDrive.Path

10Wscript.Echo"Rootfolder:"&objDrive.RootFolder

11Wscript.Echo"Serialnumber:"&objDrive.SerialNumber

12Wscript.Echo“Sharename:"&objDrive.ShareNamc

13Wscript.Echo"Totalsize:"&objDrive.TotalSize

14Wscript.Echo“Volumename:"&objDrive.VolumeName

15Next

上述脚本有个潜在的缺点,就是如果没有软盘或者光驱里面没有光盘,会产生一个disknot

ready的错误出来。当磁盘没有准备好的时候用FS0来访问会有些错误的。虽然FS0可以

标识那些没有准备好的磁盘,但是你访问它的一些属性的时候会报错出来,比如

AvailableSpace或FreeSpaceo如果磁盘没有准备好,你只可以访问如下的四个属性:

DriveLetter,DriveType,IsReady、ShareName。所有尝试访问其它属性都会报错。

幸运的是,IsReady属性允许你用脚本来检查一个磁盘是否准备好了。IsReady返回一个

Boolean值,如果这个值是true,则磁盘准好了,你可以访问它的所有属性,否则如果这个

值是false,则磁盘没有准备好,只能返回上面的四个属性了。可以对每个磁盘,用IsReady

属性来保证磁盘是准备好的。如果是就返回磁盘的盘符和剩余空间,如果不是就只返回磁盘

的盘符。

1SetobjESO=CreateObject(,zScripting.FileSystemObjectz,)

2SetcolDrives=objFSO.Drives

3ForEachobjDriveincolDrives

4IfobjDrive.IsReady=TrueThen

5Wscript.Echo“Driveletter:"&objDrive.DriveLetter

6Wscript.Echo“Freespace:"&objDrive.FreeSpace

7Else

8Wscript.Echo“Driveletter:"&objDrive.DriveLetter

9EndIf

10Next

Note:这个问题不会发生在Will上(如果软盘或者光驱中没有盘,脚本就会失败),WMI只

是认为返回的空间为Null..

©VBS脚本运行库手册之二一一管理文件夹

※管理文件夹

磁盘的属性比如磁盘的剩余空司,磁盘的总额提供了一个全局的信息给系统管理员。但是,

对于系统管理而言,磁盘的信息虽然是必须的,但是还不够。知道文件存储在哪个盘固然重

要,但是你也需要知道文件是存储在哪个文件夹下的。此外许多的系统管理任务都是发生在

文件夹级别的,比如复制,移动,删除和列举文件夹的内容。

FS0可以返回一个磁盘上文件夹的全部信息。此外,FS0提供了一系列的方法来完成诸如:

复制、移动、删除文件夹的操作。

X如何绑定指定的文件夹

在微软的调用文件中,文件夹是COM

对象。这就是说在你访问一个单独的文件夹的属性时,你必须去创建一个文件夹的对象

reference,这个过程叫做绑定。你可以用FSO和GetObject的方法来绑定到一个文件夹。

当用GetFolder的时候,你必须:路径既可以写成本地路径也可以写成UNC路径(例如:

\\accounting\receivables)o但是通配符不能出现在路径当中,此外,你不可以创建一个单

独的对象reference

来同时绑定到多个文件夹。例如,如下的脚本代码会产生一个错误:

objFSO.GetFolder("C:\FSO","C:\Scripts")

如果你想针对多个文件夹同时工作,你要么用BII或者用针对每个文件夹创建单独的对象

referenceo

在设置的时候Set这个关键词是必须的,因为你要标识这个对象reference变量。

例如下面的脚本绑定文件夹C:\FSO

1SetobjESO=CreateObject(*Scripting.FileSystemObject*)

2SetobjFolder=objFSO.GetFolder(*C:\FSO*)

虽然通配符是不允许的,但是你可以用点来关联到当前的文件夹(.),你可以用点点(..)来绑

定到父文件夹,用\

绑定到根文件夹。例如如下代码语句绑定到当前的文件夹:

SetobjFolder=objFSO.GetFolder

※检验文件夹是否存在

许多的文件夹的操作包括复制、移动、删除需要特定的文件夹存在才可以对其进行操作。毕

竞,脚本不能复制、移动、删除这些不存在的文件夹,如果一个脚本尝试去对一个不存在的

文件夹执行类似的操作,那么会报错"pathnotfound”。为了避免这样的问题发生,你可以

用FolderExists方法来在你绑定一个文件夹之前检查文件夹是否存在。FolderExists用一

个简单的参数(文件夹路径)来返回一个Boolean值,如果文件夹存在,返回的值为True,

否则返回的值为False。

例如,下例中列出的脚本,FolderExists方法来检查文件夹C:\ESO是否存在。如果存在,

脚本用GetFolder方法来绑定文件夹。如果不存在,脚本就弹出一个messagebox说:

Folderdoesnotexist.

1SetobjFSO=CreateObject(^Scripting.FileSystemObject^)

2IfobjFSO.FolderExistsC*CAFSO")Then

3SetobjFolder=objFSO.GetFolder("C:\FS0")

4Wscript.Echo"Folderbindingcomplete.”

5Else

6Wscript.Echo"Folderdoesnotexist?”

7EndIf

※如何建立文件夹

你不可能永远都使用你现有的文件系统结构,从来不去更改你的文件系统结构。而事实上,

文件系统是动态的,因为需要变动,现存的文件夹可能被删除,新的文件夹可能被创建。例

如,你的单位在

fileservers上给用户提供空间,你需要在每个新用户来的时候创建一个新的文件夹给他。

FSO给脚本编写者提供了这样的能力,可以让你通过脚本来创建文件夹。例如在上例中脚本

检查特定的文件夹是否存在,如果存在,脚本用GetFolder的的方法来绑定到这个特定的文

件夹,如果不存在,脚本弹出一个消息框。虽然这个方法避免了脚本的失败,但是你或许更

希望在文件夹不存在的时候来创建一个文件夹,而不是简单的报告说文件夹不存在。为了做

到这点,首先创建•个FSO对象实例,然后用CreateFolder方法,将文件夹的完成路径作

为参数,例如,下面脚本用这个方法来创建一个新的文件夹C:\FS0

1Setob,jFSO=CreateObject(""Scripting.FileSystemObject^)

2SetobjFolder=objFSO.CreateFolder(*C:\FSO")

如果文件夹存在,那么会报错说"fileexists\基于此,你需要在创建文件夹的之前检查

文件对象是否存在。

Note:ESO只能在本地创建文件夹。如果你想在远程的计算机上创建文件夹,你需要用到

wshcontroller对象。你可以在本地创建文件夹然后用WMI来将文件夹移动到远程的计算

机上。(这个文件夹只能先创建再用WMI移动,因为m不支持创建文件夹的方法。)

派删除文件夹

当你要删除文件夹时,例如你用文件服务器存储每一个员工的数据,当这个员工离开单位时,

他的文件夹将被删除。这保证了文件服务器上的磁盘空间,同样,你或许用•个脚本来创建

一个文件夹来存储临时文件,当脚本执行完毕的时候,你会删除这个临时的文件。

DeleteFolder方法使你可以删除文件夹和文件夹下的所有文件。DeleteFolder需要一个单独

的参数:文件夹的完全路径。例如下面脚本用来删除C:\FS0和其它所有的东西。

1SetobjFSO=CreateObject(^Scripting.FileSystemObject^)

2objFSO.DelctcFoldcr(*C:\FS0O

这个方法会立即删除所有的文件,它不会让你确认是否需要删除就将其扔到垃圾筒。

※使用通配符(Wildcards)删除文件夹

脚本的最大的•个优点就是作为一个管理工具,脚本操作可以同时删除许多个项目。例如你

可以用脚本的一个单独的操作就可以删除所有的文件和文件夹,而不用一个一个去删除了。

FSO允许你用通配符来删除-一些特定的文件。例如你希望删除某文件夹下所有以s开头的

文件夹,这可以用下面的命令来完成。当用类似这样的文件夹结构来运行这个的时候,那么

文件夹subfoldcrl,subfoldcr2,scripts都会被删除。

objFSO.De1etel'o1derCC:\FS0\S**)

下面这个脚本用来删除以su开头的文件夹,就是说subfolderl,Subfolder2会被删除。

objFSO.DeleleFolder("C:\FSD\Su*")

通配符只能放在文件路径的最末尾。

例如如下代码将通配符放在路径的中间,会报错:pathnotfound

objFSO.DeleteFolder(",C:\*\Subfolder1*)

※复制文件夹及文件夹卜的内容

复制文件夹和文件夹当中所有数据能力的对于系统管理任务来说非常重要。有时你需要复制

文件夹来创建备份,在计算机A和计算机B上有同样的文件夹,如果计算机B意外的down

掉之后,你就不怕数据丢失了,在其它的时候,你或许希望将含有特定文件的文件夹复制到

很多台计算机上。用脚本来向各个计算机复制这个文件夹比手工复制高效的多。

1、CopyFolder方法允许你复制一个文件夹到另外一个地方。当不用通配符的时候,这个

CopyFoldcr的方法和命令Xcopy/E命令一样:它拷贝所有的文件和子文件夹,包括空的文

件夹。这个命令需要两个参数:源文件夹这个文件夹可以被确定为本地路径(C:\Script)

或者为UNC路径(\\helpdesk\scripts)。目标文件夹-》这个文件夹也可以是本地文件夹和

UNC路径。如果目标文件夹不存在,那么将自动创建一个文件央。此外这个方法有个可选的

参数:Overwrite,当这个参数存在时,默认的情况下脚本会覆盖已经存在的目标文件夹。

Note:CopyFoldcr方法会在遇到错误时停止,即使这个脚本中包含有OnErrorResumeNext

语句。例如你用脚本用来拷贝100的子文件夹,当成功拷贝三个之后,遇到一个错误。这时

脚本会中止,它不去尝试剩下的97的文件夹。

在下例中用CopyFolder的方法来复制文件夹C:\scripts到c:\FS0并且复写目标文件

夹。注意,这个的结果不是C:\ESO\Scripts而是C:\ES0下有和C:\Scripts有同样的文

件。如果你想更改文件夹叫C:\FSO\Scripis,你应该将目标文件夹改为C:\FSO\Scripls

1ConstOverWriteEiles=True

2SetobjFSO=CreateObject(*Scripting.FileSystemObject^)

3objFSO.CopyFolder'C:\Scripls","C:\FSO”,OvcrWritcFilcs

Note:因为这个CopyFolder是一个单独的操作,你没有办法来跟踪它的进程。你只是需要

简单的等待操作的结束。如果你想监视copy

命令的过程,你应该用shell应用程序。

※使用通配符(Wildcards)复制文件夹

用这个CopyFolder命令也可以拷贝所有文件夹和子文件夹下的文件。这样可能导致一个问

题,如果只是想拷贝C:\FS0

下的文件,而不是想拷贝C:\FSO\Subfolderl,C:\FS0\Subfolcer2,C:\FS0\Sbufolder3下

的文件。

可是,不幸的是这里没有直接的办法来不拷贝子文件夹中的文件而只是拷贝父文件夹中的文

件,你可以用通配符来限制子文件夹的拷贝。例如如卜的脚本代码只是拷贝以log

字母开头的文件夹。但是,你用通配符的时候就只是拷贝那些符合特定要求的文件夹才被拷

贝:

objFSO.CopyFolder"C:\Scripls\Log*","C:\Archive”,True

当上面的脚本代码执行的时候,C:\Scripts\logs,C:\Scripts\Logfiles被拷贝了,包括它

们的文件和子文件夹中的文件,但是,在

C:\Scripts的文件没有被拷贝。当你用CopyFolder

方法的时候,你不能只是拷贝文件夹中的文件,而不拷贝子文件夹中的蚊子。如果你想只是

拷贝文件而不拷贝子文件夹的文件,你可以应用CopyEile方法。

※移动文件夹

当你复制一个文件夹从一个地方到另外一个地方的时候,你以身制结束而告终。有时候这个

正是你想要的,但是有的时候,你不需要两份文件的信息,你或许希望将文件夹从计凫机

A移动到计算机B,或者从硬盘C移动到硬盘

D。移动工作总会移动到特定磁盘的剩余空间上。例如你或许会周期的将很少访问的文件夹移

动到存档磁盘中。此外你或许有一个脚本来监视本地计算机的信息,当监视结束的时候,你

需要将它上传到服务器,然后将本地文件删除,然后本地计算机就开始下一次的监视。

MoveFolder需要两个参数:

1、Sourcefolder源文件夹,可以是本地路径或者是UNC路径。

2、Destinationfolder目标文件夹,这个文件系也可是本地或者UNC路径。

如果你的目标文件夹不存在,那么移动是成功的。如果目标文件夹存在,那么不成功。你不

能用这个MoveFolder的方法来覆盖一个文件夹。下例股本中,移动本地的文件夹

C:\Scripts到•个共享的文彳匕夹\\helpdesk\management

1SetobjFSO=CreateObject(*Scripting.FileSystemObject*)

2objFSO.MoveFolder"C:\Scripts","\\helpdesk\management”

注意用MoveFolder

方法当脚本失败后不能循环操作。例如,假如你的网络连接在脚木符文件从一个计算机移动

到另外一个计算机完成前失败了,那么很有可能你一些文件在计算机A上,另外一些文件在

计算机B上,也有可能在移动的过程中丢失一些文件。因为这个MoveFoldcr的方法无法让

脚本恢复到以前状态。

因为如此,你或许需要两个方法来完成文件在网络中的移动:CopyFoldcr和DclelcFoldcr。

你可以用CopyFolder来将文件从计算机A移动到计算机B。当复制的操作结束之后,你用

DeleteF'older来删除计算机A上的文件,当复制操作失败的时候,你可以确保你的文件还

在你的计算机上。

※重命名文件夹

在FSO中没有提供RenameFolcer方法重新命名文件夹。但是瓦以用

MoveFolder方法来将文件夹移动到相对同样的位置,例如假如有文件夹路径如下:

C:\Scripts\PcrformanccMoniloring\Scrvers\DomainControllcrs\CurrentLogs

如果你用Windows浏览器来更改文件夹的名字,那么文件夹还是它本身

C:\Scripts\PerformanceMonitoring\Servers\DomainContro11ers\ArchivedLogs

MoveFolder的方法可以让你完成同样任务,你将

C:\Scripts\PerformanceMonitoring\Servers\DomainControllers\CurrentLogs作为源路

径,将C:\Scripts\PerformanceMonitoring\Servers\DomainControllers\ArchivedLogs

作为目标路径。这样的结果和在windows浏览器中更改文件夹的名字效果是样的。

例如,下例中的脚本将文件夹C:\FSO\Samples更改为C:\FSO\Scripts在脚本运行之前,

Sample是C:\Scripts的文件夹,在脚本运行之后,就是C:\FS0的子文件夹了。此外Scripts

(FSO下的)含有原来Sample

所有的文件和子文件。

1SetobjFSO=CreateObject(*Scripting.FileSystemObject*)

2objFSO.MoveFolder"C:\FSO\Samples","C:\FSO\Scripts”

※获得文件夹属性

因为文件夹是一个COM对象,它们的属性可以被获得和列举出来,为/列举详细的文件夹信

息,你可以用文件夹对象,它是FSO

的组件之一。文件夹对象的属性列举在了下表中。

Attributes关于文件夹的属性信息。

DateCrcated文件夹创建的日期

DateLastAccessed用户最后访问这个文件夹的日期

DateLastModified用户最后更改文件夹属性的日期

Drive磁盘信息包括拖尾符号(比如,C:)标识文件夹所在的磁盘

Files存储在这个文件夹中所有文件的信息。

IsRootFolderBoolean值来表明这个文件夹是否是根文件夹

Name文件夹的名字但不包括路径信息

ParentFolder文件夹存放的父文件夹的名字

PropertyDescription

Path文件夹的路径

ShortNameMS-DOS类型的文件夹的名字,遵循8.3的命名规则。

ShortPathMS-DOS类型的文件夹的名字,遵循8.3的命名规则。

Size文件夹的大小,单位是bytes,包含子文件和子文件夹的大小在内。

SubFolders第•层的子文件夹。在Subfolders中的子文件夹不在此列中。

Type对于文件夹的描述

※列举文件夹的属性

为了得到一个文件夹的属性,一个脚本必须:

1.创建一个FSO实例

2.用GetFolder的方法绑定特定文件夹

3.用Echo的方法显示属性。

当你对一个文件夹的属性进行操作的时候,注意文件的属性和子文件夹的属性是以集合的形

式返回的,不是单独返回一个的。此外Attributes属性返回一个属性值。

1SetobjFSO=CreateObject("Scripting.FileSystemObjectw)

2SetobjFolder=objFSO.GetFolder("C:\FS0")

3Wscript.Echo"Dalecreated:"&objFolder.DateCreated

4Wscript.Echo“Datelastaccessed:"&objl'older.DateLastAccessed

5Wscript.Echo"Datelastmodified:"&objFolder.DateLastModified

6Wscript.Echo"Drive:"&objFolder.Drive

7Wscript.Echo"Isrootfolder:"&objFolder.IsRootFolder

8Wscript.Echo"Name:"&objFolder.Name

9Wscript.Echo"Parentfolder:"&objFolder.ParentFolder

10Wscript.Echo"Path:"&objEolder.Path

11Wscript.Echo“Shortname:"&objFolder.ShortName

12Wscript.Echo"Shortpath:&objFolder.ShortPath

13Wscript.Echo"Size:"&objFoldcr.Size

14Wscript.Echo"Type:"&objFolder.Type

※管理文件夹的属性

文件系统支持属性的定义。就是文件夹中和文件夹名字和文件夹大小无关的信息。例如如果

你在Windows浏览器中右击某个数据夹的时候,点Properties你就可以访问文件夹的属性

了。

FS0可以返回几个关于文件夹信息的重要属性。这些属性和相应的值,列举在下表中:

Hidden2隐藏,就是在Windows浏览器口不可见

System4表示它是一个系统文件夹。建议不要更改系统文件夹的内容。

Directory16应用到所有的文件夹的标准值。所有可以被FSO访问的文件

夹读有这个值,最小位16。

Archive32存盘的属性用在备份程序中,用来决定文件是否需要备份。

如果这个值enabling表示文件夹在卜.一次增量备份中会备份。如果

是disabling表示不在下一次增量备份中备份

Compressed2048友明这个文件夹是否是压缩的

虽然这些看起来很简单,但是从

FS0返回的数据看起来会让你感到很迷惑。例如,你返回一个文件夹的属性值,你或许会看

到20,但是这个值并不是像上面一样的标准值。此外,你可能会获得一个单独的值,虽然这

个文件夹有说有的属性。这种情况是,脚本并不是返回如

2,4,16,32,2048这样的值,而只是返回一个2102。这是因为这些值是以位图的形式显示的。

Note:对于属性值,它返回和存储的数据是以位图的形式的。对于位图你应该不会奇怪,比

如后缀名为.bmp的图形文件

位图看起来就是一系列的开关,如果特定的开关是关闭的,那么这个开关的值就是0,如果

是开启的,比如文件夹对象吧,它就具有上表中所列出的值。而位图的值就是这些开关的值

的总和。如果你用脚本查询这个文件夹的属性,脚木就返I可一个值为16.

与其相反,如果有三个开关是开启的:隐藏(值是2),Directory(值是16),压缩(值是2048).

那么这个位图的值应该是2+15+2048,或者值是2066。这个也是用脚本查询的时候返回的值。

位图被设计成只是有一种办法来获取特定的值。得到值2066的方法只有一个就是压缩和隐

藏.你不可能通过别的数学方法来算得这样的值。

这个设计可以返回值并且决定哪个开关没有开哪个没有开。这个可以允许你来判断文件夹的

哪个属性设定了。如果你得到了这个2066

的值,那么它的属性就是隐藏压缩的文件夹。幸运的是,你不必去作任何单独的数字运算,

你可以用逻辑与AND操作来决定哪个开关是否是on还是off。例如如下代码查询文件夹是

否是隐藏的,如果是回显一个信息框:Hiddenfolder

IfobjFolder.AttributesAND2Then

Wscript.Echo"Hiddenfolder.z,

EndIf

或者:IfobjFolder.AttributesAND16Then

下列脚本先绑定文件夹C:\FS0,然后回显文件夹属性:

(译者注:这个其实是挨个匹配的,所以你耍是测试/两个属性,它都会显示出来的。)

1SetobjFSO=CreateObject("Scripting.FileSystemObject")

2SetobjFolder=objFSD.GetFolder("C:\FS0")

3IfobjFolder.AttributesAND2Then

4Wscript.Echo“Hiddenfolder.*

5EndIf

6IfobjFolder.AttributesAND4Then

7Wscript.Echo"Systemfolder.*

8EndIf

9IfobjFolder.AttributesAND16Then

10Wscript.Echo"Folder.

11EndIf

12IfobjFolder.AttributesAND32Then

13Wscript.Echo"Archivebitset.*

14EndIf

15IfobjFolder.AttributesAND2048Then

16Wscript.Echo^Compressedfolder.”

17EndIf

※改变文件夹属性

文件夹的每个属性可以看成一个个开关,如果关于隐藏的开关是ON的,那么这个文件夹就

是隐藏的,如果这个开关是0即

的,那么这个文件夹就不是隐藏的,你可以选择打开或者关掉它们,对于文件夹的属性也是

如此:对于其它的开关,你可以将属性设置为开或者设置为关,你可以用脚本来控制这些开

关的,最简单的控制属性开关的办法是用如卜•的程序:

1.用GetFolder的方法来绑定到一个文件夹。

2.检查你需要更改的值。例如你想隐藏一个文件夹,看这个文件夹是否是已经隐藏了

3.如果这个文件夹是隐藏的,用XOR操作来将开关转换成非隐藏的。如果这个文件夹不是

隐藏的,注意不要用

XOR,如果你用了,开关会被触发,文件夹会中止于隐藏。例如,下列脚本用AND来判断文

件夹C:\FS0的隐藏属性开关是否开着。如果它是开的,脚本用X0R

操作来将开关关闭来显示文件夹。

1SetobjFSO=CreateObject(^Scripting.FileSystemObject/7)

2SetobjFolder=objFSO.GetFolder("C:\FS0")

3IfobjFoldcr.AttributesAND2Then

4objFolder.Attributes=objl'older.AttributesXOR2

5EndIf

除非很少的一些情况以外,文件夹用来作为单独存放文件的地方。有时候,这些文件夹是系

统需要的。例如操作系统希望在特定的文件夹内找到特定的文件。在其它的•些时候,文件

夹是系统管理员管理计算机的一种工具也是用户管理文件的工具。系统管理员可能希望将脚

本放在叫做Scripts

的文件夹,将一些trouble-shooting的工具放在叫做DiagnosticTools的文件夹。用户

或许将他们预算信息放在叫做Budgets

的文件夹,而将薪水的信息放在叫做Timecards

的文件夹。当然,文件夹一般是限制使用的,你必须知道这个文件夹是存放的是什么文件。

系统管理员需要知道是不是有个特定的脚本存在C:\Scripts文件夹中,用户需要知道是不

是有个特定的窗体存在C:\Budgcts的文件夹中。文件夹对象包含了一些属性可用来返回存

储在文件夹内文件集合的信息,为了得到这些信息,你的脚本必须:

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

2.用GetFolder的方法来绑定到一个适当的文件夹。

3.设置一个对象reference来指向文件夹的属性

4.用ForEach循环来列举出所有的文件和他们的属性。脚本不必去绑定到每一个单独的文

件去获得文件的信息。

在卜列脚本中返回在文件夹C:\FS0卜所有文件的信息并且回显他们的名字和大小:

1SetobjFSO=CreateObject(^Scripting.FileSystemObject/,)

2SetobjFolder=objFS。.GetFolder("C:\FS0")

3SetcolFiles=objFolder.Files

4ForEachobjFileincolFiles

5Wscript.EchoobjFile.Name,objFile.Size

6Next

对于大多数返回的集合来说,你不能控制输出信息的顺序。就是说你不能将输出的格式定义

为按照名字,按照大小或者其它别的原则。如果你想让输出的东西按照特定的格式,你就必

须将他们拷贝到数组,目录或者一个disconnectedrecordset然后将他们分类排列。

©VBS脚本运行库手册之三一一子文件夹

为了需要知道文件夹中存放的文件,你需要知道文件夹子文件夹,这样,你才能更好的了解

文件夹的整体结构。文件夹对象包含了一个Subfolders属性,用来放会在文件夹下的

top-level子文件夹的信息。

Top-level子文件夹是直接在文件夹下面的。在子文件夹中的子文件夹不在这个范围之内。

例如,在下例中,只有SubfolderlSubfolder2

是文件夹scripts的lopTcvcl的子文件夹。所以,如果用Subfolders这个属性来返回

值的话,就只是会返回Subfolderl和Subfolder2

为了得到一个子文件夹的集合,你的脚本必须:

1.创建一个FSO实例

2.用GetFolder的方法绑定到一个文件夹。

3.创建一个对象reference来表示Subfolders属性。这个是一个集合对象,因为它含有

很多个对象。

在得到了对象reference这样一个集合之后,你可以用一个ForEach循环来列举出子文件

夹。下列脚本绑定到文件夹

C:\FS0,然后返回子文件夹的大小和名字。除/文件夹的名字之外,你可以返回信息。

1SetobjFSO=CreateObject(^Scripting.FileSystemObject,z)

2SetobjFolder=objFSO.GetFolder(*C:\FS0")

3SetcolSubfolders=objFolder.Subfolders

4ForEachobjSubfolderincolSubfolders

5Wscripl.EchoobjSubfolder.Name,objSubfolder.Size

6Next

和你的文件系统的设计有关,有时知道top-level

的了•文件夹就可以提供足够的文件夹结构的信息。在多数文件系统中,文件夹是嵌套的,或

者是被嵌套的。关于子文件夹的集合可以告诉你C:\Accounting包含两个子文件夹2001、

2002,但是它不能告诉你他们的子文件夹的信息。

幸运的是,你可以用递归来杳询一系列子文件夹的的信息。例如用Subfolders属性返回了

一些top-level的子文件夹:

为返回完整的一系列子文件夹的信息、,你需要用递归函数。这个函数用来调用它自己。下面

脚本可以列举出文件夹的所有子文件夹:

1.创建一个FSO对象实例

2.用GetFolder的方法来绑定到文件夹C:\Scripts.GetFolder的方法用来返回文件夹对

象C:\Scripts.然后这个

C:\Scripts作为递归了一函数ShowSubPolders的参数。这个子程序会列举出所有的

C:\Scripts下的子文件夹。返回一个包含在

C:\Scripts下所有子文件夹的信息。这个集合有两个值:Subfolderlfl!Subfolder2.

4.返回第一个参数的路径Subfolder]。这个子程序用这个来作为参数将它输入给它自身。

换句话说,脚本现在调用ShovSubFolders,并且参数是Subfolderlo

5.返回在Subfolderl中的所有参数。这个集合有两个值:SubfolderlAandSubfolderIB.

6.回显第一个集合的路径,SubfolderlAo子程序用这个来作为参数调用自日。换句话说,

就是用ShowSubFolders这个函数,那么它的参数是SubfolderlA来作参数。

7.继续执行下一个参数。因为在SubfolderlA中没有了子文件夹。这个子程序用

SubfoldcrlB作为参数。

8..完成了关于文件夹Subfolderl的循环。这个过程结束在SubfolderlB没有子文件夹。

脚本然后用Subfolder2

来作为参数,并且用行上面整个过程。

1SetFSO=CreateObject(*Scripting.FileSystemObject,,)

2ShowSubFoldersFSO.GetFolder("C:\Scripls")

3SubShowSubFoldcrs(Folder)

4EorEachSubfolderinFolder.SubFolders

5Wscript.EchoSubfolder.Path

6ShowSubFoldcrsSubfolder

7Next

8EndSub

当用CScripl运行的时候,命令行中显示如下:

C:\scripts\Subfoicler1

C:\scripts\Subfolderl\Subfolder1A

C:\scripts\Subfolderl\SubfoldcrIB

C:\scripts\Subfoider2

C:\scripts\Subfolder2\Subfolder2A

C:\scripts\Subfolder2\SubColder2A\Subfolder2A-1

C:\scripts\Subfolder2\Subfolder2B

C:\scripts\Subfolder2\Subfolder2C

为了获得完整的文件夹列表,你可以从根文件夹查起:比如C:\

◎VBS脚本运行库手册之四一一管理文件

ManagingFiles

管理文件系统的最终任务还是归结为管理单独的文件。作为一个系统管理员,你的工作是跟

踪存储在计算机上的文件。例如,你需要知道正确的诊断工具是否被克制到「server上,

你需要知道特定的文件(比如游戏文件或者音乐文件)是否被复制到了文件服务器上了,尽

管你用了组策略去阻止他们将文件拷贝到文件的server。你需要知道是否有的文件放在计算

机上已经有几个月没有去访问了,而这些功能通过类似知道磁盘的剩余空间这样的操作是无

法知道的。此外为了跟踪这些文件,你也需要动态的管理他们:需要复制,需要移动,需要

重新命名,需要删除。FSO提供了一些方法来帮助你完成这些管理任务。

BindingtoaFile

FSO给你提供了一些方法,比如CopyFile,DeleteFile

允许你的脚本不用绑定一个特定的文件就可以对文件实例进行操作。而其它的任务,就需要

文件对象。比如,为了获得一些属性,你的脚本首先就需要绑定到•个文件,然后再获得文

件的属性。GetFile方法允许你绑定到一个独立的文件。为了做到这点,你先创建一个FSO实

例,然后创建一个文件对象。当你用GetFile方法的时候,你必须:1、确定文件的路径:

这个路径可以是一个本地路径,也可以是一个UNC路径(例如:

\\accounting\receivables\scriptlog.txt)在路径当中你不能用通配符也不能有多个文件。

用GetFile方法你在同一个时刻只能绑定一个单独的文件。2、当绑定的对象分配给一个变

量的时候就要用到Set这个关键词。

例如,卜,面脚本绑定到了文件:C:\FSO\Scripllog.1x1

1SetobjFSO=CreateObject(*Scripting.FileSystemObject*)

2objFSO.GetFile(,zC:\FSO\ScriptLog.txt*)

一般来讲,你最好用绝对路径来作GetFile的参数。这样确保脚本总是可以在文件中运行。

但是,用相对路径也是可以的,例如,如下的脚本代码会绑定到

Scripllog.txt会成功,因为脚本和这个文件在同一个文件夹旦面:

objFSO.GetEile(*ScriptLog.txt*)

同样,下面的代码实例如果这个脚本和这个文件在同-一个文件夹也会绑定到Scriptlog.txt:

objFSO.GetFile(*.\ScriptLog.txt*)

注意:FSO不会用路径环境信息去搜索文件。例如,你可以在命令行中敲如calc.exe来打

开计算机,而无论你当前的目录是在哪里,因为操作系统默认的情况下去搜索所有的文件的。

但是用这个GetFile方法的时候,它不是这样的工作的。

如卜脚本除非是在文件夹C:\Windows\System32的文件夹下,否则都不会运行成功的。

objFSO.GetFile("calc.exe")

有时知道文件是否存在是十分重要的,这个可以作为软件清单的•部分。例如你或许希望检

查所有的邮件服务器来看特定的脚本是否存在。用脚本来实现系统管理任务来说,知道脚本

存在与否很重要的。比如你或许希望当你复制、移动、删除或者操作不存在的文件的时候,

脚本报错。为了避免出现错误,你可以用FileExists方法来检杳文件是否存在。FileExists

方法要求一个单独的参数:文件的路径,然后返回一个特定的Boolean值:如果文件存在,

返回的是True,如果文件不存在,返回的是False。

如下面脚本用FileExists方法来检查文件C:\FSO\Scripilog.txt是否存在,如果存在,

用GetFile方法来绑定到这个文件,如果不存在,脚本回显一个message“filedoesnot

exist”

1SetobjFSO=CreateObject(^Scripting.FileSystemObjectz,)

2IfobjFSO.FileExistsC^C:\FSO\ScriptLog.txt*)Then

3SetobjFile=objFSO.GetFileCC:\ESO\ScriptLog.txt*)

4Else

5Wscript.Echo“Filedocsnotexist.?

6EndIf

你不能用通配符来检查文件夹中特定类型的文件是否存在,你也不能用通配符拉来检查文件

夹中所有的文件­。如下面脚本,无论在文件夹

C:\FS0\下存在多少文件,都不会报错出来,而是总是返回一个False.

WScript.EchoobjFSO.FileExists(*C:\FS0\*.*")

如果你希望遵循一些条件原则检行一些文件而不是基于路径,你有下面两个选择:

1、用GetFolder

对象来绑定一个文件夹,然后返回文件的属性,这样重复操作直到筛选出你感兴趣的。例如,

你可以列举出所有的文件和文件的扩展名,然后跟踪看有多少个后缀名

为.doc的文件。

2、用m,它允许你创建更多的Fl标查询。比如选出所有后缀名为.doc的文件。你可以用

计数的办法来返回你要的特定为条目。如果数值是0,那么,最少有一个是.doc的文件。

DeletingaFile

用FS0来创建脚本删除文件让你可以自动执行类似与磁盘清理之类的操作。例如,你可以用

脚本定期查询和删除所有的临时文件。你也可以依照一些规则来删除文件,比如删除六个月

都没有被访问的文件,或者特定的后缀名的文件,比如(.bmp或者.mp3)你可以首先创建FS0

对象实例,然后调用DcleteFile方法来删除文件,输入文件路径作为参数。

如下面脚本删除了文件C:\FSD\Scriptlog.txt

1SetobjFSO=CreateObject(^Scripting.Fi]eSystemObjectz,)

2objFSO.DclctcFilcrC:\FSO\ScriptLog.txt*)

默认的情况下,DeleteFile方法不会删除只读文件。事实上,当你尝试删除一个只读文件时,

脚本会报错出来。为了避免这样的错误出现,如想删除只读文件的话,需添加强制参数,当

强制参数设成True

的时候,那么DelcteFile可以删除任何文件。如下面这行代码可以删除文件

Scriptlog.txt,即使它只是一个只读文件。

1、objFSO.DclctcFilcC^C:\FSO\ScriptLog.txt*,True)

2、DeletingaSetofFiles

有时候你希望删除特定的、单独的文件。更有可能的是你可能想用脚本来删除一系列的文件。

如在周末你或许想删除一些存盘了的日志文件或所有的临时文件。你可以通过通配符来删除

一个文件夹之内的一些文件。但是你不能用DcleteFile方法来直接删除多个文件夹内部的

文件。你可以通过用筛选每个数据夹的办法来逐个删除每个文件夹内部的文件。如果你想删

除多个文件夹内部的特定类型的文件(比如删除计算机上全部的.TMP文件)你应该用m而

不是用FS0o为了删除一系列文件,调用DcleteFile方法,杈据文件的名字或者后缀名添

加通配符来提供文件夹的路径,例如,下面的代码用来删除文件夹C:\FSO文件夹下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论