VBS是基于Visual Basic的脚本语言。VBS的全称是:Microsoft Visual Basic Script Edition。(微软公司可视化BASIC脚本版)。其语言类似Visual Basic(VB)。虽然看上去VBS仅仅是一个脚本语言,而且显得很“老旧”,但是如果我们的工作是基于windows平台的,那么,熟练使用VBS解决一些效率的问题,还是非常不错的。它即不需要安装其他的运行环境,也无需进行编译,双击即可运行,简单到使用记事本就可以开始编程。
那么VBS只能实现一些简单的功能吗?这要针对我们的需求来看,事实上VBS是Visual Basic的的一个抽象子集,是系统内置的,用它编写的脚本代码不能编译成二进制文件,直接由Windows系统执行(实际是一个叫做宿主host的解释源代码并执行),高效、易学,但是大部分高级语言能干的事情,它基本上都具备,它可以使各种各样的任务自动化,可以使你从重复琐碎的工作中解脱出来,极大的提高工作效率。
Vbs 脚本虽然是Script,就象Javascript也是Script,其实就是一种计算机编程语言,但是由于缺少计算机程序设计语言中的部分要素,对于事件的描述能力较弱,所以称为脚本。但Vbs有其自身的强大之处,那就是方便的提供了对 COM 对象的简便支持。
那么什么是 COM 对象呢?可以把COM 对象理解为windows下的一些具有特定函数功能项程序模块,他们一般以 ocx 或者 dll 作为扩展名,你只要找到包含有你需要的功能的模块文件,并在脚本中规范的引用,就可以实现特定的功能,也就是说Vbs 脚本就是调用现成的“控件”作为对象,用对象的属性和方法实现目的,完全免去了编写代码、设计算法等等麻烦。所以,Vbs甚至也经常被“黑客”利用,用来对windows计算机搞破坏。
在计算机本地建立一个VBS纯文本文件,扩展名为.vbs,内容写上
msgbox "Hello World!"
就完成了一个脚本,双击运行就会得到一个弹出窗口,就是这么简单。
当我们双击一个.vbs文件之后的过程,是由Windows Script Host来进行解释执行的。(Windows脚本宿主,WSH)首次出现在Windows 95 Service Release 2版中。WSH中“Windows”意味着,windows由各种组件组成,这各种组件分别提供操作文件、处理数据,更改操作系统设置等功能操作;WSH中“Host”(宿主)指的是,Microsoft将其脚本系统划分为两个部分:一部分(脚本宿主)负责管理脚本的组件对象,另一部分(脚本语言引擎)真正解释脚本语言自身。WSH充当语言引擎(用于解释你选择编写脚本的语言)和执行实际工作的组件或者对象之间的中介。
对于早期Web编程技术有所了解的人大概知道asp,是基于windows的IIS服务的web编程方式,服务器端所用到的就是VBS脚本。
————————————————————————莫名奇妙的分割线—————————————————————
回到正题,有时候我们可能需要实现一个很简单的自动化任务,使用复杂的编程语言就显得有点杀鸡用牛刀的感觉,这时候用VBS的确很不错。比如今天要解决的问题是:我需要每天定时从mssql数据库中读取一个表中的数据,然后调用企业微信的群机器人接口,把消息推送到群里面。
看上去很简单,想想又有点复杂对吧?要读数据库,要调接口,还要定时发送。是不是需要高级开发语言才能实现?但如果这了这点儿事儿,下载几个G的VS安装包似乎太不值当了。而且完且没必要,打开记事本,输入下面的代码,替换其中的配置信息,另存为.vbs文件,创建一个windows任务计划就可以搞定了。
先上代码:
'
' develop language : VBS
' function : 从 mssql 数据库读取数据,调用企业微信机器人webhook接口,以md格式发送消息。
' create date :2019.12.20
' components : ADODB.Connection,MSXML2.XMLHTTP
' author : aladdin
' email : master@may365.com
' zhihu : https://www.zhihu.com/people/waterbear2016
'
main() '调用主程序
Sub main()
Dim user,password,servername,catalog,table
Dim constr,resultdata
url ="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=*************************" '机器人地址,修改成自己的
user = "sa" '数据库用户名
password = "**************" '数据库密码
servername = "***************" '服务器名,或IP
catalog = "********************" '数据库名
table = "************************" '访问的表名
'WSH.Echo "this is a programe!"
resultdata = Getdata(user,password,servername,catalog,table)
WSH.Echo resultdata
' WSH.Echo HttpRequest(url,"POST",resultdata) '打印屏幕消息
End sub
'
' 从mssql数据库查询表数据
' 传入参数:user,password,servername,catalog,table
' 返回结果:请求webhook的字符串
Function Getdata(user,password,servername,catalog,table)
Dim constr,conn,rst
constr = "Provider=SQLOLEDB.1;Password=" & password & ";Persist Security Info=True;User ID=" & user & ";Initial Catalog=" & catalog & ";Data Source=" & servername
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = constr
conn.Open
If conn.State = 0 Then
rmsg = "连接数据库失败!请检查!"
Else
rmsg = "连接数据库成功!"
End If
Set rst = CreateObject("ADODB.Recordset")
sql = "select * from [" & table & "] order by 日期"
rst.open sql,conn,1,1
iRowCount = rst.recordcount
arrA = rst.GetRows()
If conn.state Then conn.close
set rst=nothing
set conn=nothing
outstr = "#### 最近7日业绩:\n" '消息标题,修改成自己的
recN = UBOUND(arrA,2)
for i=0 to recN
'WSH.Echo ("日期:" & arrA(0,i) & "销售:" & arrA(1,i) & "店数:" & arrA(2,i) & chr(10)) 下面是拼接字符串
outstr = outstr & ">日期:" & arrA(0,i) & " 销售:<font color=\""red\"">" & arrA(1,i) & "</font> 店数:" & arrA(2,i) & "\n"
next
rmsg = "{"
rmsg = rmsg & """msgtype"":""markdown"",""markdown"":{"
rmsg = rmsg & """content"":"
rmsg = rmsg & Chr(34) & outstr & Chr(34)
rmsg = rmsg & "}}"
WSH.Echo rmsg
Getdata = rmsg
End Function
'发消息函数
'传入参数:请求地址,请求方式,请求参数
'
Function HttpRequest(url,mode,params)
Dim oauth_http
Set oauth_http=CreateObject("MSXML2.XMLHTTP")
oauth_http.Open mode,url,False
If UCase(mode) = "POST" Then
oauth_http.setRequestHeader "Content-Type","application/json"
End If
oauth_http.Send(params)
HttpRequest = oauth_http.responseText
'msgbox HttpRequest
Set oauth_http = nothing
End Function
以上代码实现了读取数据库,调用企业微信Webhook接口,推送消息到群企业微信群的功能。要想实现定时自动执行,有两种方式:
-
按win+R键,输入taskschd.msc,呼出windows任务计划管理器界面,进行手工设定(步骤省略,如有需要请参考:https://zhuanlan.zhihu.com/p/134682676)。
-
当然也可以用VBS写一段创建任务计划的脚本,如下(这段代码来自微软官方文档https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-tasks--scheduled-tasks#related-topics,不过在win10下运行报未知错误,所以建议还是手工创建吧,如果你能解决在win10下运行的问题,请留言教我一下,谢谢!:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
JobID = "Test"
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreate = objNewJob.Create _
("Notepad.exe", "********143000.000000-420", True , 1 OR 4 OR 16, ,True, JobId)
If errJobCreate = 0 Then
WScript.Echo "Job created successfully: " & VBNewLine _
& "Notepad.exe scheduled to run repeately at 14.30 (2:30 P.M.) PST" & VBNewLine _
& "on Mon, Wed, and Fri."
Else
WScript.Echo "Job not created. Error code = " & errJobCreate
End If
最后,补充一下VBS的编辑器
虽然可以用notepad来写VBS脚本,但是如果稍微长一点的代码,调试起来大概只能用msgbox,或者WSH.Echo这种方式来跟踪变量,还是很不方便的。其实VBS脚本编辑有个很强大的工具:vbsedit
用它就可以设置断点调试了,还可以把VBS转换为exe可执行文件,还有常用代码片段,常用样本等等,没有比它更好的VBS编辑器了(也许只是因为VBS太少人用吧)。
如果此文对你有用,顺手点个赞吧,欢迎交流!