VBS–基础语法整理

VBS–基础语法整理

前言

当初学VBS主要是为了使用一个脚本文件直接启动可执行jar包,所以就简单学了一下VBS的使用,浅尝辄止,需求达到了也就不再深入学习了。至于为什么不用bat之类的其他脚本语言或者打包成exe,只是当初有需要,刚好看见VBS可以实现功能,就学了。当然各位有更好的推荐,请不吝赐教!

如果您是想尝试学习使用VBS脚本,那么本文章可供参考,写的不好的地方,多多包涵!

1、VBS不区分大小写

vbs所有代码均不区分大小写

2、语句结束

vbs不可以使用;作为语句结尾,会报错,直接换行则表示一条语句。

3、代码注释

VBS就一种注释方式,使用一个英文单引号进行注释,注释内容为当前行单引号后的所有内容

option explicit
dim var1,var2 '多个变量声明用逗号隔开

4、变量声明

  • 显式声明:Dim、Public、Private语句进行声明
  • 隐式声明:不声明直接使用,相当于Dim
  • 强制声明:Option Explicit语句强制显式声明所有变量

如果没有声明option explicit,vbs在使用变量前不一定声明变量,可直接使用。但这样容易带来一些潜在的问题,不建议这样使用。

使用建议:无脑在脚本开头写上option explicit即可

5、变量赋值

一个语句中可以同时声明多个变量,也可以同时赋值多个变量。但不可以声明变量的同时赋值

option explicit
dim var1,var2 '多个变量声明用逗号隔开
var1=1:var2=2 '多个变量赋值用冒号隔开
'dim var3=3    '声明的同时赋值是错误的

使用建议:如果觉得难记,没必要合着写,就拆开一个一个声明,一个一个赋值

6、字符串的表示方式

字符串必须使用双引号包围,不可使用单引号。而且vbs中单引号不能表示单个字符

7、数据拼接

使用’&’可拼接任意类型的数据,有一点值得注意,如果&两端都是数字常量,则不能连续使用,必须存在空格,如: 111 & 777 ;此时才能完成连接,若为111&777会报错。

使用’+’号一样可以起到和’&’类似的效果,区别是:

  • 数字 + 数字:表示运算
  • 数字 & 数字:表示拼接,且数字和&之间必须有空格
  • 数字 + 字符串数字 :表示运算
  • 数字 & 字符串数字:表示拼接,且数字和&之间必须有空格
  • 数字和非纯数字字符串拼接时,只能使用 &
  • 非纯数字字符串+非纯数字字符串:表示拼接
Option Explicit 
dim Name,age
name=1:age=0
age=age+1
msgbox name & age & "abc" 
'输出11abc

8、数据计算

Option Explicit 
dim Name,age
name="1":age="1"
age=age+1+"2"+name '对字符串类型会自动转换成数字类型进行计算,如果转换失败则会报错,如包含非数字符号
msgbox name & age  '这里两个数字使用&拼接
'输出15

9、变量作用域

① 脚本级作用域(声明在最外层的)

变量在整个脚本文件中都是有效的。声明的变量的作用域就是整个脚本。

② 过程级作用域(声明在过程里的)

变量在过程或函数中有效。过程、函数之外的其它代码都不能访问过程级变量。

③ 类级作用域(声明在类里的)

这是一种包含属性和方法的逻辑分组的特殊结构。类定义之外的代码都不能访问类级变量。

有三个关键字可以用于声明变量:Dim、Private、Public

1.对于脚本级变量,不论是哪种类型的声明,作用域都为整个脚本文件

2.dim可用于声明脚本、过程、类级作用域的变量,过程变量必须使用dim,对于类变量,表示局部变量,类级变量dim效果与public相同

3.private可用于声明脚本、类级作用域的变量,对于类级变量,则表示声明了一个私有变量

4.public,与private相对,表示类的公有变量

使用建议:一般你也不会在vbs脚本里写多少功能,多半就是个启动时候一些文件检查之类的,无脑dim即可。

10、数组

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 arr(3) 'redim 增加一个preserve关键字后可重新定义数组长度的同时保持数值不变,变长则多出来的部分默认为空,变短则截断,即使后面再变长回去数据也不在了
arr(0)="aa" '数组下标从0开始
arr(1)="hh"
msgbox arr(0)'输出数组第一位

这里说明一下msgbox,这个就是让系统弹出一个提示框,提示框的内容就是msgbox的第一个参数。

数组补充说明(不同于其他语言的数组的部分)

如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

11、if条件判断

if … then … end if

option explicit
dim a
dim b
a=1
b=2
if a>b then
msgbox "a>b"
end if

if … then … else … end if

option explicit
dim a
dim b
a=1
b=2
if a>b then
msgbox "a>b"
else
msgbox "a<b"
end if

if … then … elseif … then … end if

option explicit
dim a
dim b
a=1
b=1
if a>b then
msgbox "a>b"
elseif a=b then
msgbox "a=b"
end if

12、select语句

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

13、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等条件判断语句连用,直接放在循环体执行一次就退出了。

14、while…wend循环

option explicit
dim a
a=1
while a<10
	a=a+1
wend
msgbox a

提示:while … wend是不能中途退出的

15、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结束循环,则不会

使用建议:该循环比较适合用在定义一个下标变量去遍历数组

16、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退出

17、算术运算符

加减乘都和其他语言一样使用,只列举比较特殊的

1.取余:10 mod 5 ;该表达式表示取10/5的余

2.除法:/表示浮点数除法,\表示取整除法

3.指数:2^3;2的三次方

18、逻辑运算符

1.相等:=

2.不等:<>

3.大于:>

4.小于:<

比较时的一些细节:当数字比数字时,就正常比较;数字比字符数字时,字符数字会被转换成数字比较;字符串比字符串,按ASCII的值,从第一位依次比较

5.非:not

6.与:and

7.或:or

8.异或:xor

19、sub过程

由sub…end sub 进行定义。如果 Sub 过程无任何参数,则 Sub 语句必须包含空括号 ()

不带参数的sub,定义时如果没有参数,可以不加

不带参数的过程

Sub GetName()
    MsgBox "我是Sirrah" '输出字符串
End Sub

带参数的过程

Sub GetName(name)
    MsgBox name '输出字符串
End Sub

提示

sub的定义可以在脚本文件的任意位置

sub过程是不可以有返回值的

使用建议:在定义过程的时候,不管有没有参数,统一都加上括号

20、function函数

由function…end function进行定义。如果 function过程无任何参数,则 function语句必须包含空括号 (),定义时如果没有参数,可以不加。

不带参数的函数

Function GetName()
    MsgBox "我是Sirrah" '输出字符串
End Function

带参数的函数

Function GetName(name)
    MsgBox name '输出字符串
End Function

function的定义可以才脚本文件的任意位置

function过程是可以有返回值的,返回值的写法为:函数名=值;和其他语言的return不同

Function GetName(name)
    GetName=123 '返回值
End Function

使用建议:在定义函数的时候,不管有没有参数,统一都加上括号

21、调用函数和过程

call:如果无参数,可以不加括号;如果有参数,则必须加括号

Call GetName() '调用Function
Call GetName() '调用Sub过程

直接调用:如果没有或只有一个参数,可以加括号也可以不加。如果有两个以上,不可以加括号

GetName '直接调用

获取返回值:如果不存在参数,可加括号也可以不加,如果存在在参数,必须加括号;不能使用call来获得返回值

使用建议:使用call加括号;直接调用不加括号,需要获取返回值加括号

22、类

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、当一个对象不被引用时,会自动释放

23、文件系统对象FSO(FileSystemObject)

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为在末尾写,第三个参数表示不存在时是否创建,第四个为编码格式,这里不做赘述,到时候直接查

24、使用控制台运行jar包

dim ws
set ws = createobject("Wscript.Shell")
ws.run "cmd /k java -jar .\youApp.jar"

总结:

至此,VBS的一些简单的语法入门就已经介绍完了。感谢各位的阅读!

转载于知乎@AsteroidTail

原文链接:http://www.ae08.com/2022/07/02/vbs-%e5%9f%ba%e7%a1%80%e8%af%ad%e6%b3%95%e6%95%b4%e7%90%86/,转载请注明出处。
0

评论0

请先
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录