更新时间:2023-11-29 08:49
大家最关心的就是用什么工具来开发VBS程序了, 答案是:记事本(Notepad),我不是开玩笑, 其实任何一种文本编辑器
把上面的程序清单输入到记事本里面, 然后保存为以.vbs为扩展名的文件(然后双击, 观察运行结果.
为了上面的东西更精简,更明了,我们可以精简一下它的内容:
语法解释:
第一行,给第一行的inputbox(输入框)命名:name
第二行,弹出对话框,对话框的内容就是第一行的inputbox输入的内容。
要点:
1) 注释(以REM或'开头)行在程序中不起作用, 但能让别人更容易读懂你的程序.
5) Inputbox函数弹出一个输入对话框,Msgbox则用于输出
先说常量, 这个比较简单.
什么是常量呢, 常量就是其值不可变化的量.
常量分为两种:第一种, 自然常量. 这叫是因为它们本身就是常量, 你怎么更改21的值呢? 他永远都是21, 不可能变成46
第二种, 是我们自己定义的常量系统定义了有特殊功能的字, 不能作为变量名或常量名使用)
格式是:const常量名=常量值.
例如:
这样我们就定义了两个常量, PI和NAME, 一般说来, 常量名全部使用大写, 但也可以不用, 随你喜好. 将一些在程序中不需要改变的值定义为常量是个好习惯, 这样能防止不必要的意外. 另外, 使用自定义常量也可以减少你的工作量.
要点:
1) 常量分为自然常量和自定义常量, 常量的值不可修改
2)变量就像盒子, 我们不在乎盒子里装的是什么, 但一定要知道盒子的名字
3) 四则运算在编程中没有任何不同
4) MOD是取余运算
请看一下程序清单:
(1)
这个 输入1、2时是6
(2)
这个输入1、2时是24
怎么修改这个程序呢? 我们需要用到另一个内建的函数:int, int函数的功能是将输入值转化成整数值, 我们这样修改:
这个意思就是把a作为参数传递给int函数, int函数就会返回那个整数(你的输入值), 然后让返回值参与运算, 这样就得到了正确答案.所以,以后如果你用的是inputbox函数的话,最好用int语句加工一下:比如c=int(c) 'c是你自己的变量
另外,还有一个函数:CDbl。如果你想把字符转换为数字,但又不取整时就用这个:
这样输入1.2,1.3时依然就得出5。不过这样写比较适合学习过一段时间VBS的朋友.
大家是不是觉得这个课程有点枯燥?呵呵, 变量和运算符部分的确是这样的, 不过多多练习也就好了, 这次, 我们写写真正好玩的东西: 流程控制语句. 这个部分开始才是真正的编程.
首先介绍判断结构.
在此之前, 我们先介绍一种简单的变量类型:布尔值
回到if语句上来, 我们先来看看简化版的if语句:if 判断式 then 语句体 我们来看一个例子:
我们只看最后一行, a>b这个式子(表达式)有一个返回值, 是Boolean型的. 因为这个式子只有两种可能:b大于a, b不大于a, 所以这个式子也只有两种可能性, 即真或者假. if语句判断这个表达式的返回值是真还是假, 如果是真(true)则执行then后面的语句, 如果是假, 则不执行, 你把a的值改成14看看还会不会弹出对话框?
当我们要在判断之后执行多行语句怎么办呢, 我们需要用语句块来解决, 在这里可以叫块if
看到多了一个else了吧, else的作用就是当要判断的表达式为false时执行的. 这样程序就可以处理两种不同的情况了. 不要忘了用end if结尾
嘿嘿, 我是“变态者”, 我要你处理三种情况, <100,=100,>100, 还要写在一个if结构里, 你怎么办, 我给你答案:
哈哈, 无论你回答得多么正确你都是猪头, 不是我耍你, 还是文章开始时候的inputbox
这样就成功了. 这也是Inputbox函数的一个讨厌的地方, 没办法, vbs没有其他好的输入方式了.
说到if, 我们不得不说一说逻辑运算符
这段程序让你输入两个值, 必须都大于10, 只要有一个不大于, 就输出错误
当你的程序要处理很多种不同的判断情况的时候elseif..then会让程序看起来很杂乱, 所以就有了一种select case结构专门对付这种情况, select case的语法结构很简单:
我们举个例子就能很简单的说明:
要点:
1)inputbox返回的是一个字符串, 而不是一个数, 必须用a=int(a)这种形式转化成数
2) bool变量的值只有两种:true,false
2.5) and两边的表达式都是true, 则返回true. or两边的表达式有一个是true, 就返回true
3) if 语句的格式
4) select...case的格式
我们先来看一道题:商场进行每日结算, 要求累加出每日每日的营业额, 每次输入一个数, 这道题其实很简单, 但就我们这之前学过的知识要完成这道题相当麻烦, 我们来分析一下. 首先, 我们需要知道买卖的次数, 这样才能控制输入的次数,但是, 这种设计是非常低效的, 每天都要重新设计程序. 假定进行了5次交易, 以下是源程序:
看到了吗, 我通过把计算过程复制了5遍才设计好了程序, 这种程序在汽车交易所等交易次数少的地方还能凑合着用, 如果放到超市岂不是要复制, 讲的内容就可以克服这种缺陷, 以下Do...Loop语句.
do...loop的结构看上去非常简单, 就是:do(until)……loop 而已。当程序执行到 do 之前,首先判断 until 条件是否成立,如成立则不执行下面代码,如不成立,则执行一遍,再判断条件。
运行这个程序, 当你点销掉一个对话框马上会出来另一个, 你永远点不完, 总有下一个. 谁会运行这样的程序? 除非是给别人捣乱(我就干过这种事), 所以在do..loop结构中还有一个语句:exit do, 这个语句将终止循环, 跳到loop后面的语句继续执行.举个例子来说:
这个程序会一直不停的问你密码, 直到你输入了正确的密码为止.(if可以嵌套在另一个if当中, 也可以嵌套在循环体当中, 所以一定要用缩进, 来分清楚程序的各个部分). 这个程序是很经典的, 早期的程序都是这么做的. 但是这种程序的安全性并不理想,想必通过这么多时间的学习,应该也是可以看懂的吧?因为 这种无限次认证程序很容易被穷举破解, 我们就需要来限定认证的次数. 修改程序如下
运行这个程序试试看, 当你出了3次错误以后, 就会停止再次询问密码, 关闭程序. telnet认证用来限制次数的程序与此大同小异. 要注意的是嵌套的if语句, 请仔细读一下这个程序, 可能比较难懂, 也请你试着自己设计一下类似的程序.
其实, 要在do...loop加上验证的功能, 并不一定要用until, 我们可以用while. 我来介绍一下while关键字, while可以放在do或者是loop后面, 然后再接一个表达式, 当表达式的值为true的时候(表达式成立),才运行循环体.我们来看一下修改后的
这样实现的功能和上一个例子完全一样,我们再来看看把while放在loop后面:
功能是一样的, 为什么要放在loop后面呢? 你把ctr的值改成3就知道了, while在do后面的程序会直接退出, 而在loop后面还会允许一次认证, 到了loop才结束.和while相反的是until, 用法和while一样, 不过他只有当后面的表达式的值为false(表达式不成立)的时候才执行循环体, 请自己试验一下
注:其实do……loop 结构可以用 exit do 跳出,可以自己练习。
ok, 我们来看另外一种循环结构,for....next, 这种循环结构是基于计数的, 也是在编程中最常见到的循环结构.
看到了吗?每次输出的i都是递增的, 但我们没有明确指出i要递增, 当i达到5的时候, 循环就结束了, 因为由0开始, 所以循环体执行了6次, 这一点很重要, 大部分东西都是从0开始而不是1. 这个程序也可以写成 do……loop 的形式:
怎么样, 还是for比较好用吧. for在编程中很有用途, 我们再举一个例子, 顺便讲一下嵌套循环.
(这样出现的结果是一次性的,如果你需要依次出现把msgbox str)提前到next前)
源程序:
这次运行完成以后, 输出结果按照乘数进行了分割, 每小for运行完一次, 就换一行(通过vbcrlf).
另外, 如果有程序抢占了vbs这个扩展名,那么, 请把那个软件卸载掉。
我们来总结一下:
要点:
1) do..loop和exit do的用法
2) while当表达式true的时候执行循环体,until反之
3) for...next是计数循环, 每次执行计数器递加
4) 嵌套循环的作用和写法
4.5) &用于连接字符串
5) vbCrLf相当于键盘上的回车键
数据库系统, 假设你要储存20名学生的英语成绩, 如果不是用数组, 你则要创建20个不同的变量, 累死. 数组就是类型相同(重要!)的一组数据(或者n组), 用来储存相关的量, 最简单的数组是一维数组, 我们就先来学习它吧.
我们可以看到, 定义一个数组的方法和定义一个变量没有什么不同, 同样是使用dim语句. 定义一维数组的方法如下:
如果你这个都想不到的话, 那你真是白学了:
这样我们就有了一个小小的数据库, 它们的数据排列可以看成这样:
name(0),name(1),name(2).....name(7)
数组有很多用处, 我们来看一下一个复杂的例子. 我们要储存3各学生的名字, 身高, 成绩这三种数据, 由于名字是字符串, 而身高可能是浮点数(带小数点的数), 成绩则可能是整数, 所以我们不能把他们储存在一个数组里面(不要忘记, 数组只能存储同类的数据), 所以我们要建3个数组, 以下是例程:
OK, 我们已经填充好了数据, 在我们的小小数据库只能按顺序输入, 我们要让它看起来像点样子, 我们来给他设计查询功能:
嘿嘿, 有意思吧, 其实在这个程序里面, 那个temp变量完全没有必要, 只是为了更清楚地说明问题. 因为当exit for以后ctr变量的值就不会改变, 储存的正好是对应数据在数组中的位置, 写这个temp变量是为了照顾到以后要学C++的朋友(C++可以在结构里声明新变量, 只在这个结构中有效, 所以到了外部就不能访问了). 也就是说可以简化成如下:
这是最直接的路子. 好好重读一下上面所有的源代码, 然后自己写几个程序, 完全搞清楚一维数组
编号 0 1 2
0 X,X,X
1 X,X,X
2 X,X,X
假如需要储存的都是同一类型的数据, 我们就可以用二维数组, 比如要储存5个人的姓名,国籍,民族, 就可以使用二维数据
'输出太麻烦了, 我懒得动, 你知道那么回事就行了
这样就不需要定义3个一维数组了.
多位数组(三维以上)的定义和使用方法与二维数组一样, 但不太好在欧几里德几何空间里加以解释, 幸好我们并不太常用那么多维的数组.定义一个三位数组:dim a(1,2,3) '一共24各数组元素.
要点:
2)数组的下标从0开始
3) for循环在数组的应用中起了很大作用, 二维数组需要嵌套循环
学习基础篇的最后一个部分:自定义函数和过程. 我们每天都在和函数打交道,inputbox()是函数, msgbox )是函数, int(也是函数...这些函数都是系统内建的, 就教大家怎样自己制作一个函数.
多么麻烦呀, 我们把相同的比较过程复制了好几遍, 早期语言没有结构化(没有过程和函数)的时候, 程序员们的确是这么干的, 那个年代也没有剪贴板这一说, 大家都是重新输入代码. 后来工作简化了:
我们在这里是用了一个新的关键字:funciton, 这个关键字表示一个新函数开始,格式:
...
exit function '结束函数, 不是必需的
...
end function
函数是一个模块, 只有你调用的时候才会运行, 也就说, 当你编写了一个函数, 然后在程序中并不调用它, 那么这个函数永远不会运行. 一般来说, 我们编写程序是按照:
主程序
......
......
......
函数1
......
......
函数2
......
......
msgbox name1,name2,name3
在VBScript中,参数传递是一种传值, 而不是传址(听不明白不要紧, 学了C语言的指针被调用过程
有一个函数是ht, 则返回的方法是:ht=你要返回的值. 注意:返回以后, 后面的语句将不再执行.
调用一个函数我就不用讲了吧:变量=函数名(参数)
就在于:1) 没有返回值, 2) 使用sub关键字定义, 3) 通过Call调用.举个例子:
你一定看明白了, 很简单的. 退出一个过程和退出一个函数一样:exit sub(函数:exit function).
要注意,子程序(过程)是比较特殊的一个结构, C等语言是没有这个概念的, C语言中的一切都是函数, 没有返回值的函数在C语言中只要将参数设定为 void 就行了.
+ 数字加法及字符串连接
- 数字减法
* 数字乘法
/ 数字除法
Mod 求余数
& 字符串连接
^ 次方
= 相等
<> 不相等
>= 大于或等于
> 大于
<= 小于或等于
< 小于
Not 非
And 且
Or 或
Xor 异或
循环及决策
if ....then 若...则...
if ...then...else 若...则...非
else if... 非若
select case... 群组选择条件
end select
for ... next 计数循环
while...wend 条件循环(一)
do while...loop 条件循环(二)
do...loop while 条件循环(三)
do until...loop 条件循环(四)
do...loop until 条件循环(五)
Abs 绝对值
Sgn 正负号
Hex 转换成十六进制
Oct 转换成八进制
Sqr 平方根
Int 取整数
Fix 取整数
Round 取整数
Log 以e为底的对数
Sin 正弦函数
Cos 余弦函数
Tan 正切函数
字符串处理函数
IsNull 判断对象是否为空
Len 字符串长度
Mid 取部分字符串
Left 从字符串开头取部分字符串
Right 从字符串结尾取部分字符串
Lcase 转换成小写
Ucase 转换成大写
Trim 清除字符串开头及结尾的空格符
Ltrim 清除字符串开头空格符
Rtrim 清除字符串结尾空格符
Replace 替换字符串部分字符
Instr 判断是否包含于另一个字符串(从起始搜寻)
InstrRev 判断是否包含于另一个字符串(从结尾搜寻)
Space 任意字符数的空格符
String 任意字符数的任一字符
StrReverse 反转字符串
Split 以某字符分割字符串
数据类型转换函数
Cint 转换成整形
Cstr 转换成字符串
Clng 转换成长整数
Cbool 转换成布尔函数
Cdate 转换成日期函数
CSng 转换成单精度
CDbl 转换成双精度
Date 日期
Time 时间
NOw 日期时间
DateAdd 增加日期
DateDiff 两日期差
DateSerial 日期设定
Datevalue 日期设定
Year 年份
Month 月份
Day 天
Hour 时刻
Minute 分钟
Second 秒钟
Timer 午夜距秒数
TimeSerial 时间设定
Timevalue 时间所属部分
WeekDay 星期名称
MonthName 月份名称
其它函数
Array 产生数组
Asc 字符ASCII码
Chr ASCII码字符
Filter 过滤数组
InputBox 输入窗口
Join 合并数组中的元素
MsgBox 信息窗口
Lbound 数组下界
Const 设定常数
Dim 定义变量或者数组
Erase 清除数组
ReDim 重新声明数组
Randomize 起始随机数
Rnd 取得随机数
ASP对象
IsEmpty 测试Session变量是否存在
TimeOut 设定Session变量生存周期
Abandon 强制清除Session变量
Application对象
IsEmpty 测试Application变量是否存在
Lock 锁定Application变量
Unlock 解除Lock指令的锁定
Cookies对象
Expires 设定Cookies变量的生存周期
Open 打开与数据库的连接
Execute 打开Recordset对象
Close 关闭Connection对象
Recordset对象
movefirst 将记录指针移至第一条
movelast 将记录指针移至最后一条
movenext 将记录指针移至下一条
moveprevious 将记录指针移至上一条
bof 测试是否为recordset的起始
eof 测试是否为recordset的结束
open 打开Recordset对象
close 关闭recordset对象
fields 读取数据的子对象
fileds.count 字段个数
pagesize 每页记录条数
absolutepage 设定为某页
pagecount 总页数
Absoluteposition 直接跳至某条记录
网络和计算机的发明给人们的生活和学习带来了极大的便利。但任何事物都有两面性,网络和移动设备传播的病毒对人们日常生活的影响越来越大。以VBS移动U盘病毒为研究对象,从病毒攻击和防御两个方面,讨论VBS移动U盘病毒的自复制、病毒激活、病毒封装、文件拷贝和病毒防御。信息安全需要解决的问题,对用户了解和预防当前生活中普遍存在的U盘病毒具有一定的指导意义。