2024年3月7日发(作者:)

Vbs脚本编程简明教程之一—为什么要使用Vbs?在Windows中,学习计算机操作也许很简单,但是很多计算机工作是重复性劳动,例如你每周也许需要对一些计算机文件进行复制、粘贴、改名、删除,也许你每天启动计算机第一件事情就是打开WORD,切换到你喜爱的输入法进行文本编辑,同时还要播放优美的音乐给工作创造一个舒心的环境,当然也有可能你经常需要对文本中的某些数据进行整理,把各式各样的数据按照某种规则排列起来……。这些事情重复、琐碎,使人容易疲劳。第三方软件也许可以强化计算机的某些功能,但是解决这些重复劳动往往事倍功半,我也尝试过使用计算机语言编写程序来解决这些问题,但是随之而来的命令、语法、算法、系统框架和类库常常让我觉得这样是否有必要,难道就是因为猪毛比较难拔,所以我就要去学习机械,为自己设计一个拔猪毛机(?)吗?Vbs是一种Windows脚本,它的全称是:MicrosoftVisualBasicScriptEditon.(微软公司可视化BASIC脚本版),VBS是VisualBasic的的一个抽象子集,是系统内置的,用它编写的脚本代码不能编译成二进制文件,直接由Windows系统执行(实际是一个叫做宿主host的解释源代码并执行),高效、易学,但是大部分高级语言能干的事情,它基本上都具备,它可以使各种各样的任务自动化,可以使你从重复琐碎的工作中解脱出来,极大的提高工作效率。我个人认为Vbs脚本其实就是一种计算机编程语言,但是由于缺少计算机程序设计语言中的部分要素,对于事件的描述能力较弱,所以称为脚本,它最方便的地方就是提供了对COM对象的简便支持。那么什么是COM对象呢?我这样理解,COM对象就是一些具有特定函数功能项程序模块,他们一般以ocx或者dll作为扩展名,你只要找到包含有你需要的功能的模块文件,并在脚本中规范的引用,就可以实现特定的功能,也就是说Vbs脚本就是调用现成的“控件”作为对象,用对象的属性和方法实现目的,完全免去了编写代码、设计算法等等麻烦。说白了,我不是觉得拔猪毛麻烦么?我发觉xx机(比如真空离心器)有一个功能可以实现脱毛,ok,我把它拿来给猪脱毛。什么?大材小用?太浪费资源了?天哪,那是计算机芯片的事情,死道友不死贫道,反正我的事情是方便快速的解决了,这就行了。最方便的是它甚至不需要专门的开发环境,在你的计算机中,只要有notepad,就可以编写Vbs脚本了,并且可以直接执行。===============================Vbs脚本编程简明教程之二—如何开始第一个Vbs脚本?就像多数计算机教程一样,我们从“HelloWorld!”程序开始我们的练习。什么?不知道是什么意思?就是说大部分的计算机程序设计教程开篇入门都是编写一个小程序,执行这个程序的结果就是在计算机的屏幕上或者dos窗口中显示一行文字:HelloWorld!好了,我们开始吧。打开你的“记事本”程序,在编辑窗口填写:msgbox"HelloWorld!"然后用鼠标单击“文件”菜单,单击“保存”,把“保存在”一栏设为桌面,在“文件名”一栏中填写,单击“保存”就可以了。然后最小化“记事本”窗口,在桌面上寻找你刚刚保存的,然后双击。看到弹出的对话框了没有,单击“确定”,对话框消失了。难看了点,不过确实是你编写的第一个脚本程序。说明之一:上面的操作中,保存位置放在桌面,仅仅是为了执行方便,你保存到其他的地方完

全没有问题,只要你知道你保存在什么地方就可以了,什么?是废话,自己保存的当然知道保存在那里了。不,自己保存的文件自己找不到的人我见的多了去了。文件名你可以随意填写,不一定非要写kk,只要符合Windows的文件命名规则就可以了,但是扩展名必须是vbs,什么?不知道什么是扩展名?就是文件名中“.”后的那部分,简单说,就是vbs脚本文件命名时必须是:,其中xxx你随意。说明之二:在记事本编辑窗口中写的这行是什么意思?Msgbox是VBS内建的函数,每一个函数都可以完成一定的功能,你只需要按照语法要求,在函数的相应部分填写相应的内容就可以了,这部分内容我们称为参数,当然函数执行的结果我们称为返回值,一个函数可以有返回值也可以没有,可以有参数也可以没有。你不用了解函数是怎么运作的,只要了解这个函数能干什么就行了。Msgbox语法:msgbox"对话框内容",,"对话框的标题"你不妨用记事本打开刚才的文件在编辑窗口中输入:msgbox"HelloWorld!",,"系统提示"执行一下,看看效果和位置。说明之三:如果执行失败,看看你的标点符号,所有的标点符号必须是在英文状态下输入的。当然,这个脚本实在是太简单了,甚至连最简单的交互都没有,所以你可以把脚本这样修改一下:Dimnamename=Inputbox("请输入你的名字:","名称")Msgboxname,,"您的名字是"保存执行一下,看到弹出的对话框了么?填入你的名字,点确定,看到结果了吗?说明之一:第一句是定义变量,dim是定义变量的语句其格式为:dim变量1,变量2……,Vbs只有一种变量类型,所以不用声明变量类型。系统会自动分辨变量类型。说明之二:inputbox是VBS内建的函数,可以接受输入的内容,其语法格式为:Inputbox("对话框内容","对话框标题")第二句的意思是接受用户的输入,并把输入结果传递给变量name。好了,到此脚本基本的输入输出函数都有了,已经可以完成一些比较简单的功能了,你可以编写一个简单的脚本,然后拷贝的“程序”—>“启动”中,然后重新启动计算机看看结果。=====================================Vbs脚本编程简明教程之三—Vbs的基本语法(牢记)

VBScript基础知识一、变量1、所有单引号后面的内容都被解释为注释。2、在VBScript中,变量的命名规则遵循标准的命名规则,需要注意的是:在VBScript中对变量、方法、函数和对象的引用是不区分大小写的。在申明变量时,要显式地申明一个变量,需要使用关键字DIm来告诉VBScript你要创建一个变量,并将变量名称跟在其后。申明多个同类型变量,可以用逗号分隔。注意:VBScript中不允许在申明变量的时候同时给变量赋值。但是允许在一行代码内同时对两个变量进行赋值,中间用冒号分隔。3、你可以使用OptionExplicit来告诉宿主变量必须先声明后使用。4、VBScript在定义时只有一种变量类型,在实际使用中需要使用类型转换函数来将变量转换成相应的变量类型。Cbool函数将变量转换成布尔值;Cbyte函数将变量转换为0到255之间的整数。Ccur函数、Cdbl函数和Csng函数将变量转换为浮点数值,前者只精确到小数点后四位,后两者要更加精确,数值的范围也要大的多。Cdate函数将变量转换为日期值。Cint函数和Clng函数将变量转换为整数,后者的范围比前者要大的多。Cstr函数将变量转换为字符串。二、数组数组的定义与变量非常类似,只需要在变量后描述这个数组的个数和维数。需要注意的是:数组的下标总是从0开始,而以数组定义中数值减一结束。也就是说你以要定义一个有十个数据的数组,将这样书写代码:dImarray(9),同样,当你要访问第五个元素时,实际的代码是array(4)。当然,你可以通过不指定数组的个数和维数来申明动态数组。等到数组的个数和维数固定后,使用关键字redim来改变数组。注意,在改变数组的大小时,数组的数据会被破坏,使用关键字preserve来保护数据。例如:RedIm空格preserve空格array括号个数逗号维数括号三、操作符在VBScript运算符中,加减乘除都是我们常用的符号,乘方使用的是^,取模使用的Mod。在比较操作符中,等于、小于、大于、小于等于、大于等于都与我们常用的符号是一致的,而不等于是小于和大于连用。

逻辑运算符为:和操作—>AND非操作—>NOT或操作—>OR;你可以使用操作符+和操作符&来连接字符串,一般使用&操作符;另外还有一个比较特殊的操作符Is用来比较对象,例如按钮对象,如果对象是同一类型,结果就是真,如果对象不是同一类型,结果就是假。四、条件语句主要有if……then语句和selectcase语句两种形式在if……then语句中,其基本形式为:If条件then处理条件的语句;……Endif基本形式只能对单个条件进行验证,如果有两个条件,则需要在基本形式中添加单行语句else,如果还有更多的条件需要验证,则需要添加语句Elseif条件then处理条件语句在selectcase语句中,其基本形式为:Selectcase变量Case条件值处理条件语句并对上两句进行重复最后一句应为caseelse处理语句当然不要忘记将条件结束语句Endselect放在最后一行注意:在执行字符串比较时,需要特别注意大小写,一般情况下,我们在比较前,使用lcase函数将字符串转换成小写,使用ucase函数将字符串转换成大写大写。

五、循环控制语句循环控制语句有for……next循环、for……each循环、do……while循环、do……until循环、while循环五种形式。在使用循环控制语句前,首先要对循环条件进行判断,如果循环次数是有固定次数的,那么使用For……next循环,其结构为:For计数器变量=开始计数值to最后计数值执行循环体Next如果是需要对数组或对象集合中的每一个元素进行判断,则需要使用for……each循环,其结构为:Foreach循环计数变量执行处理语句Next注意:在上述两种循环中随时可以使用exitfor来退出循环in要查看的对象或数组如果你希望在条件满足时执行一段代码则使用do……while语句,结构为:Dowhile执行循环体Loop如果你希望在条件不满足时执行代码,则使用do……until语句,结构为:Dountil执行循环体Loop当然,在这两种循环语句中,你可以使用exitdo来退出循环条件条件最后一种循环语句是条件满足时一直执行循环,While条件执行循环体Wend

六、使用过程常用的过程有两种,一种为函数,给调用者返回值,一种为子程序,无返回值,还有一种叫事件的特殊子程序,用的比较少。函数的基本定义方法为:Function函数代码函数名称=某值‘用来返回值endfunction子程序一些都类似,不过没有返回值注意:尽管在定义子程序的时候,参数列表要加括号,但在调用子程序的时候,参数列表不加括号,括号只在函数中使用。另外,子程序不能在表达式中使用。而函数只能出现在赋值语句的右边,或者表达式中,函数不能直接使用,如果必须直接使用函数,则必须使用call语句调用,并取消返回值。===================================Vbs脚本编程简明教程之四—如何利用Vbs运行外部程序?Vbs只提供了编程的一个基本框架,用户可以使用Vbs来定义变量、过程和函数,vbs也提供了一些内部函数和对象,但是Vbs没有提供任何命令来访问Windows系统内部的部件,但是值得庆幸的是,Vbs虽然不能自己完成这些任务,但是它提供了一条极为方便、功能也相当强的命令——CreateObject,这条命令可以访问windows系统内安装的所有com对象,并且可以调用这些部件中存放的命令。于是问题解决了,比如说,我手头有1000个小文本,我首先要对每一个文本的语法进行查错和修改,然后按照预先定义好的规则对这些文本进行排序,最后将这些文本合并成为一个文件。正常情况下,我们需要把打开第一个小文本,然后把它复制到WORD中,然后利用里面的除错功能进行除错和修改,然后再导入到EXCEL中进行排序,将这个过程重复1000遍,然后再将所有得到的文本复制到一个大文本中。实在是太枯燥、工作量太大了。有了Vbs和CreateObject,问题得到解决,我只需要找到相应的模块,调用相应的功能就可以了,作为脚本,把一个枯燥的过程重复1000次,本就是它的拿手好戏。好了,我们走入正题,从最简单的——只启动一个程序开始。WSH也就是用来解析Vbs的宿主,本身包含了几个个常用对象:1、stemObject2、nary3、—>—>—>提供一整套文件系统操作函数函数名称(参数列表)用来返回存放键值对的字典对象提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、

读取DOS环境变量,读取链接中的设置4、k—>提供网络连接和远程打印机管理的函数。(其中,所有Scripting对象都存放在文件中,所有的Wscript对象都存放在文件中。)现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:SetobjShell=CreateObject(“”)“notepad”同样,保存执行。那么看到了一个什么样的结果呢?在桌面上又打开了一个记事本。说明之一:Set是Vbs指令,凡是将一对象引用赋给变量,就需要使用set关键字。那么什么是对象引用呢?凡是字符串、数值、布尔值之外的变量都是对象引用。Objshell是变量名,可以随意修改。说明之二:凡是正确引用的对象,其本身内置有函数和变量,其引用方法为在变量后加“.”,后紧跟其实现功能的函数就可以了。的意思就是调用中的运行外部程序的函数——run,notepad是记事本程序的文件名。当然你也可以改成“calc”,这是计算器的文件名,winword是word的文件名,等等吧,所有可执行文件的文件名都可以。但是需要注意的是,如果你要执行的可执行文件存放的地方不是程序安装的常用路径,一般情况下,需要提供合法的路径名,但是run在运行解析时,遇到空格会停止,解决的方法是使用双引号,例如:在我的机器上运行qq,代码为:"""C:"""好,我们再进一步,启动两个程序会如何呢?输入如下代码:SetobjShell=CreateObject(“”)“notepad”“calc”执行会如何呢?两个程序基本上同时启动了。如果我们需要先启动notepad再启动calc将如何呢?很简单在需要顺序执行的代码后加,,True参数就可以了。好了输入代码:SetobjShell=CreateObject(“”)“notepad”,,“calc”‘注:三个引号

看看执行的结果怎么样吧!总结:run函数有三个参数,第一个参数是你要执行的程序的路径,第二个程序是窗口的形式,0是在后台运行;1表示正常运行;2表示激活程序并且显示为最小化;3表示激活程序并且显示为最大化;一共有10个这样的参数我只列出了4个最常用的。第三个参数是表示这个脚本是等待还是继续执行,如果设为了true,脚本就会等待调用的程序退出后再向后执行。其实,run做为函数,前面还有一个接受返回值的变量,一般来说如果返回为0,表示成功执行,如果不为0,则这个返回值就是错误代码,可以通过这个代码找出相应的错误。=========================================Vbs脚本编程简明教程之五—错误处理引发错误的原因有很多,例如用户输入了错误类型的值,或者脚本找不到必需的文件、目录或者驱动器,我们可以使用循环技术来处理错误,但是VBS本身也提供了一些基本技术来进行错误的检测和处理。1、最常见的错误是运行时错误,也就是说错误在脚本正在运行的时候发生,是脚本试图进行非法操作的结果。例如零被作为除数。在vbs中,任何运行时错误都是致命的,此时,脚本将停止运行,并在屏幕上显示一个错误消息。你可以在脚本的开头添加OnErrorResumeNext这行语句可以告诉vbs在运行时跳过发生错误的语句,紧接着执行跟在它后面的语句。发生错误时,该语句将会把相关的错误号、错误描述和相关源代码压入错误堆栈。2、虽然OnErrorResumeNext语句可以防止vbs脚本在发生错误时停止运行,但是它并不能真正处理错误,要处理错误,你需要在脚本中增加一些语句,用来检查错误条件并在错误发生时处理它。vbscript提供了一个对象err对象,他有两个方法clear,raise,5个属性:description,helpcontext,helpfile,number,sourceerr对象不用引用实例,可以直接使用,例如:onerrorresumenexta=11b=0c=a/<>&ption&endif=====================================Vbs脚本编程简明教程之六—修改注册表Vbs中修改注册表的语句主要有:

1、读注册表的关键词和值:可以通过把关键词的完整路径传递给wshshell对象的regread方法。例如:setws=object("")v=d("HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunnwiz")2、写注册表使用wshshell对象的regwrite方法。例子:path="HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun"setws=object("")t=te(path&"jj","hello")这样就把HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunjj这个键值改成了hello.不过要注意:这个键值一定要预先存在。如果要创建一个新的关键词,同样也是用这个方法。path="HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionrunsssa2000love"setws=object("")val=te(path,"nenboy")val=d(path)l删除关键字和值使用regdelete方法,把完整的路径传递给regdelete就可以了例如val=(path)注意,如果要删除关键词的值的话一定要在路径最后加上“”,如果不加斜线,就会删除整个关键词。====================================

Vbs脚本编程简明教程之七—FSO的常见对象和方法文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,在Vbs中对桌面和文件系统进行访问的顶级对象是FileSystemObject(FSO),这个对象特别复杂,是vbs进行文件操作的核心。此节内容应了如指掌。FSO包含的常见对象有:Drive对象:包含储存设备的信息,包括硬盘、光驱、ram盘、网络驱动器Drives集合:提供一个物理和逻辑驱动器的列表File对象:检查和处理文件Files集合:提供一个文件夹中的文件列表Folder对象:检查和处理文件夹Folders集合:提供文件夹中子文件夹的列表Textstream对象:读写文本文件FSO的常见方法有:BulidPath:把文件路径信息添加到现有的文件路径上CopyFile:复制文件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对象====================================Vbs脚本编程简明教程之八—FSO中文件夹的基本操作1、使用fso由于fso不是wsh的一部分,所以我们需要建立他的模型例如setfs=object(“stemobject”)这样就建立了fso的模型。如果要释放的话也很简单,setfs=nothing2、使用文件夹在创建前,我们一般需要检查该文件夹是否存在例如:dimfs,s//定义fs、s两个变量setfs=object(“stemobject”)//fs为FSO实例if(exists(“c:temp”))then//判断c:temp文件夹是否存在s=”isavailable”elses=”notexist”

setfoldr=folder(“c:temp”)//不存在则建立endif删除:setfs=object(“stemobject”)folder(“c:windows”)拷贝:setfs=object(“stemobject”)lder“c:data”“d:data”注意:如果c:data和d:data都存在,脚本会出错,复制也就会停止,如果要强制覆盖,使用lder“c:data”“d:data”,true移动:setfs=object(“stemobject”)lder“c:data”“d:data”我们可以使用统配符,来方便操作:例如,lder:c:datate*”,“d:working”注意:在目的路径最后没有使用“”也就是说我没有这样写:lderc:datate*”,“d:working”这样写的话,如果d:working目录不存在,windows就不会为我们自动创建这个目录。注意:上面我们所举的例子都是在利用fso提供的方法,如果使用folder对象也完全是可以的:setfs=object(“stemobject”)setf=der(“c:data”)//删除文件夹c:data。如果有子目录,也会被删除//拷贝到d:“d:working”,“d:temp”//移动到d:temp

3、特殊文件夹一般指的就是系统文件夹:windowssystem32,临时文件夹,windows文件夹,在前几篇的时候,我们提过一下:例如setfs=object(“stemobject”)setwshshell=object(“”)osdir=environmentstrings(“%systemroot%”)setf=der(osdir)当然,还有简单的方法那就是使用getspecialfolder()这个方法使用3种值:012表示windows文件夹,相关常量是windowsfolder系统文件夹,相关常量是systemfolder临时目录,相关常量temporaryfolder例如:setfs=object(“stemobject”)setwfolder=cialfolder(0)‘返回windows目录setwfolder=cialfolder(1)‘返回system32setwfolder=cialfolder(2)'返回临时目录=================================Vbs脚本编程简明教程之九—妙用SendKeys简化重复操作1每次开机的时候,你想自动登陆你的QQ或者博客吗?巧妙使用VBS中的SendKeys命令(这个命令的作用就是模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行),可以极大的方便我们的常用操作。其使用格式为:ysstring其中:Object:为WshShell对象,即脚本的第一行为:SetWshShell=Object("")将Object替换为WshShell

“string”:表示要发送的按键指令字符串,需要放在英文双引号中。它包含如下内容:1.基本键:一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“ys"x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“cfan”,可以使用“ys"cfan"”。2.特殊功能键:对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示:Shift——+;Ctrl——^;Alt——%如要发送的组合按键是同时按下Ctrl+E,需要用“ys"^e"”表示,如果要发送的组合按键是按住Ctrl键的同时按下E与C两个键,这时应使用小括号把字母键括起来,书写格式为“ys"^(ec)"”,这里要注意它与“ys"^ec"”的区别,后者表示组合按键是同时按住Ctrl和E键,然后松开Ctrl键,单独按下“C”字母键。由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢?只要用大括号括住这些字符即可。例如,要发送加号“+”,可使用“ys"{+}"”。另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称,例如要发送回车键,需要用“ys"{ENTER}"”表示,发送向下的方向键用“ys"{DOWN}"”表示。如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键数字}”。例如要发送10个字母“x”,则输入“ys"{x10}"”即可。例一:ys"^{ESC}u"代码的含义为:按下Ctrl+Esc组合键(相当于按Win键)打开“开始”菜单,接着按U键打开“关机”菜单。例二:让VBS脚本自动在记事本中输入一行文字“hello,welcometocfan”。DimWshShellSetWshShell=Object("")"notepad"2000//本行的含义为是脚本暂停2秒,给notepad一个打开的时间,有时时间太短可能导致后面的字符无法进入编辑区ivate"无标题-记事本"题-记事本”内容你的自己打开看一下ys"hello,welcometocfan"作业1:让脚本自动输入下面两段小短句//AppActivate为寻找可执行程序的标题框,”无标

ThisisthemostwonderfuldayofmylifebecauseI'mherewithyounow作业2:让脚本在输入短句后自动关闭记事本,并保存文件名为“test”,注意关闭记事本可以直接使用组合按键Alt+F4来实现。==========================Vbs脚本编程简明教程之九—妙用SendKeys简化重复操作2例三:制作能自动定时存盘的记事本我们最常用的记事本没有Word、WPS那样的自动定时存盘功能,其实利用VBS脚本再加上SendKeys命令,就能弥补这个遗憾。打开记事本,输入以下内容(为容易描述和分析,把代码分为四个部分):'第一部分:定义变量和对象DimWshShell,AutoSaveTime,TXTFileNameAutoSaveTime=300000SetWshShell=Object("")TXTFileName=InputBox("请输入你要创建的文件名(不能用中文和纯数字):")第一部分:定义了脚本中需要用到的变量和对象。“AutoSaveTime”变量用来设置自动存盘间隔,单位为毫秒,这里设置为5分钟。“TXTFileName”变量通过输入框取得你要创建的文本文件名称。'第二部分:打开并激活记事本"notepad"ivate"无标题-记事本"第二部分:运行记事本,对于Windows本身提供的程序,比如计算器等,可直接在“”后输入程序名称,如"calc",对于非系统程序,则可输入完全路径,但要注意使用8.3格式输入,比如“"D:Progra~"”。'第三部分:用输入的文件名存盘ys"^s"ysTXTFileName

ys"%s"utoSaveTime第三部分:这里用SendKeys命令执行了这样的操作流程(请注意每个操作之间延时命令的使用):在记事本中按Ctrl+S组合键→弹出保存文件的窗口→输入文件名→按Alt+S组合键进行保存(默认保存在“我的文档”目录)。'第四部分:自动定时存盘ivate(TXTFileName)=ys"^s"第四部分:定时存盘的关键,通过“While……Wend”这个当条件为“真”时循环命令,实现自动存盘代码“ys"^s"”和定时代码“utoSaveTime”的重复执行。因为不能让这个定时存盘循环一直执行,退出记事本后,必须自动退出脚本并结束循环,所以设计了一个循环判断条件“ivateTXTFileName=True”,当记事本运行中时,可以激活记事本窗口,这个条件运行结果为“True”,定时存盘循环一直执行,退出记事本后,脚本无法激活记事本窗口,就会跳出循环,执行“Wend”后面的“”退出脚本。将其保存为记事本.vbs,以后要使用记事本时,都通过双击这个脚本文件来打开。程序说明:这个脚本的基本思路是定时向记事本发送Ctrl+S这个存盘组合键。例四:关机菜单立刻显身打开记事本,输入以下命令,并将其保存为:setWshShell=CreateObject("")ys"^{ESC}u"双击运行它,你会发现关机菜单立刻出现了。

将“ys"^{ESC}u"”改为“ys"^+{ESC}"”,运行一下看看是否打开了任务管理器===================================Vbs脚本编程简明教程之九—妙用SendKeys自动上网并登陆博客3将下面的脚本复制到一个文本文件中,并将其文件名命名为:自动登陆.vbs,然后将拨号软件及本脚本一起复制到程序——启动项中,就可以实现自动拨号上网,并登陆到博客上。代码如下:Setwshshell=CreateObject("")ivate"连接MAE-301U拨号连接"ys"{enter}""iexplore"ivate"hao123网址之家---实用网址,搜索大全,尽在-MicrosoftInternetExplorer"'引号中的内容修改为你的浏览器打开后标题栏中的内容ys"%d"yspassport.***.com/?ys"{enter}"ys"此处修改为博客帐号"ys"{tab}"ys"此处修改为博客密码"ys"{enter}"'ys"%d"================================Vbs脚本编程简明教程之十—Vbs脚本编程常用的编辑器Vbs脚本常用的编辑器当然是notapad,不过这个编辑器的功能当然实在是太弱了一点,其实有很多的专用的脚本编辑器可以大大方便vbs脚本的编写。我常用的有两种:1、VBSEDit汉化版=================================Vbs脚本编程简明教程之十一——FSO中文件的基本操作一、文件属性:在windows中,文件的属性一般用数字来表示:0代表normal,即普通文件未设置任何属性。2代表隐藏文件。4代表系统文件。1代表只读文件。16代表文件夹或目录。32代表存档文件。1024代表链接或快捷方式。例如:setfs=object(“stemobject”)setf=e(“d:”)utes‘attributes函数的作用是显示文件属性

需要说明的是:msgbox显示的结果往往不是上面说明的数字,而是有关属性代表数字的和。二、创建文件:textfile方法,注意创建前一般需要检查文件是否存在。例如:setfso=object(“stemobject”)ists(“c:”)thenmsgbox“文件已存在”elsesetf=textfile(“c:”)endif如需要强制覆盖已存在的文件,则在文件名后加true参数。三、复制、移动、删除文件:使用copyfile方法、movefile方法、deletefile方法。例如:setfso=object(“stemobject”)le“c:”,”d:”,le“c:”,“d:”//移动文件file“c:”四、文件的读写:1、打开文件:使用opentextfile方法如:setts=xtfile(“c:”,1,true)说明:第二个参数为访问模式1为只读、2写入、8为追加第三个参数指定如文件不存在则创建。2、读取文件:read(x)读x个字符;readline读一行;readall全部读取如:setffile=xtfile(“c:”,1,true)value=(20)line=necontents=l3、常见的指针变量:atendofstream属性:当处于文件结尾的时候这个属性返回true。一般用循环检测是否到达文件//删除文件//如上文说述,true代表强制覆盖

末尾。例如:fstream<>(10)loopatendofline属性:如果已经到了行末尾,这个属性返回true。Column属性(当前字符位置的列号)和line属性(文件当前行号):在打开一个文件后,行和列指针都被设置为1。4、在文件中跳行:skip(x)跳过x个字符;skipline跳过一行5、在文件中写入字符:可以用2-写入和8-追加的方式来写入其方法有:write(x)写入x字符串;writeline(x)写入x代表的一行writeblanklines(n)写入n个空行注意:最后一定要使用close方法关闭文件。读文件后一定要关闭,才能以写的方式打开。======================================Vbs脚本编程简明教程之十二—使用系统对话框在VBS脚本设计中,如果能使用windows提供的系统对话框,可以简化脚本的使用难度,使脚本人性化许多,很少有人使用,但VBS并非不能实现这样的功能,方法当然还是利用COM对象。1、ve对象:属性有:FileName—指定默认文件名;FileType—指定文件扩展名;OpenFileSaveDlg—显示文件保存框体方法。2、en对象:FileName—默认文件名属性;OpenFileOpenDlg—显示打开文件框体方法。3、Dialog对象:Filter—扩展名属性("vbsFile|*.vbs|AllFiles|*.*");FilterIndex—指定InitialDir—指定默认的文件夹FileName—指定的文件名Flags—对话框的类型Showopen方法:很简单,ok,让我们来举两个简单的例子:例一:保存文件

SetobjDialog=CreateObject("ve")SetobjFSO=CreateObject("stemObject")me="test"pe=".txt"intReturn=TextFile(me&pe)dIf注意:1、ve对象仅仅是提供了一个方便用户选择的界面,本身并没有保存文件的功能,保存文件还需要使用FSO对象来完成。2、用FileType属性来指定默认的文件类型。3、在调用OpenFileSaveDlg方法时,最好把返回值保存到一变量中,用它可以判断用户按下的是确定还是取消。例二:.打开文件setobjFile=CreateObject("en")intRet=leOpenDlgifintretthenmsgbox“文件打开成功!文件名为:”&dif例三:比较复杂的打开文件对话框SetobjDialog=CreateObject("Dialog")="vbsFile|*.vbs"lDir="c:"tfile=eniftfilethen

strLoadFile=dif说明:在脚本中加入=&H020看看会出现什么结果。====================================Vbs脚本编程简明教程之十三—WMI基础之一WMI即Windows管理规范,是用户管理本地和远程计算机的一种模型。通过它可以访问、配置、管理和监视几乎所有的Windows资源。WMI的语法十分简单,基本上常见的命名空间、对象等用几乎一模一样。它对应的是Windows里的WMI服务(winmgmt)。一、WMI的起源几年前,几家资深的计算机公司由于系统管理领域缺少标准,委托DMTF启动了CIM(通用信息模型)项目,理想的CIM是一种不受限制于任何特定实现环境的管理工具。WMI是CIM的微软实现,它有很多类是从CIM中派生出来的。二、WMI的命名空间那么命名空间是做什么作用的呢?我简单这样说,在同一段代码中,如果有两个变量或函数的名字完全相同,就会出现冲突。命名空间就是为解决变量、函数的命名冲突而服务的。解决的办法就是将你的变量定义在一个不同名字的命名空间中。就好像财政局有个张三,公安局也有个张三,但我们清楚,就是因为他们分属不同的单位。有些地方可能不太准确,但大致意思就是这样了。WMI的命名空间创建了一个层次结构,有点类似于我们的目录文件结构。1、2、3、4、root-作为所有其他名字的占位符;rootdefault-与注册表操作有关的类;rootsecurity-与系统安全有关的类;rootcimv2-从CIM派生的类,代表我们最常用的工作环境。三、WMI的对象路径

WMI的对象路径用来在CIM库中定位类和它的事例,对象路径用两个反斜杠开头,第一个元素是目标计算机的名字,第二个元素是相应的WMI命名空间,第三个元素是相应的类名,并用:将它与命名空间分隔开来。例如:..rootcimv2:win32_service其中那个.代表是本地系统。四、WMI的查询语言——WQL仅仅是ANSISQL的一个子集,只能用于数据的提取。数据、事件查询的基本语法为:Selectpro1,pro2,pro3frommyclass(myclassevent)例如:Selectname,pathfromWin32_share说明:列出所有共享的名称和路径也可以使用通配符*,例如:Select*fromWin32_share关键字Where用于限定查询的范围。例如:Select*fromWin32_sharewherename=”Admin”五、WMI脚本中使用的三个步骤步骤1:连接到WMI服务在任何WMI脚本中,第一个步骤都是建立一个到目标计算机上的Windows管理服务的连接。方法是调用VBScript的Getobject函数并将WMI脚本库的名字对象的名称(即“winmgmts:”,后跟目标计算机的名称)传递到Getobject,并返回一个对象的引用,此时,您就可以调用其提供的方法如:InstancesOf,正如方法名所示,InstancesOf返回由资源的类名标识的托管资源的所有实例。步骤2:检索WMI托管资源的实例一般采用WQL来实现。步骤3:显示WMI托管资源的属性最后一个步骤是枚举检索得到集合的内容。一般采用Foreachenuminmyclass……Next结构来实现。=========================================

Vbs脚本编程简明教程补充读物-初窥WMI今天,我沼泽将给大家介绍个朋友,它就是MicrosoftWindowsManagementInstrumentation(WMI)。中文名字叫Windows管理规范。从Windows2000开始,WMI(Windows管理规范)就内置于操作系统中,并且成为了Windows系统管理的重要组成部分。所以大家很容易就能见到它的,因为我们至少也应该是个Windows2000的使用者了。下面我将详细介绍它的每个细节,让你从不认识它到喜欢上它。WMI能做什么?WMI不仅可以获取想要的计算机数据,而且还可以用于远程控制。远程控制计算机可是大家都喜欢的东西。很多远程监视控制类软件通常的做法是:在远程计算机上运行服务端后台程序,在本地计算机上运行一个客户器端控制程序,通过这二个程序的勾结来实现对计算机的远程控制。这种作法的缺点是十分明显的,当服务端程序关了,这种远程监控就无法实现了,因为没有内线了。而WMI实现的远程监视和控制完全不需要另外装什么服务端的东西,系统默认就将WMI服务给开了。具体说来,WMI的本领如下:1.获取本地和远程计算机的硬件软件信息。2.监视本地和远程计算机的软件和服务等运行状况。3.控制本地和远程计算机的软件和服务运行。4.高级应用。如何访问WMI?当我们知道WMI的某些本领后,我们已经很想知道如何认识他并利用他了。利用WMI有许多途径,简单说来有三种了:1.通过微软给我们提供的各种工具来实现普通查询和操作。主要包括命令提示符下面的WMIC,还有就是微软给我们提供的WMITOOL,大家可以到微软的网站上免费下载,当然我也可以给大家免费提供。2.通过自己编写脚本来实现更灵活操作。要想真正灵活实用,对WSH脚本的熟悉是必须的,当然如果你不熟悉也没有关系,稍后我会给大家详细解释的。3.通过编写我们自己的程序来访问并操作它。什么语言都行。如果用.NET类程序要简单些了,如果用VC等要复杂些了,起码我是这么认为的。4.还有个访问它的方法,就是到它的一个巢穴。在C:WINDOWSsystem32wbem目录中的东西都和它有密切联系,有日志和各种工具,在里面你可以找到很多答案的。不过这些东西一般都不适合我们新手玩了,感觉有点吓人。我们今天的任务?今天我们的任务有五个:任务一:利用WMIC列出远程计算机上的所有进程。任务二:利用WMIC关闭本地进程。任务三:通过WMIC把远程主机的进程信息保存在一个网页中任务四:利用脚本实时监视对方进程任务五:利用脚本给对方开放共享查看和监视进程,还要把进程给杀掉,最后还要给对方开个共享,我们这位朋友快把坏事做尽了。明白了我们的任务,我们就可以上路了。这次我们将主要借助WMIC和脚本来实现我们的任务,所以我们将主要分为两大部分来讲解。在五个任务的实战中我们将更加深入地理解它,没有基础没有关系,我将尽力去解释所有的所谓的基础,让大家能很轻松地和这位朋友交流。第一部分:利用WMIC来认识WMIWMIC是WindowsManagementInstrumentationCommandline的简称,WMIC扩展WMI,提供了从命令行接口和批命令脚本执行系统管理的支持。为WMI名称空间提供了一个强大的、友

好的命令行接口。有了WMIC,WMI就显的平易近人了。执行“WMIC”命令将启动WMIC命令行环境。第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符。在WMIC命令行提示符上,命令将以交互的方式执行。如果你不知道该如何和它交互,请敲个“/?”,细细看完全部的说明,你就知道了。WMIC也可以按照非交互的模式运行。如果要执行某个单步的任务,或者运行批命令中的一系列WMIC命令,非交互模式就很有用。要使用非交互模式,只要在同一个命令行上启动WMIC并输入要执行的命令就可以了。1.任务一:利用WMIC列出远程计算机上的所有进程这是一个实现起来很简单的任务,和你用一个DOS命令一样简单,因为我们要循序渐进嘛,所以安排了这么一个热身任务。在命令提示符下敲入下面的命令,我们将看到。WMIC/node:192.168.1.2/user:netprocess解说:1)上面命令中的NODE和USER是全局开关。如果你不愿意另外输一次密码,你也可以用PASSWORD开关,后面写上密码就可以了(WMIC/node:192.168.1.2/user:net/password:passwordprocess)。千万要注意,这里的用户名和密码都必须是管理员级别的,其它的无效。WMIC提供了大量的全局开关、别名、动词、命令和丰富的命令行帮助增强用户接口。全局开关是用来配置整个WMIC会话的选项。2)Process是个别名,执行了一个Win32_process类的WQL查询,至于说是WMI的类是什么东西,感兴趣的就自己找资料多多了解,如果你很懒的话,就等我有时间给你开课讲解。别名是用户和WMI名称空间一个简化语法的中间层。当你指定一个别名时,动词(Verb)表示要执行的动作。3)如果你愿意,你可以在该后面加上个动词等,比如LISTFULL等(如:WMIC/node:192.168.1.2/user:net/password:passwordprocess),这样你就看得更清楚了。小提示:安装了WMIC的机器可以连接到任何一台安装了WMI的机器,被连接的机器不需要安装WMIC。2.任务二:利用WMIC关闭本地进程执行下面的命令将关闭正在运行的QQ。我比较胆小,所以不敢关别人的QQ,只能拿我的QQ试验了,如果你的智商还够用的话,胆子比较大的话,你很快就会去关别人的了。WMICprocesswherename=””callterminate解说:1)这次我们是用交互式的方法来执行任务,具体界面我就不多说了,图上画的比我说的好多了。2)Call也是个动词,这个动词可是厉害了,控制类的没有不用它的,它就是可以调用各种类的各种方法的大将。这里我们调用了terminate方法。从字面上你就可以看出是恶狠狠的。3)Where能够让你查询和筛选。在超级多的实例中找到你想要的。实例就是指每个类的具体实现了。前面的例子中看到的各个进程都分别算是WIN32_PROCESS中的一个实例。3.任务三:通过WMIC把远程主机的进程信息保存在一个网页中这个任务和任务一中的大致相同,是任务一的加强。在任务一中信息以文本的形式显示出来了。其实除了文本形式的输出之外,WMIC还能够以其他形式返回命令执行结果,例如XML、HTML或者CSV(逗号分隔的文本文件),如图3所示。我们可以敲入下面的命令:wmic/output:C:/node:192.168.1.2/user:netprocesslistfull/format:输入密码:******解释:

1)全局开关OUTPUT指明将这些信息保存在什么地方。2)全局开关FORMAT指明了用什么样的格式,至于说有那些格式可以用,你可以参看C:WINDOWSsystem32wbem目录中的*.xsl文件,你甚至不用管它们从哪里来的,用就是了。挨着看看,一定可以找到你喜欢的。第二部分:利用脚本来认识WMI命令提示符的工具确实好用,但是却显示不出我们是高手,高手都是能利用程序来实现目的的。下面我们就开始用脚本来实现我们的任务,功能将更加强大,操作将更加灵活。无论脚本还是真正意义上的程序,要检索WMI托管资源信息进而查询并利用WMI,都需要遵循以下三个步骤的。1.连接到WMI服务。建立一个到目标计算机上的Windows管理服务的连接。2.检索WMI托管资源的实例。主要取决于要执行的任务。3.显示WMI某实例属性和调用其方法。1.任务四:利用脚本实时监视对方进程在任务一和任务三中我们都是在查看对方的进程,出来的结果对我们意义不是很大,在这个任务中我们要从现在开始每当他开一个任务我们就察觉到,并把它记录下来。我们要在他开进程的那一秒开始报告并记录,我们要清楚他所开的程序所在的位置,我们要比他更清楚地知道这些信息。现在我们就按照前面提到的三个步骤来实现任务。首先,我们连接到对方的WMI。在这里我们首先调用VBScript的中的Createobject()来得到一个对象,然后利用这个特殊的对象的方法来连接到远程的计算机上。这个特殊的对象就是ocator。setolct=createobject("ocator")setwbemServices=tserver(strComputer,"rootcimv2",strUser,strPwd)注意其中的strComputer就是你所要连接的计算机的名称或者IP地址,strUser,strPwd当然就是用户名和密码了,我们说过这个用户必须是具有管理员权限的才可以。rootcimv2是WMI的命名空间,关于WMI的命名空间,大家可以到“计算机管理WMI控件”中看到,这里面的学问就大了,得慢慢琢磨,为了我们的任务快速实现,我就不多解释了。用这种方法连接到WMI,返回一个对SWbemServices对象的引用,一旦有一个对SWbemServices对象的引用。我们就可以进行第二个步骤了。在第二个步骤中,我们将得到WMI托管资源的实例,我们利用WbemServices中的一个方法ExecNotificationQuery可以查询我们所要的类,进而可以得到该类中实例。SetcolMonitoredProcesses=wbemServices._ExecNotificationQuery("select*from__instancecreationevent"_&"within1whereTargetInstanceisa'Win32_Process'")注意这里有个类似于SQL语言的查询语言,这里叫做WQL语言,懂SQL的一看就明白了,不懂的就在网上找找它的资料,满天都是。得到的colMonitoredProcesses是所查询的类的实例的集合。有了这些我们的第三个步骤就可以开始了。在第三个步骤中,我们将显示出得到的实例中的属性。刚才我们得到的是实例的集合,在这里我们通过ent来获取每一个具体的实例,得到每一个具体的实例后,我们就可以显示出他们的属性,也就是我们想看的东西了。这里我们显示了CommandLine的属性值。到现在你是否有些迷惑了,因为你还不知道到底WMI里面有那些类,具体类又有哪些属性,呵呵,没有关系的,用一些工具可以很轻松的得到这些信息。比如系统自带的wbemtest,在运行中敲入这个程序名,你就可以看到这些了,它也遵循连接、查询、枚举这三个步骤。自己慢慢玩吧,很快你就会发现WMI太大了,单是命名空间就有10多个,然后单是我们常用的空间rootCIMV2里面就有近1000个类,每个类里面又有好多的属性,有些类还有好多方法。哈哈,

头晕了吧?没关系,其实你只需要知道其中的一些就好了。看到这些估计你的头已经很大了,但是恭喜你,我们的这个任务已经完成了,是的,就是这么简单,下面我将完整代码奉献出来。SetcolArgs=<"USAGE:"&vbCrLf&"MonitorComputerUserPasswordfiles"dIfstrComputer=nts(0)strUser=nts(1)strPwd=nts(2)strFile=nts(3)setolct=createobject("ocator")setwbemServices=tserver(strComputer,"rootcimv2",strUser,strPwd)SetcolMonitoredProcesses=wbemServices._ExecNotificationQuery("select*from__instancecreationevent"_&"within1whereTargetInstanceisa'Win32_Process'")i=0DoWhilei=0SetobjLatestProcess=w&""&dLineSetobjFS=CreateObject("stemObject")SetobjNewFile=xtFile(strFile,8,true)ineNow()&""&oop到这个程序的核心了吧?相信你已经懂了其中的很多,剩余的部分代码我稍后解释。我们先来感性认识一下,先看它该怎么用吧!把上面的代码拷贝到记事本中,然后保存为的文件,然后在命令提示符下输入:回车,你就会看到帮助,下面举例说明这个脚本的具体用法:192.168.1.2userpasswordC:在命令提示符下敲入上面的命令就OK了,每当对方开一个程序的时候,你就可以看到时间,程序路径和程序名。如果你没有时间去看这些信息,你还可以等有时间的时候到C:看到这些信息。小知识:每次使用脚本,都必须敲入CSCRIPT和脚本的后缀名,很麻烦。这是因为系统默认的执行引擎是WSCRIPT,可以将它改成CSCRIPT。另外一个让人不爽的是脚本执行后总要显示微软的说明,好像脚本不是我们写的一样。不过你可以通过在命令提示符下敲入下面的命令来解决这个问题:cscript//nologo//h:cscript//s这样你以后再运行这些脚本的时候就不用在敲入CSCRIPT了,也不用在写入.vbs的后缀名了,就上面的例子来说,你可以这样用:monitor192.168.1.2userpasswordC:解释:1)前面的那几行,大概就是为了显示帮助和处理我们在后面输入的参数。应用到了

nts这个对象,利用它我们可以来获取并处理脚本的参数。2)那个死循环是为了让我们一直监视他(她),每当他开一个程序,我们就得到一个新的实例,我们就可以知道他更多的信息,哈哈,够狠吧。这样你也就知道了,当我们这个脚本运行后,只有通过我们人为中止才能中断监视,人为中止的方法大家可以用CTRL+C来完成,也可以用各种野蛮的方法来中止。3)在代码中出现的另外一个核心对象就是FileSystemObject,应该是大家的老朋友了吧,我这里就不再做解释了,我们在这里应用它主要是为了将结果同时保存到一个文件中,我们利用它来创建或打开一个文件,将信息追加进去。4)至于那个NOW,虽然体积很小,但是却正是它给我们提供了时间这个重要的信息。5)如果你想要监视的是自己的计算机而不是远程的计算机(据我所知,这个应用还是很广的)。那么请将计算机名的参数写为一个小点,用户名和密码留为空。如下所示:monitor.""""C:2.任务五:利用脚本给对方开放共享有了任务四的基础,这次我们就先看代码吧:SetcolArgs=<"USAGE:"&vbCrLf&"RshareComputerUserPasswordSharePathShareName"dIfstrComputer=nts(0)strUser=nts(1)strPwd=nts(2)strPath=nts(3)strShareName=nts(4)intMaximumAllowed=1strDescription="Temporaryshare"ConstSHARED_FOLDER=0setolct=createobject("ocator")setwbemServices=tserver(strComputer,"rootcimv2",strUser,strPwd)SetobjSWbemObject=("Win32_Share")intReturnValue=(strPath,_strShareName,_SHARED_FOLDER,_intMaximumAllowed,_strDescription)if(intReturnValue=0)"Thesharehavebeencreatedsuccessfully"EndIf解说:1)我们可以看出来前面的那几行是为显示帮助和处理输入参数而存在的。2)紧接着设置了几个变量,为以后做参数用的。这里我们可以先不理会它。3)连接到主机的WMI,然后就是查询。前面已经说的很详细了。4)这次得到实例集后,我们用了它的一个方法,也就是这个方法让共享成为了可能,联系到第二部分的内容,我们不难知道第一个参数表示要共享的路径和文件名,第二个参数表示共享名,第三个参数为0就可以了,第四个参数是指可以连接的人数,第五个参数是共享描述了,而我们只关心前面的两个参数。如果手头有MSDN那就好办了,到MSDN中可以查到该方法的更

详细的内容。5)这次我们根据第四步的返回值来得到共享是否成功,并给出提示。不同的返回值代表不同的意义。这个信息在MSDN中可以很清楚地查到。比如0代表成功返回,2代表拒绝访问,9代表用户名错误,25代表主机名没有找到等等。6)这次我们要注意的是,用这个脚本来实现远程文件共享,要求远程存在这个文件,否则无法共享。当然你也可以利用教本创建自己的文件夹,很容易的,自己创建吧。7)如上脚本创建后的共享是完全共享。就是可以删除修改文件的。8)用法举例:sharenetpnetswswswC:dodomarsh好了,到现在为止,大家应该对这位朋友有些了解了,我的介绍任务也就告一段落了,如果大家想进一步认识它,那就主要靠大家的主动性了。这次我们主要通过WMIC和脚本来认识它,下次我将带领大家通过真正的程序代码来认识它,让它也有个象Windows一样漂亮的脸蛋。今天我所提到的估计只能算是WMI的万分之一,都算不上是冰山一角。剩余的要靠自己来发挥了。如果你肯利用你的所学,那么奇迹就会产生。=================================Vbs脚本编程简明教程之十三—WMI基础之二—阻止客人运行你不想运行的程序很多人都有这样的经验,刚刚装好的系统,让人运行了一些你不想他运行的程序,比如说QQ,又是聊天,又是下载表情,不过一会,流氓插件、病毒、木马已经盘踞了你的计算机,常常是忍痛将这个程序卸载,可是不知情的人很自觉的下载安装,使整个系统无法正常运行。其实用vbs和wmi结合起来,使你的计算机上有相应的程序安装,别人又无法运行起来太容易了,现在给出代码:OnErrorResumeNext'忽略所有的错误Dimbag,pipe,honker,goodDogood="."'定义为本地计算机setbag=getobject("winmgmts:"&good&"rootcimv2")'l连接到cimv2命名空间setpipe=ery("select*fromwin32_processwherename=''orname=''orname=''")'看,这是我的计算机上不允许运行的程序,qq、qqgame、winmine(扫雷)如果你还有其他的程序不允许运行,很简单,在其中添加orname='你不允许运行的程序名'ate()msgbox"发现盗版系统,现已进行功能限制"&vbcrlf&"请使用正版软件!",,"微软提示"'此行其实可有可无,有这行只是为了免去怀疑60000'每1分钟检测一次loop那么如果我自己想运行这些程序该怎么办呢?很简单,Ctrl+Alt+Del三个键齐按,打开windows任务管理器,在进程中结束和进程的运行就可以了。======================================Vbs脚本编程简明教程之十四—使用dictionary对象VBS中存在一个特殊的对象-dictionnary,是一个集合对象。一般情况霞,我把这个特殊的集合想象为数组,可以使用其中内建的函数完成存储和操纵数据等基本任务,无须担心数据是在哪些行列,而是使用唯一的键进行访问或者是一个只能运行在内存中的数据库,并只有两个字段分别是:key和item,在使用中,字段key是索引字段。

setsdict=CreateObject("nary")"a","apple""b","banana""c","copy"all这个脚本很简单,就是定义了一个dictionary对象的实例sdict,并加入了三条数据,然后对每一条数据进行了枚举,最后,将对象的实例清空。"键名"&key&"是"&"="&sdict(key)Dictionary对象的成员概要属性和说明CompareModeCountItem(key)Key(key)设定或返回键的字符串比较模式只读。返回Dictionary里的键/条目对的数量设定或返回指定的键的条目值设定键值方法和说明Add(key,item)增加键/条目对到DictionaryExists(key)如果指定的键存在,返回True,否则返回FalseItems()返回一个包含Dictionary对象中所有条目的数组Keys()返回一个包含Dictionary对象中所有键的数组删除一个指定的键/条目对Remove(key)RemoveAll()删除全部键/条目对====================================Vbs脚本编程简明教程之十五—VBS内置函数之一Abs函数:返回数的绝对值。

Array函数:返回含有数组的变体。Asc函数:返回字符串首字母的ANSI字符码。Atn函数:返回数值的反正切。CBool函数:返回已被转换为Boolean子类型的变体的表达式。CByte函数:返回已被转换为字节子类型的变体的表达式。CCur函数:返回已被转换为货币子类型的变体的表达式。CDate函数:返回已被转换为日期子类型的变体的表达式。CDbl函数:返回已被转换为双精度子类型的变体的表达式。Chr函数:返回与指定的ANSI字符码相关的字符。CInt函数:返回已被转换为整形子类型的变体的表达式。CLng函数;返回已被转换为Long子类型的变体的表达式。Cos函数:返回角度的余弦。CreateObject函数:创建并返回对“自动”对象的引用。CSng函数:返回已被转换为单精度子类型的变体的表达式。CStr函数:返回已被转换为字符串子类型的变体的表达式。Date函数:返回当前系统日期。DateAdd函数:返回的日期已经加上了指定的时间间隔。DateDiff函数:返回两个日期之间的间隔。DatePart函数:返回给定日期的指定部分。DateSerial函数:返回指定年月日的日期子类型的变体。DateValue函数:返回日期子类型的变体。Day函数:返回日期,取值范围为1至31。Eval函数:计算表达式并返回结果。Exp函数:返回e(自然对数的底)的多少次方。Filter函数:根据指定的筛选条件,返回含有字符串数组子集的、下限为0的数组。

Fix函数:返回数的整数部分。FormatCurrency函数:返回的表达式为货币值格式,其货币符号采用系统控制面板中定义的。FormatDateTime函数:返回的表达式为日期和时间格式。FormatNumber函数:返回的表达式为数字格式。FormatPercent函数:返回的表达式为百分数(乘以100)格式,后面有%符号。GetObject函数:返回从文件对“自动”对象的引用。GetRef函数:返回对能够绑定到一事件的过程的引用。Hex函数:返回一字符串,代表一个数的十六进制值。Hour函数:返回表示钟点的数字,取值范围为0至23。InputBox函数:在对话框中显式一提示,等待用户输入文本或单击按钮,并返回文本框的内容。InStr函数:返回一个字符串在另一个字符串中首次出现的位置。InStrRev函数;返回一个字符串在另一个字符串中出现的位置,但是从字符串的尾部算起。==================================Vbs脚本编程简明教程之十五—VBS内置函数之二Int函数:返回数的整数部分。IsArray函数:返回Boolean值,反映变量是否为数组。IsDate函数:返回Boolean值,反映表达式能否转换为日期。IsEmpty函数:返回Boolean值,反映变量是否已被初始化。IsNull函数:返回Boolean值,反映表达式是否含有无效数据(Null)。IsNumeric函数:返回Boolean值,反映表达式能否转换为数字。IsObject函数:返回Boolean值,反映表达式是否引用了有效的“自动”对象。Join函数:返回通过连接许多含有数组的子串而创建的字符串。LBound函数;返回指定维数数组的最小有效下标。LCase函数:返回的字符串已被转换为小写字母。Left函数:返回字符串最左边的指定数量的字符。Len函数:返回字符串中的字符数或存储变量所需的字节数。

LoadPicture函数:返回图片对象。只用于32位平台。Log函数:返回数的自然对数。LTrim函数;返回去掉前导空格的字符串。Mid函数:从字符串中返回指定数量的字符。Minute函数:返回分钟数,取值范围为0至59。Month函数:返回表示月份的数,取值范围为1至12。MonthName函数:返回表示月份的字符串。MsgBox函数:在对话框中显示消息,等待用户单击按钮,并返回表示用户所击按钮的数值。Now函数:返回计算机的当前系统日期和时间。Oct函数:返回表示该数八进制数值的字符串。Replace函数:返回一字符串,其中指定的子串已被另一个子串替换了规定的次数。RGB函数:返回代表RGB颜色值的数字。Right函数:返回字符串最右边的指定数量的字符。Rnd函数:返回随机数。Round函数:返回指定位数、四舍五入的数。RTrim函数:返回去掉尾部空格的字符串副本。ScriptEngine函数:返回反映使用中的脚本语言的字符串。ScriptEngineBuildVersion函数:返回使用中的脚本引擎的编译版本号。ScriptEngineMajorVersion函数:返回使用中的脚本引擎的主版本号。ScriptEngineMinorVersion函数:返回使用中的脚本引擎的次版本号。Second函数:返回秒数,取值范围为0至59。=====================================Vbs脚本编程简明教程之十五—VBS内置函数之三Sgn函数:返回反映数的符号的整数。Sin函数:返回角度的正弦值。Space函数:返回由指定数量的空格组成的字符串。Split函数:返回下限为0的、由指定数量的子串组成的一维数组。

Sqr函数:返回数的平方根。StrComp函数:返回反映字符串比较结果的数值。String函数:返回指定长度的重复字符串。StrReverse函数:返回一字符串,其中字符的顺序与指定的字符串中的顺序相反。Tan函数:返回角度的正切值。Time函数:返回表示当前系统时间的“日期”子类型的“变体”。Timer函数:返回时经子夜12:00AM后的秒数。TimeSerial函数:返回含有指定时分秒时间的日期子类型的变体。TimeValue函数:返回含有时间的日期子类型的变体。Trim函数:返回去掉前导空格或尾部空格的字符串副本。TypeName函数:返回一字符串,它提供了关于变量的变体子类型信息。UBound函数:返回指定维数数组的最大有效下标。UCase函数:返回的字符串已经被转换为大写字母。VarType函数:返回标识变体子类型的数值。Weekday函数:返回表示星期几的数值。WeekdayName函数:返回表示星期几的字符串。Year函数:返回表示年份的数值。===================================Vbs脚本编程简明教程之十六——响应事件什么是事件?在我看来,事件就象我们手机上的闹钟,闹钟一响,我们就要去做某些特定的事情。或者这样说,事件就像警钟,当程序运行时,有特殊的事情发生,就会激发事件,事件本身就是一条消息,如果你编写的脚本要对事件进行处理,就需要一个特殊的过程或者函数来接受和处理事件。那么这个特殊的过程或者函数在程序运行时,就不断的监听,看系统是否传来了相应的事件,一旦接受到事件,脚本对此作出反应。那么事件是从那里来的呢?是否需要我们在脚本中对事件进行编写呢?一般情况下,事件是某个程序在运行中的特殊状态发出的,我们不需要对事件进行编写,只需要编写处理事件的函数。比如说我们用vbs建立了ie的一个实例,那么当ie的窗口被关闭的时候,就会激发出一个叫做OnQuit的事件。是不是脚本自然而然就能接受事件并进行处理呢?我们说不是的,在创建对象的时候,我们将使用WSH的createobject命令,例如:

Setobjie=object(“ation”,”event_”)注意到了吗?多了一个参数,这个参数的作用是什么呢?它叫做事件接收端,当脚本连接的对象包含事件时,如果对象调用的事件是OnBegin,那么WSH将会在脚本中调用一个event_OnBegin的事件处理程序。当然事件接受端并不是固定的,如果对象将其定义为MyObj_的话,那么事件处理程序将是:MyObj_OnBegin。是否很熟悉?在打造个性化QQ一讲中,曾经出现过Window_OnSize(cx,cy)函数,它其实就是一个事件处理程序。让我们来举个实际的例子完整的看看事件的处理过程:Setobjie=Object("ation","event_")e=TrueMsgBox"请关闭浏览器窗口看看效果!",6000MsgBox"现在已经正常关闭了"Subevent_onquit()MsgBox"您确定要关闭浏览器吗?",vbSystemModalEndSub这段脚本打开了一个IE窗口,然后要求你关闭IE窗口,当你关闭窗口的时候,自动调用事件响应程序。=========================================Vbs脚本编程简明教程之十七——访问ADO数据库之一ADO是Microsoft提供和建议使用的新型数据访问接口,它是建立OLEDB之上的一个抽象层。微软公司在操作系统中默认提供了Access的ODBC驱动程序以及JET引擎,一、对ADO对象的主要操作,一般包括6个方面:1.连接到数据源。通常使用ADO的Connection对象。一般使用相应的属性打开到数据源的连接,设置游标的位置,设置默认的当前数据库,设置将使用的OLEDBProvider,直接提交SQL脚本等。2.向数据源提交命令。通常涉及ADO的Command对象。可查询数据库并返回结果在Recordset对象中。3.执行SELECT查询命令。在提交SQL脚本的任务时,不用创建一个Command对象,就可完成查询。4.可以通过ADO的Recordset对象对结果进行操作。

5.更新数据到物理存储。作者:临汾市外事旅游局薛靖澜,转载请注明出处]6.提供错误检测。通常涉及ADO的Error对象。二、ADO中主要对象的功能Recordset对象,用来封装查询的结果。Field对象,用来表达一行结果中各子段的类型和值。Error对象,用来检测和判断在数据库操作中出现的错误,比如连接失败。在ADO中,许多对象名后多了一个"s",比如Error->Errors,Field->Fields等等。添加"s"意味着是相应对象的Collection(集合)对象,比如Errors是Error对象的Collection对象。Collection有点像数组(Array),但不同的是,Collection可以以不同类型的数据或对象作为自己的元素,而数组中的各元素通常都是相同类型的。所以,在看到一个对象名最后是"s",通常表明这是一个Collection对象,比如Errors中的各元素是由Error对象的实例组成的。三、具体应用作者:临汾市外事旅游局薛靖澜,转载请注明出处]1、创建mdb数据库ADOX是ADO对象的扩展库。它可用于创建、修改和删除模式对象,如数据库和表格等。其常用的对象有:Catalog—>创建数据库。Column—>表示表、索引或关键字的列。作者:临汾市外事旅游局薛靖澜,转载请注明出处]Key—>表示数据库表中的关键字。常用的方法有:Append将对象添加到其集合。Delete删除集合中的对象。作者:临汾市外事旅游局薛靖澜,转载请注明出处]setcat=createobject("g")"Provider=.4.0;DataSource=d:"Settbl=createobject("")="MyTable""姓名","性别",2023'adInteger'adInteger202,50'"工作单位",tbl不过你要操纵数据库就连一个数据库也不建,未免懒惰了点,用代码虽然可以完成,但是我觉得对数据约束完成的比较困难,本代码也就是示范个例子,并不推荐使用此类方法。

2、打开数据库作者:临汾市外事旅游局薛靖澜,转载请注明出处]Provider=″Provider=.4.0;DataSource="SetObjconn=createobject("tion")ovider&"数据库名称"3、创建记录集SetObjrs=CreateObject("set")4、执行SQL查询语句Sql="SQL查询语句"'例如:Selectcount(*)fromtable1Setobjrs=e(sql)一般情况下,我们将绝大多数的操作转化为SQL语句完成。==================================Vbs脚本编程简明教程之十七——访问ADO数据库之二常用的SQL语句在学习SQL语句之前,让我们先来对数据库做一个基本的了解。一个数据库中可能包含了很多个基本单位叫做表。表格被分为“行”和“列”。每一行代表表的一个单独组成部分,每一列代表相同性质的一组数据。举例来说,如果我们有一个记载顾客资料的表格,行包括姓、名、地址、城市、国家、生日等。而一列则代表了所有的地址或者国家等。一、建立数据表,我们前边说过利用g建立数据库和数据表的方法,但是用的似乎不是很多,一般情况下,如果我们需要在数据库中动态建立一个表,我们将工作交给SQL语句来做,其基本语法是:CREATETABLE[表格名]([列名1]数据类型,[列名2]例如我们要建立一个基本顾客表:Createtable[顾客表]([姓名]text(8),[性别]text(2),[住址]text(30))二、插入数据项insertinto[数据表名称](数据项1,数据项2,...)values(值1,值2,...)insertinto语句用来添加新的数据到数据库中的指定表。通过(数据项1,数据项2,...)values(值1,值2,...)来为新添加的数据赋初值。三、删除数据项deletefrom[数据表名称]where[数据项1]like[值1]and/or[数据项2]like[值2]...作者:临汾市外事旅游局薛靖澜,转载请注明出处]数据类型,...)

四、更新数据项update[数据表名称]set数据项1=值1,数据项2=值2,...where[数据项1]like[值1]and/or[数据项2]like[值2]...该语句可以修改数据库中指定数据表内的指定数据,如果不是用where限定条件就表示修改该表内所有的数据条目。五、查询数据项select[数据内容]from[数据表名称]where[数据项1]like[值1]and/or[数据项2]like[值2]...orderby[数据项]asc/desc[数据内容]部分表示所要选取的表格中的数据项,使用*表示选取全部。[数据表名称]表示要从哪一个表格中选取,如果你没有接触过数据库可能很难了解什么是数据表格,没关系,我将在后面用到它的时候再说明。where表示选取的条件,使用like表示相等,也支持>=这样的判断符号,同时使用多个条件进行选取时中间要使用and进行连接。orderby决定数据的排列顺序,asc表示按照[数据项]中的数据顺序排列,desc表示倒序,默认情况为顺序。select语句中除select和from之外其它均为可选项,如果都不填写表示选取该数据表中的全部数据。例如:下面的语句查询某数据库中表名称为:testtable中姓名为“张三”的nickname字段和email字段。SELECTnickname,emailFROMtesttableWHEREname='张三'(一)选择列表作者:临汾市外事旅游局薛靖澜,转载请注明出处]选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。1、选择所有列例如,下面语句显示testtable表中所有列的数据:SELECT*FROMtesttable2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。例如:SELECTnickname,emailFROMtesttable3、更改列标题作者:临汾市外事旅游局薛靖澜,转载请注明出处]在选择列表中,可重新指定列标题。定义格式为:列标题=列名列名列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:SELECT昵称=nickname,电子邮件=emailFROMtesttable(二)FROM子句指定SELECT语句查询的表。

最多可指定256个表,它们之间用逗号分隔。如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应加以限定。====================================Vbs脚本编程简明教程之十七——访问ADO数据库之三(三)WHERE子句设置查询条件WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:SELECT*FROMusertableWHEREage>20WHERE子句可包括各种条件运算符:比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<范围运算符(表达式值是否在指定的范围):BETWEEN…AND…NOTBETWEEN…AND…列表运算符(判断表达式是否为列表中的指定项):IN(项1,项2……)NOTIN(项1,项2……)模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOTLIKE空值判断符(判断表达式是否为空):ISNULL、NOTISNULL逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR1、范围运算符例:ageBETWEEN10AND30相当于age>=10ANDage<=30作者:临汾市外事旅游局薛靖澜,转载请注明出处]2、列表运算符例:countryIN('Germany','China')3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。作者:临汾市外事旅游局薛靖澜,转载请注明出处]可使用以下通配字符:百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。作者:临汾市外事旅游局薛靖澜,转载请注明出处][^]:其取值也[]相同,但它要求所匹配对象为指定字符以外的任一个字符。例如:作者:临汾市外事旅游局薛靖澜,转载请注明出处]

限制以Publishing结尾,使用LIKE'%Publishing'限制以A开头:LIKE'[A]%'限制以A开头外:LIKE'[^A]%'4、空值判断符例WHEREageISNULL5、逻辑运算符:优先级为NOT、AND、OR最后,让我们用一个简单的例子结束这篇教程:Objku=InputBox("请输入单位数据库的路径","默认位置","d:")SetObjconn=createobject("tion")="provider=.4.0;DataSource="&Objku作者:临汾市外事旅游局薛靖澜,转载请注明出处]sql="CREATETABLE[单位资料](IDAutoincrementPRIMARYKEY,[姓名]text(8),[性别]text(2),[科室]text(6),[住址]text(30))"e(sql)sql="INSERTINTO[单位资料]([姓名],[性别],[科室],[住址])VALUES('张三','男','行管科','解放路12号')"e(sql)sql="INSERTINTO[单位资料]([姓名],[性别],[科室],[住址])VALUES('李斯','女','市场科','五一路12号')"e(sql)sql="DELETEFROM[单位资料]WHERE[姓名]='张三'"e(sql)sql="UPDATE[单位资料]"sql="SELECTCOUNT(ID)FROM[单位资料]"===================================WMI轻松入门之一——基本概念其实我给文章起这样的名字,绝对没有轻视WMI的意思,事实上就连微软也有“WMI非常难于学习而且更难于使用”的说法,在近日的学习过程中更感觉到了WMI检索功能的强大,之所以起个“轻松入门”的名字,我只是有感于外国人写教程在思路上和国人不太一致,西方式的幽默看起来困难无比,再加上一上手就在类的基本结构上展开讨论,吓跑了无数Vbs的爱好者,想从国人常见的角度出发来说说怎么学习WMI而已。百度空间的长度限制太讨厌了,一次发不完,只好分割成三部分,题目只能大致起了,见谅。作者:临汾市外事旅游局薛靖澜,转载请注明一、什么是WMI?微软有很多说法,大家可以到脚本中心查阅,我这样理解,WMI是一个用于管理Windows系统资源的对象,其内部应是一个树状的数据库,数据库中包含了很多个分支,每个分支被称作命名空间,每个命名空间包含了很多个对托管资源的抽象定义,这种定义叫做类。在很多计算机教材中喜欢把类比作建筑蓝图,依据蓝图建造的楼宇叫做类的实例,我更喜欢将类和其实例的关系比作表格,类就是表格的字段定义,而表中的数据就是一个个的类的实例,也许我这样说会让很多朋友更加糊涂,但是依此类推,WMI中最终存在的是各种软硬件资源的抽象定义,我们利用WMI,就是要按图索骥,通过类定义,获得类实例,检索出符合要求的属性,调用其内置的方法,实现我们的目标。相信很多朋友已经发现,我将WMI等同于CIM

库了,我清楚他们不是一回事,但我相信这样更容易理解。如图:二、WMI的基本结构严格说来,WMI由四部分组成:1、2、3、4、公共信息模型对象管理器——CIMOM公共信息模型——CIMWMI提供程序WMI脚本对象库其中其第1、2、3三个部分,在使用中很少加以区别,我们一般统称为CIM库。作者:临汾市外事旅游局薛靖澜,转载请注明所以我们可以认为WMI实际是由两部分组成:CIM库和WMI脚本对象库。在具体使用过程中,我们是通过WMI脚本对象库去访问CIM库,管理托管的资源。也就是说,在我们编写脚本的过程大致可以分为这么几步:作者:临汾市外事旅游局薛靖澜,转载请注明1、2、3、4、创建WMI对象脚本库的指针实例;调用其实例的方法,连接到CIM库,并指明需要访问的资源的逻辑位置;获得托管资源也就是类的实例的集合;枚举实例,完成工作。这几个步骤在我们将来编写的代码中可以明确的反映出来。三、常用的命名空间命名空间是个很复杂的概念,相信在微软的网站上一定有很多的篇幅介绍这个概念,据我个人理解,命名空间是对类所处逻辑位置的一个约定。打个比方说:张家也有个孩子叫小强,李家也有个孩子小强。大家站在一起,你大声叫"小强",你说这到底是叫哪一个小强呢?张家,李家都是一个姓,一个人的姓实际上就是现实中的一种名字空间。好了,现在你大声叫“张小强”,我们就明确的知道你到底是叫哪一个小强了。这就好比在变量名前加上名字空间前缀。所以可以通俗的说,名字空间就是一个变量的姓氏。问题是这样我们还会碰到一个问题,世界上有很多姓张的,也有可能有很多的张小强,这怎么办呢?这时候我们可以这样说"张老三家的小强",张是一个名字空间,张老三又是张下面的二级名字空间.张.老三的家.小强=110张.三丰的家.小强=119也许说的更糊涂,但大致就这样吧,我本来也就不是说明这个的。

据微软称,WMI的命名空间共有16个,不过不用担心,我们常用的只有两个:作者:临汾市外事旅游局薛靖澜,转载请注明1、2、rootcimv2在这个命名空间里包括了绝大多数与计算机、操作系统相关联的类。rootdefault管理注册表的类在使用中,我们用一个字符串表示命名空间,就像文件路径一样。=========================VBS脚本参考之一——使用连字符前言这一章的前半部分介绍了VB脚本最基本的概念,并且告诉你它可以完成的工作,尤其是VBS和其它的如WMI、ADSI接合在一起的时候。后半部分主要介绍了VBS对系统管理员更有用的部分。许多脚本和程序语言在向文本输入的时候并不严格的遵守文本的行。例如,尽管下面这个JS脚本写了很多行,但是,JS把它当做一行来处理。这是因为,在大部分的时候,JS只有看到中止符的时候才认为使一个行的中止。在这个例子中,中止符就是“;”。在实际中敲入的行是和脚本本身不相关的。var作者:临汾市外事旅游局薛靖澜,转载请注明出处]objWMI=newEnumerator(GetObject("winmgmts:").InstancesOf("Win32_process"));正好相反,同样的一段代码,用VB写的时候就会报一个语法错误。SetobjWMI=(GetObject("winmgmts:").InstancesOf("Win32_process"))

这是因为,VBS用回车键来代替特定的中止符。为了中止一个VB脚本,你不需要来敲入一个分号或者其它的特殊的符号,你只需要敲回车键就好了。一般来讲,不用中止符的限制,使VBS在编写的过程中变的简单,但是也有一点会有些复杂。为了增强程序的可读性,建议每行的最大长度不超过80个字符。那么当你的一行代码中有100个字符,怎么办呢?尽管看来好象有个很简单的解决办法,但是你不能用回车键来将一行代码分隔成很多行。例如如下的代码片断会返回一个VB运行错误因为它用回车键来分隔脚本strMessageToDisplay=strUserFirstName,strUserMiddleInitial,strUserLastName,rMessageToDisplay你不能用回车建来换行,因为在VB中它认为回车是代表一段代码的中止,在上面的代码中,它认为第一行是脚本的第一部分陈述内容。然后认为第二行是另外一部分陈述内容。这样因为strCurrentStatus不是一个VBS的命令,所以就报错了。为了解决这个问题,VB脚本用下划线来表示下面一行是上面一行的代替。在VB的早期修订版本中,在第一行末尾加一个空格和一个下划线来表示第二行是第一行的继续。为更明确的表明这个意思,第二行前面要加四个空格。(这样作是为了可读,你其实不必在继续的行前作特定的标识──就是不用在第二行前加四个空格。)作者:临汾市外事旅游局薛靖澜,转载请注明出处]strMessageToDisplay=strUserFirstName,strUserMiddleInitial,strUserLastName,_rMessageToDisplay当继续的行又引号的时候,它就显的特别复杂。例如,架设你用下划线和空格来分隔一个WMI脚本:SetcolServiceList=GetObject("winmgmts:").ExecQuery("SELECT*FROM_Win32_ServiceWHEREState='Stopped'ANDStartMode='Auto'")如果你运行这个脚本,它会弹出一个错误,因为继续换行符放在了引号中间了,这样它就认为换行符是字符串的一部分。为了分隔这个陈述:1:在第一行用引号中止,然后插入空格和下划线2:用and(&)符号来开始下一行,这表示第二行是第一行字符串的继续3:在下一行开始之前加入引号这些引号表示这些陈述是包涵在上面的一行中的,没有了引号,它就VB就解释Win32_Service是VB的陈述语句,因为这个语句不是合法的,所以就产生了错误。修正的版本如下:SetcolServiceList=GetObject("winmgmts:").ExecQuery("SELECT*FROM"_&"Win32_ServiceWHEREState='Stopped'ANDStartMode='Auto'")用这个办法来换行的时候,在适当的位置插入空格要十分小心。在上面的例子当中,空格是添

加在“from”之后和下一行的引号之前,如果空格向作偏出,那么字符串会被错位的解释(你看如果将FROM和Win32_Service连在一起)会像如下的错误:"SELECT*FROMWin32_ServiceWHEREState='Stopped'ANDStartMode='Auto'================================VBS脚本参考之二——定义和使用变量一:WorkingwithVariables变量是存储在计算器内存中能够存储数据的名称空间。大多数脚本语言允许你隐式的声明变量,使你不用明确的声明就可以使用变量。例如,你运行下面的脚本时候,不会遇到任何类型的错误,尽管它的第一行将一个值赋给了变量sngDegreesCelsius。尽管它并没有被声明。sngDegreesCelsius=11sngDegreesFahrenheit=ConvertToFahrenheit(sngDegreesCelsius)gDegreesFahrenheitFunctionConvertToFahrenheit(ByValsngDegreesCelsius)ConvertToFahrenheit=(sngDegreesCelsius*(9/5))+32EndFunction作者:临汾市外事旅游局薛靖澜,转载请注明出处]隐式的变量声明可以让写脚本变的快而且简单,但是在同时,它可能导致难以发现和解决的问题。为了说明这一点,以前面的脚本为例,前面的脚本将摄氏的11度转换成华氏的51.8度。下面一个脚本本来应该作同样的事情,但是它却返回了一个32的值……sngDegreesCelsius=11sngDegreesFahrenheit=ConvertToFahrenheit(sngDegreesCelsius)gDegreesFahrenheitFunctionConvertToFahrenheit(ByValsngDegreesCelsius)ConvertToFahrenheit=(sngDegresCelsius*(9/5))+32EndFunction上面一个脚本返回一个错误的值。因为在第六行敲入sngDegreesCelsius,而在后面却敲入了sngDegresCelsius,因为这个变量并没有赋值,所以VB认为它的值是0,这样继续算下去,结果为0,0再加上32所以返回了错误的答案。像这样的错误很难被发现,因为语法是正确的,所以并没有错误的信息报出来。你期待得到一个不是11的值,并且你得到了。当你写更加复杂的脚本的时候,这个敲入的错误很难被发现和改正。DeclaringVariablesinVBScript为了避免这样的问题发生,你可以显式的声明你的变量。当显示变量声明被要求的时候,脚本

中所有的变量都必须被显示的声明,否则会再运行的时候报错。例如,如下的脚本用“OptionExplicit”要求所有的变量被显示的声明,并且所有的变量用一个dim语句。OptionExplicitDimsngDegreesCelsiusDimsngDegreesFahrenehitsngDegreesCelsius=11sngDegreesFahrenheit=ConvertToFahrenheit(sngDegreesCelsius)gDegreesFahrenheitFunctionConvertToFahrenheit(ByValsngDegreesCelsius)ConvertToFahrenheit=(sngDegresCelsius*(9/5))+32EndFunction当你运行这样一个脚本的时候,脚本的主机遇到一个没有声明的变量,这样,脚本中止执行并且显示出类似下面的一个错误:C:(10,5)MicrosoftVBScriptruntimeerror:Variableisundefined:'sngDegresCelsius'在VB中声明变量:1.用OptionExplicit语句来强制一个变量的声明。2.用一个单独的DIM语句来声明每一个你要用的变量。虽然你只能用一个单独的dim来声明一个变量,但是在变量的后面,你可以添加一些解释来说明变量的用途,如下所示:OptionExplicit作者:临汾市外事旅游局薛靖澜,转载请注明出处]DimintFirstNumber'FirstnumberinoursimpleequationDimintSecondNumber'SecondnumberinoursimpleequationDimintTotal'SumofintFirstNumberandintSecondNumberInitializingVariables初始化一个变量就是简单的给一个变量赋予一个初始值。例如,如下的几行代码初始化了两个变

量,将x赋予100,将Y赋予abcdeX=100Y="abcde"如果你建立一个变量,但是没有给它初始化,(就是没有赋值给它),那么它的值有一下两种可能:如果它是一个字符串,那么它的值为空如果它的值是一个数字,那么它的值是0.例如:如下脚本创建了两个变量,X,Y,但是没有赋值给他们:&+Y在脚本的第三行,这两个变量被认为是字符串,(因为&是用来连接两个字符串的)。当它运行的时候,它显示入2.8所示的信息框。因为两个变量都是空,蔓儿他们的接合也是空。所以结果就是什么都没有。在脚本的第四行,这两个变量被认为是数字。数字没有被初始化的时候,他们自动的被赋值为0。这样,这个行的脚本代表0+0的和。UsingtheEqualsSigninVBScript在VB脚本中,等号的含义和算数中是不同的。在算数中,x=2+2是被认为是,x等于2加2但是在VB中,同样的表达式,被读作:x被赋值为2+2在上面这个例子中,他们并没有什么不同,任何一种办法来说,x的值都是4。但是看下面一个脚本,它用一个1到10的循环:Fori=1to10X=X+1Next这个脚本的第二行在算数里面是不可能的,x怎么可以等于x+1哪?原因就是它并不是一个算数表达式,而是一个合法的VB表达式,这里的X是一个变量被赋予新的值,在这里这个表示式被读作:X被赋值为x当前的值加上1就是说,如果x当前的值为3,当运行这个表达式之后,它的值就为4了,就是3加上1事

实上,在VB中,等号也可以用在对字符串的赋值当中。例如,如下脚本建立一个message变量,赋予了它很多字符串的值:作者:临汾市外事旅游局薛靖澜,转载请注明出处]Message="This"Message=Message&"isa"Message=Message&"testmessage."ssage====================================VBS脚本参考之三——定义和使用常量使用常量常量的意思是在脚本运行的时候,它的值不能改变。例如,如果你有一个脚本将日元转换成美元,假设当前的汇率是1:0.0088759,你可以在脚本中写上如下的代码:curConvertedPrice=curPriceInYen*0.00888759尽管这个方法可行,但是它会出现一些问题,原因很多不赘述了,为了防止这样的问题发生,用常量的办法来替代用数直接敲入。如果你改变了这个常量,那么你只是需要在定义常量的一个地方更改它就好了。作者:临汾市外事旅游局薛靖澜,转载请注明出处]定义常量在VB脚本中,常量的定义是用一个const的表达式后加上常量的名字然后和常量的赋值。当你定义常量的是时候,你必须赋值给它一个数值。你不能给一个常量赋值一个变量,或者是一个程序。例如如下代码,尝试用一个变量NumberOfDepartments,定义一个常量,会产生一个Expectedliteralconstant的错误NumberOfDepartments=20ConstNUMBER_OF_DEPARTMENTS=NumberOfDepartments而你可以将20赋给这个常量。ConstNUMBER_OF_DEPARTMENTS=20使用固有常量在VB的脚本中有一些固有的常量,用来生成messagebox,改变输入格式,或者实现其它一些其它的功能。为了提高程序的可读性,你可能需要用这些常量,而不是它们对应等价的数字。例如,下面的脚本例子用数字来实现messagebox的显示,然后决定在messagebox中,哪个按钮被按下了。尽管它可以正常的工作,但是对于不熟悉VB脚本的人来说,这个脚本很难懂并且很不好编辑。他们必须知道260的意思是:创见一个带有yes&no的messagebox,并且第二个按钮是默认的按钮,数字7代表用户敲打NO那个按钮。ConfirmDelete=MsgBox("Areyousureyouwanttodeletethesefiles?",260,"Deleteallfiles")

IfConfirmDelete=dIf作者:临汾市外事旅游局薛靖澜,转载请注明出处]下面这个修正的脚本用了VBS的固有常量。(VBYesNo,VBDefaultButton2,和VBNo)用来代替数字。这些使脚本看起来简单易懂。ConfirmDelete=MsgBox("Areyousureyouwanttodeletethesefiles?",_VbYesNoORVBDefaultButton2,"Deleteallfiles")IfConfirmDelete=dIf用固有常量同样可以帮助你防止当脚本Update的时候使脚本实现中断。脚本的常量基本上不可能发生变化。几乎不可能将VbYesNo变成VbNoYes。但是这些常量对应的值会在脚本下次更新的时候更换。用系统常量的时候也方便和其它出现的语言的脚本合并,例如,在VB脚本中,1用来代表true。在,true也等于1。用true这个固有常量,比用硬编码1更加容易实现二者之间的转换。大部分的时候,你会发现你经常重复的使用到如下两个固有常量:1、VbCrLf.这个等同于按下回车键。它经常用来更改输出显示的格式。例如,如下代码用来显示一行文字,一个空的行,然后再显示一行文字"Thisisthefirstlineoftext."&VbCrLF&VbCrLF&_"Thisisthesecondlineoftext."2、VbTab这个常量等同于按下TAB键,例如,如下代码来建立三个空格:作者:临汾市外事旅游局薛靖澜,转载请注明出处]"1"&VbTab&"2"&VbTab&"3""A"&VbTab&"B"&VbTab&"C""D"&VbTab&"E"&VbTab&"F"当上面这个脚本运行的时候,它将显示如下:1AD2BE3CF这些固有常量只有在用VB写的时候才有用,它没有权力去用类似WMI,ADSI或者脚本的自

动控制的对象。在用VB脚本写的时候,你可以不用定义就使用Vb当中固有的常量,比如VbCrlf,VbYesNo,但是,当你用WMI,ADSI当中常量的时候,你必须显式的声明这些常量。例如,在ScriptRuntimeDrive对象当中有个固有常量fixed用来表示fixeddiskdrive,ScriptRuntime可以用这个fixed而不需要显式的声明,不用赋值给它……因为VB脚本没有权力访问这个常量,所以任何试图不去定义就访问这个常量的脚本都会失败或者遇到一个错误。例如,如下的脚本可以运行,但是不能标识任何一个你计算器上的fixed硬盘。SetobjFSO=CreateObject("stemObject")SetcolDiskDrives=ype=etterEndifNext这个脚本会执行失败,因为VB脚本并不知道Fixexd这个系统常量的值是2,取而代之的是将这个阿常量认为是一个变量。除非你把这个常量赋值,否则它的值就是empty.在这个例子中,VB将寻找DriveTypeproperty的值等于0而不是去寻找等于2,因为VB找不到任何这样属性的drives,脚本就没有返回任何的数据……为了使这个脚本工作,你必须创建一个你自己的常量,叫作fixed,并且显式的赋值给它为2,如下面的事例:ConstFixed=2SetobjFSO=CreateObject("stemObject")SetcolDiskDrives=ype=etterEndifNext==============================VBS脚本参考之四——脚本的数据类型VBScript的数据类型VBS是一个有着很少数据类型的脚本语言,其并不限制变量为一种单一的数据类型。VBS不允许你定义一个特定数据类型的变量。实际上,VB脚本只有一种变量类型,叫作variant,它可

以存储任何类型的数据。与其相反,其它程序语言比如C++是一个对数据类型要求很严格的,因为你必须事先定义变量能存储的数据类型。如果你试图存储任何数据在一个变量上,它将会报错。如果你已经将一个变量赋予特定的数字数据,那么你再将字母变量赋值给它的时候,它将崩溃。作者:临汾市外事旅游局薛靖澜,转载请注明Variants可以使脚本编写变得简单。你可以在没有定义数据类型的时候宣告并使用。但是如果你不了解数据类型的强制过程,那么variants会导致一系列的问题。脚本语言所说的脚本无类,其实是针对脚本编写的人员来说的,对于脚本内部来讲,脚本还是要依照数据类型来工作。例如下面这个简单的表达式c=a+b脚本语言必须给a,b都赋值(有一定数据类型的值),也就是说,它必须建立并确定这两个数值是为integer还是string。当这些值被定下来之后,它才可以执行相关的操作。脚本的数据类型赋值的初始化过程是一种数据类型强制转换的过程。数据类型的强制过程是基于特定的规则的,大部分的时候,VB脚本可以很顺利的完成这个任务。作者:临汾市外事旅游局薛靖澜,转载请注明但是,类型转换一样会导致问题的发生,例如下面这个例子:intFirstNumber=InputBox("Pleaseenterthefirstnumber:")intSecondNumber=InputBox("Pleaseenterthesecondnumber:")intTotal=intFirstNumber+tTotal如果你运行这个脚本,并且先后键入4,2,那么计算器会回显一个42来作为4+2的结果,而不是你期待的6。这是因为,加法运算对于number和string来说都是合法的。VB脚本给了4,2两个值,但是它不知道数据类型,于是,在没有其它的关于数据类型的相关信息的情况下,VB脚本就用类型强制的办法将这两个变量转换成了string数据。与其相反,如果你在下面一小段代码中键入4,2它将会返回正确2,这是因为除法运算只是针对numbers来作的,所以VB就用数据强制正确的将这两个变量转换成了number数据。intFirstNumber=InputBox("Pleaseenterthefirstnumber:")intSecondNumber=InputBox("Pleaseenterthesecondnumber:")intTotal=intFirstNumber/tTotal为了避免类似的数据强制的时候发生问题,你需要显式的声明一个变量,这个过程叫做类型初始化。例如如下的VB代码用VB脚本的CInt来在他们想加之前将输入的变量转换为整数型。intFirstNumber=CInt(InputBox("Pleaseenterthefirstnumber:"))