VBS 基础知识

配置环境

使用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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值