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

请先
请拖动滑块到最右边
没有账号?注册  忘记密码?

社交账号快速登录