中国电子科技集团公司第二十九研究所 罗 刚 罗小平 薛 磊
日常生活、工作、学习中,计算机操作很简单,但在操作过程中,很多事情在流程上都具有重复性。也许你每天启动计算机第一件事都是登陆某个网站,打开常用的办公软件,也许需要对文件进行大量的重命名、复制、粘贴、删除、数据处理等操作,重复、琐碎,让人容易产生疲劳,甚至出错。
有没有一种简单易学的编程语言,能代替人工实现自动化操作呢?VBS是一款非常适合的工具。
VBS是VBScript的简写,不同于其他高级语言,它是基于Visual Basic的脚本语言。不需要先去学习系统架构,复杂的语法、命令、算法等,用VBS编写的代码简单、易学、高效,也不用编译转换成exe,源代码可直接由Windows系统执行,大部分高级语言能处理的,VBS基本都具备。VBS编辑工具为文本编辑器,最常见的就是记事本,编辑好后保存为*.vbs的文件,双击即可运行。
用Dim来声明变量,类型不需要声明,对变量、函数、方法、对象的引用是也不区分大小写的。需要注意的是,不允许在声明变量的同时给变量赋值,多个变量用逗号隔开,注释用分号标注,VBS中所有符号只能是英文符号。用Const定义常量,需在定义时赋值。如:
Dim a,b ‘定义变量a和b
Const c=10 ‘定义常量c,值为10
Inputbox,运行后弹出带提示且可输入内容的对话框,返回值将传递给函数或变量。如:
a=Inputbox(“提示”) ‘引号内为提示消息
Msgbox,以对话框形式观察输出结果。如:
Msgbox a ‘显示a的值
VBS中条件判断语句有If和Case两种。
If判断语格式为If…Then…End If,若需对多个条件进行判断,使用Else If … Then。If和Else If需要分别对应一个End If结尾。但有两个及以上的Else If时,只需要一个End If结尾。
Case判断语句:针对有很多种不同的判断情况,Case比If语句更简单方便。格式为Select Case变量名…Case 值…End Select
无限循环语句,Do…loop。
条件循环,Do While…Loop,条件为true的时候执行循环体,需要跳出循环用Exit do。与while相反的是until。
计数循环,For i=n to m…Next,这是一种基于计数的循环,是最常见的循环结构,经常用来做单循环和嵌套循环。每一个for需要对应一个next结尾。
掌握了VBS基本知识后,我们可以进一步运用,编辑一些自动化脚本,如自动运行软件、打开网页、模拟键盘输入,定时操作等,减少人工操作,为我们带来便利。
VBS强大之处在于简单的指令完成复杂操作。只需两行简洁的代码便可启动外部程序,如运行一个记事本程序:
Set abc=CreateObject(“Wscript.shell”)
abc.Run”notepad”
Set是VBS指令,用于将对象引用赋给某个变量,abc是变量,abc.Run调用的就是Wscript.shell中的Run函数。值得注意的是,一般在程序结束前需要释放变量所占内存空间,如:Set abc=nothing。Notepad可替换成其他程序的绝对路径,如abc.Run”D:QQQQ.exe”,也可以是网址或IP地址,如abc.Run”http://www.baidu.com”,多个任务需分行输入指令,可一键打开所有需要用到的程序和网页。
Sendkeys:模拟键盘操作指令,妙用该指令简化重复操作,可以向当前最前端窗口发送指令或字符串。如:
Set abc=CreateObject(“Wscript.shell”)
abc.Run”notepad”
Wscript.sleep 1000‘等待1000ms
abc.Sendkeys”123”‘往打开的记事本填入123
Sendkeys引号内的字符是分为基本键和特殊功能键,基本键按字符顺序排列在一起即可,特殊功能键Shift用+、Ctrl用^、Alt用%代替。
编程难免会遇到错误,VBS中提供了一条On error resume next的语句,意思是在该语句后的代码运行出错时,程序忽略当前语句或返回值错误并继续执行。若在某一段代码后又想恢复,则使用语句On error goto 0,意思是在该语句后的代码运行出错时,程序会停止运行并弹出错误提示框。
获取系统时间的函数为date和time,直接赋给变量即可。Date获取当前年月日,time获取当前时分秒。由于系统时间有很多种格式,编程时需要统一格式,那就用时间转换函数Cdate,该函数可以根据电脑系统设置,把预设时间转换成当前系统的格式,防止因格式不同而出错。若系统时间格式为2000年1月1日,a=”2000/1/1” ‘若时间代码写为2000/1/1。
b=Cdate(a) ‘将时间格式转换成系统格式
msgbox b
通过换转后变量b的值为2000年1月1日。
我们的操作基本上都是基于时域进行的,以时间为基准,设计各种执行方案,在编程时,那就需要用到时间比较函数,根据当前时间是否到达预定时间来做判断,时间比较函数为datediff,格式为变量=datediff("格式",时间1,时间2),意思是以一定的格式表示时间2减时间1的差值,格式可以是年月日时分秒周等,使用时非常方便。如:
d=datediff(“n”,a,c) ‘比较预设时间和当前系统时间的差值,并以分钟表示,n代表分钟
msgbox d ‘显示预设时间与系统时间的差
日常工作中,经常会遇到要修改几十上百个,甚至更多文件的文件名,而这些文件名中又含有相同字符,若依次去重命名每一个文件,那将面临巨大的工作量,而且是重复操作,会耗费大量的时间。下面是使用VBS编写的批量修改文件名代码,可以将有相同字符的替换成想要的结果,代码为原创,只用了最简单的条件判断if语句和计数for循环便可实现。
在运行批量修改文件名代码时,如果不输入文件路径点确定,则会弹出”文件夹不存在”提示,对于Inputbox而言,只要弹出对话框,无论用户是否输入了值,点击确定、取消或关闭按钮中任意一个,该条语句就算成功执行,然后继续执行下一条语句。
假如用户没有输入任何值点了确定,或者输入0点确定,又或者点了取消或关闭按钮,这三种情况的返回值都是0,若不加以区分,错误的结果会导致后续程序出错。
在现有文献中,未找到相关解决办法来识别用户到底采取了哪种操作。经长时间探索,总结出了一种可以通过判断返回值的类型和长度,再利用系统错误处理,能准确判断用户的操作的方法,编程者可以根据判断结果进行提示和决策脚本后续处理方式。代码如下:
Len为计算表达式的长度,cstr转换成字符型,cint转换成整型。当用户未输入任何值并点确定时,a为空,cint(a)转换会出错,但我们使用了On error resume next,忽略了该错误,程序继续运行,这样就能利用“错误”处理来进行分辨。当用户点了取消或关闭时,a返回值为0,linta为1。
VBS简单易学,实用性强,功能强大,巧用内置函数,用简单的代码、基本语句就可完成繁琐、重复的操作,在日常生活办公中能实现自动处理、模拟输入、定时操作、批处理等各种自动化,解放人力,提高工作效率。