VBS读取SQL数据库并调用企业微信机器人webhook接口发md格式定时消息

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接口,推送消息到群企业微信群的功能。要想实现定时自动执行,有两种方式:

  1. 按win+R键,输入taskschd.msc,呼出windows任务计划管理器界面,进行手工设定(步骤省略,如有需要请参考:https://zhuanlan.zhihu.com/p/134682676)。

  1. 当然也可以用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

官网是:http://www.vbsedit.com/

用它就可以设置断点调试了,还可以把VBS转换为exe可执行文件,还有常用代码片段,常用样本等等,没有比它更好的VBS编辑器了(也许只是因为VBS太少人用吧)。

如果此文对你有用,顺手点个赞吧,欢迎交流!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值