配置环境
使用VSCode打开,下载vbscript-format插件,这个快捷键可以格式化vbs代码。
Option Explicit
'常数在声明和赋值必须一步完成
'常数在程序运行期间,不能被重新赋值,否则,报错
const id = 43
'变量
Dim num_a
MsgBox "Hello World!", 65, "MsgBox Example"
'vbcr:回车符; vblf:换行符 ; vbcrlf:回车与换行符 ; vbNewLine:新行字符
'"_" 表示分行的数据为同一行数据 <单行拆分>
'":" 表示通过":"可将多行的数据写在一行上<多行合并>
num_a = "Hello " & vbNewLine & "world!"
MsgBox num_a & vbCr & "num_a type is :" & TypeName(num_a) & vbLf &_
"num_a number :" & VarType(num_a)
Option Explicit
表示之后的变量必须显示声明,否则程序将报错,包括for 循环中的“i”,不然就会报错,一般都是放在文件最上面
一般声明变量都是用Dim声明的。还有Public和Private。
变量的定义与声明必须分开说明
运算符
"/" 和 "\" 算法不同
浮点除法(常用的):5 / 4 = 1.25
整数除法:5 \ 4 = 1 (结果为整数,不会四舍五入) 7 \ 4 = 1
整数除法的优先级低于乘法和除法
求模运算
舍弃商而求余数的整除运算
操作数只能为整数,结果符号与左操作数相同
7 Mod 3 = 1 -7 Mod 3 = -1 -7 Mod -3 = -1
字符串运算符
合并字符串的运算符,包括 “&” 和 “+”
& 是纯合并字符串,两边都是数字也做合并操作 2 & 2 = 22
+ 一边是数字(另一边是字符串类型的数字)会计算 (13 + "22" = 35)
数字和非纯数字的合并只能用&。 "+"会报错
使用'&'可拼接任意类型的数据,有一点值得注意,如果&两端都是数字常量,则不能连续使用,必须存在空格,如: 111 & 777 ;此时才能完成连接,若为111&777会报错。
逻辑运算符
优先级:Not > And > Or > Xor
Xor(异或) :两个操作数结果不相同时,结果为真
True Xor False = True
True Xor True = False
MsgBox "逻辑非 not 2: " & (Not 2)
MsgBox "逻辑异或 1 xor 1: " & (1 Xor 1)
MsgBox "逻辑等价 1 eqv 2: " & (1 eqv 2)
MsgBox "逻辑隐含 1 imp 2: " & (1 imp 2)
IsNumeric
在VBS中,IsNumeric()函数的实际作用是判断参数表达式是否是数值,而这个所谓的“数值”不仅仅包含普通的数字,还包括(但可能不限于)如下情况:
科学计数法表达式,如“2e7”和“2d7”;
十六进制数,如“&H0A”;
八进制数,如“&6”;
当前区域下设置的货币金额表达式,如“¥12.44”;
加圆括号的数字,如“(34)”;
显式指定正负的数字,如“+2.1”和“-2.1”;
含有逗号的数字字符串,如“12,25”。
不仅仅是VBS,JScript/JavaScript的isNaN()也存在类似问题,T-SQL中的IsNumeric()同样如此!
if条件判断
option explicit
dim a
a=1
select case a
case 1
msgbox "a=1"
msgbox "wow"
case 2
msgbox "a=1"
case else
msgbox "I don't know"
end select
使用建议:开头的select case后填变量,后面的case填变量值,语句执行范围为目标case到下一个case之前,也就是说,当a=1时,执行的就是msgbox "a=1"和msgbox "wow",执行完就结束select了,不需要break
循环
do ... loop循环
'do while/until ... loop
option explicit
dim a
a=1
do while a<10
a=a+1
if a=5 then
exit do
end if
loop
msgbox a
提示:将该循环拆成三部分理解。
1、do到loop之间的代码为循环执行的代码。
2、while表示当条件满足继续执行循环。与之对应的是until,表示当条件满足则结束循环。这个根据字面意思应该也能理解。而且while或until可以放在do后面,也可以放在loop后面。放在do后面表示先判断后执行,放在loop后面表示先执行后判断。
3、exit do表示在该位置结束循环,继续执行循环外的后续代码,要和if等条件判断语句连用,直接放在循环体执行一次就退出了。
while...wend循环
option explicit
dim a
a=1
while a<10
a=a+1
wend
msgbox a
提示:while ... wend是不能中途退出的
for ... next循环
option explicit
dim a
a=0
dim b
b=0
for a=0 to 11
b=b+1
if a=5 then
exit for
end if
next
msgbox a
msgbox b
提示:for ... next 中,
1、条件必须是一个变量=val1 to val2这种形式,运作原理就是让这个变量依次等于范围内的值,比如上式中:a=0 to 11,表示先a=0,再a=1,a=2,a=3...a=11。
2、可以使用exit for直接跳出循环
3、在循环体内改变遍历条件对应变量的值会影响到次数,比如我在循环体里直接将a=12,那么就已经超出0~11了,此时就会退出循环。
4、正常退出循环后,依旧会对循环变量加1。但是如果使用exit for结束循环,则不会
使用建议:该循环比较适合用在定义一个下标变量去遍历数组
for each...next
option explicit
dim i(5),j
i(0)="a"
i(1)="b"
i(2)="c"
i(3)="d"
i(4)="e"
i(5)="f"
for each j in i
msgbox j
if j="d" then
exit for
end if
next
使用建议:去遍历一个数组或者集合,可以使用exit for退出
方法
function,sub均可带参数,function可有返回值,sub不能带返回值
调用:function(a,b),sub a,b
ett = 0
MsgBox ett '0
e = add(2,6)
MsgBox e '8
MsgBox ett '4
Function add(a,b)
add = a + b
ett = a + a
end Function
注意:尽管在定义子程序(sub)的时候,参数列表要加括号,但在调用子程序的时候,参数列表不加括号,括号只在函数中使用。另外,子程序不能在表达式中使用。
而函数只能出现在赋值语句的右边,或者表达式中,函数不能直接使用,如果必须直接使用函数,则必须使用 call 语句调用,并取消返回值。
数组
option explicit
dim arr() '使用括号表示数组,括号没有填值,只表示一个动态数组变量,并没有指定长度
dim arr2(2) '此时声明arr2时,指定了长度,那么这个长度就不可变化了
dim arr3(3,4) '二维数组
redim arr(3) '可使用redim定义一个数组长度,如果该数组变量在声明时是已经确定长度的,则会报错
redim arr(4) '对于不确定长度的,可多次改变数组长度
'redim arr2(5) 会报错,因为arr2已经在声明时固定了长度
'preserve关键字标识在redim时是否保持原值不变,如果不加该关键字,在重新构建数组时,原值会被清空
'redim 增加一个preserve关键字后可重新定义数组长度的同时保持数值不变,
'变长则多出来的部分默认为空,变短则截断,即使后面再变长回去数据也不在了
redim Preserve arr(3)
arr(0)="aa" '数组下标从0开始
arr(1)="hh"
msgbox arr(0)'输出数组第一位
数组补充说明(不同于其他语言的数组的部分):
如dim arr(2),按照现在最常见的理解,数组长度为2,包含arr(0)和arr(1)两个元素
但事实上arr包含了0,1,2三个下标的元素
声明多元数组使用逗号分割下标dim arr(2,3),维度从左到右,从低到高(2为一维)
ubound(arr,dim)函数用于获取下标最大值,arr表示数组名,dim表示维度
lbound与ubound对应,是用于获得下标最小值和最大值的,但目前看来,始终为0
类
'定义类
Class Stu
'定义带参数的函数,并有返回值
Function output_fun(fir,sec)
output_fun = fir & sec
End Function
'定义带参数的过程
Sub output_sub(fir)
Const con = "Mary,"
MsgBox con & fir
End Sub
End Class
'实例化变量
Set s = New Stu
'调用类中的函数,并给出实参
MsgBox s.output_fun("Hello"," world") => Hello world
MsgBox s.output_fun(1,2) => 12
'调用类中的过程,并给出实参
s.output_sub("How are you?") => Mary,How are you?
'1类的定义和声明
Set MyUser = New User '在强制声明的情况下,需要先dim声明变量
Class User
'Initialize事件相当于构造函数
Private Sub Class_Initialize '当这个类被创建时执行
MsgBox "类开始"
End Sub
'Terminate事件相当于析构函数
Private Sub Class_Terminate '当类被销毁时执行
MsgBox "类结束"
End Sub
End Class
'2、类结构
Class User
Private pri_var '私有属性
public pub_var '公共属性
Private Sub Class_Initialize '构造过程
End Sub
Private Sub Class_Terminate '析构过程
End Sub
Public Property Get get_xx '故有的属性get,与function类似
End Property
Public Property Let let_xx '故有的属性let
End Property
Public Sub ToString() '自定义过程
End Sub
Private function getString() '自定义函数
end function
End Class
'3、类的实例创建和释放
set obj = new object '声明
set obj =nothing '释放
'4、当一个对象不被引用时,会自动释放
'冒泡排序
Function sort()
Dim arr_sort,i,j
arr_sort = Array(1,3,5,7,9,2,4,6,8,10,-1,100)
For i=0 To UBound(arr_sort)-1
For j=0 To UBound(arr_sort)-1-i
temp=0
If arr_sort(j) > arr_sort(j+1) Then
temp = arr_sort(j)
arr_sort(j) = arr_sort(j+1)
arr_sort(j+1) = temp
End if
next
next
For i=0 To ubound(arr_sort)
MsgBox arr_sort(i)
Next
End Function
sort()
1、创建对象Dim fso
Set fso = wscript.createobject("scripting.filesystemobject")
2、常用方法,已声明
Set fso = wscript.createobject("scripting.filesystemobject")
CreateTextFile:fso.CreateTextFile"C:\test.txt",true
//创建文件,第二个参数表示是否强制覆盖,true为覆盖
CreateFolder:Fso.CreateFolder "c:\test"
//创建文件夹,只有一个参数
DeleteFile:Fso.DeleteFile "c:\test.txt", true
//删除文件,第二个参数用于强制删除只读文件时,true为强制删除
DeleteFolder:Fso.DeleteFolder "c:\test",True
//删除文件夹,第二个参数用于强制删除只读文件夹,true为强制删除
FileExists:Fso.FileExists("c:\test.txt")
//是否存在文件,返回布尔值
FolderExists:Fso.FolderExists("c:\test")
//是否存在文件夹
CopyFile:Fso.CopyFile "c:\test.txt","D:\",True
//复制文件第一个参数源文件路径,第二个参数目标目录路径,第三个参数,是否强制覆盖
CopyFolder:Fso.CopyFolder "c:\test","D:\",False
//复制目录第一个参数源目录路径,第二个参数目标目录路径,第三个参数,是否强制覆盖
MoveFile:Fso.MoveFile "c:\test.txt","D:\" //移动文件,第一个参数源文件路径,第二个参数目标目录
MoveFolder:Fso.MoveFolder "c:\test","D:\"
//移动目录,第一个参数源目录路径,第二个参数目标目录
GetExtensionName:fso.GetExtensionName("c:\test.txt")
//获取后缀名
GetBaseName:Fso.GetBaseName("c:\test\test.txt")
//获得文件名,不含后缀
GetParentFolderName:Fso.GetParentFolderName("c:\test\test.txt")
//获取文件当前路径
OpenTextFile:Fso.opentextfile("filename"[,iomode[,create[, format]]])//返回一个textstream对象,第一个参数文件名,第二个参数为io模式,1为只读,2为覆盖写,8为在末尾写,第三个参数表示不存在时是否创建,第四个为编码格式,这里不做赘述,到时候直接查
'使用控制台运行jar包dim ws
set ws = createobject("Wscript.Shell")
ws.run "cmd /k java -jar .\youApp.jar"