跟我从头学WSH [转]

前言

呵呵!

这篇是我刚刚完成教案的翻版,为什么要写这篇东西呢?是因为当初参加ESS培训的时候,发现更深入的应用SMS,需要WMI的知识,然后想看看 WMI,却发现要深入理解WMI,又事先要有点WSH脚本的经验,于是就转而看WSH,花了春节及以后的几天,写出了教案。于是,找盆盆的地盘,将东西贴出来,起名叫《跟我从头学WSH》,因为我就是从头开始学的。肯定要被各位大侠笑话了,大家就全当鼓励我吧。

现在,我正全力转向写WMI的教案,完成后,将全篇贴出。

第一章 介绍WSH

一,介绍WSH
(1)首先, WSH不是一个文件,它是一个运行脚本的集合 Script file 能够运行在WSH环境中,WSH支持所有的32位操作系统 。
WSH包含几个组件,这几个组件协同工作,提供操作系统运行脚本的能力
主机:
主机就是运行脚本的计算机,在WSH之前,IIS和IE是唯一能够运行脚本的,这样就被限制在web页里,使用csript.exe和wscript,你可以在web环境之外运行脚本。这些主机接受脚本并且判断什么样的脚本引擎你需要使用,并且执行脚本。
脚本引擎
WSH支持两种脚本语言,VB scripting和Jscript
当脚本主机判定了语言所需要的脚本,就加载对应的脚本引擎。并且执行脚本
对象模块
脚本程序通常使用对象扩展标志。Objects represent packaged的功能使得你可以重用你的脚本。它提供了一个黑盒重用的概念(无需理解复杂代码是如何实现的)。你可以在你的脚本使用objects执行很多任务。
相关的对象被定义在结构中,被称为对象模块。对象模块被定义包含在dynamic link libraries或ActiveX control中。
当你安装了WSH,你就装了主机,两个native script引擎和两个object model, Windows script host和script run-time object.

(2)WSH的优点
WSH是一种非交互的脚本,不如象batch,longon和管理脚本等
在一些额外的处理上,WSH可以和用户有一定的交互u,比如输入合适的参数和信息等
小内存需求
执行WSH脚本花费的内存很少
语言独立(无关)
虽然WSH天生支持VB script和Jscript语言,你可以扩展环境,使得它支持更多的语言,比如perlscript
脚本重用
使用WSH,你可以将你的脚本保存成操作系统文件,可以简单的采用notepad进行编写和保存,在保存后可以运行很多次。
命令行
在WSH,只有一个内置的命令语言工具:cmd。exe
使用bat文件可以包含多行命令,它仍旧是极其有用的管理工具。

(3) 脚本文件类型 :包括以下的扩展名类型
Vsb 和 vbe vbscrip 的脚本文件
Js和jse jscript
.wsh 脚本控制文件,控制脚本的执行 (类似于快捷方式或pif文件,指向你要执行的文件,也可以设置环境设置)
Wsf:使用xml书写的windows script
Wsc script component file:同样是xml实现

二。运行脚本

(1) WSCript运行脚本

*从windows 运行脚本

•双击,默认将使用wscript.exe运行脚本
•使用run command
•将脚本文件拖拽到wscript.exe文件上运行
•创建wsh文件

*Wscript.exe是默认主机

(2)使用CSCRIPT运行脚本
使用cscript.exe运行脚本
Cscript.exe是wscript.exe的命令行版本
在run中的语法:
CScript [host options...][script name][options and parameters]

(3)脚本语言引擎
脚本语言引擎
选择脚本语言
Vbscript
没有编程经验,或对vb熟悉
Microsoft jscript
熟悉c visual c++ java

三。使用脚本

(1)书写脚本
书写脚本
WSH 2.0
WSH 2.0 ships with the following versions of Windows:
Windows Millenium Edition (Me)
Windows 2000 Professional
Windows 2000 Server
Windows 2000 Advanced Server
Windows 2000 Datacenter Server
WSH 1.0
WSH version 1.0 is integrated into Windows 98. Both Windows 95 and
Windows NT version 4.0
开发工具
•Notepad
•第三方开发工具
•Microsoft visual inter dev和visual basic for application
相关文档
最好安装 visual basic scripting edition和windows host online reference documentation
You can install the WSH documentation by downloading and running
Wshdoc.exe from:
http://msdn.microsoft.com/scripting/windowshost/wshdoc.exe
You can install the VBScript documentation and samples by downloading and
running Vbsdoc.exe from:
http://msdn.microsoft.com/scripting/%20/download/vbsdoc.exe

(2)编辑脚本
脚本错误
•语法错误
•Run-time errors
•比如打开一个不存在的文件等
•逻辑错误
•比如输入的密码错误,但脚本还是运行了不该处理的进程等
微软脚本debugger
帮助你发现问题和错误
•安装微软脚本debug
•可以使用add/remove program来安装script debuger. Manner: systemroot\Help\debug\Sdbug.htm
•可以直接运行,设置断点等等

(3)排错
排错
Wscript.echo方法:
Wscript.echo “ this is aa message” 弹出一个message窗框,按OK后继续运行以后的代码,如果是cscript,则在命令行中显示,不需要用户的参与直接运行后面的代码。
The debugger launches with out loaded script
如果debugger launches 没有被一个脚本调用,通常是运行时有语法错误。错误代码将高亮显示。
Visual Studio installation
如果安装了visual studio version 6.0,那么visual studio将代替掉microsoft script debuger.
如果这不是你的需要的,可以有两种方法:
• Remove and reinstall the debugger.
• Modify the registry entry for the default debugger directly.
The registry key for the default debugger is:
HKEY_CLASSES_ROOT\CLSID\
{834128A2-51F4-11D0-8F20-00805F2CD064}\LocalServer32
For the script debugger, this entry should contain C:\Program
Files\Microsoft Script Debugger\msscrdbg.exe. For Visual InterDev, it
should contain C:\Program Files\Microsoft Script Debugger\mdm.exe.

(4)对比vbscript和visual basic
•Visual basic scripting edition是一种解释执行的语句,并不编译执行。
•语法不同
•没有sub()和function()
•Vbscript 只有一种数据类型叫variant,不能申明额外的数据类型
•不能使用debug.print,取而代之的是wscript.echo
•不能直接访问type library references
•如果要使用某个变量,比须在前面先申明

第二章 使用Object

一. Object术语


(1) 理解对象术语
Objects
object是根据功能打包, object包含代码,使得你可以将其用在自己的脚本中。
Compiled objects
最常用的object类型,是compiled object,这种类型的object编译成2进制文件,无需了解内部机制,可以把它看成是一个黑盒子。通常的表现形态为一个DLL(dynamic link library)或者ocx(Microsoft ActiveX Control file)
你能够用method和object提供的功能进行通讯。可以用用object的properties操纵数据。
每一个对象有众所周知的method和properties

(2)方法和属性
Methods
Object实用methods展示自己的功能,你无需知道方法在内部是如何实现的,只需要知道如何调用它,术语Invoke被经常用来描述调用方法的过程。
•Invoking a method
有三种方法可以调用:
Objecct.method 没有采用任何的参数
Object.Method Param1 [, Param2, … ,Paramn] 传入一个或数个参数进object
MyVariable = Object.Method([Param1, Param2, … ,Paramn]) 返回一个值。是Oebecjt运行的结果。
•Using parentheses
Methods返回数据给调用的脚本,在这种情况下,必须在括号中提供参数,即使有些methods不需要参数,仍旧需要括号
MyVariable = Object.Method()
Properties
Object采用他们的properties来展露他们的数据到你的脚本中,通常采用以下的语法:
Object.Property = Value
•一个简单的值
•一个简单的表达式
•另一个对象的属性 Object1.Property1 = Object2.Property2
•一个对象的方法的调用 Object1.Property1 = Object2.Method([Param1])
可以将一个属性返回给一个值
MyVariable = Object.Property

(3)理解实例术语
Class
类是对象的蓝本。开发者允许你重用代码,而不需要在object中重写。当你需要重用代码,你的脚本在类的基础上创建对象。对象的代码被写在类中,这些类为你的对象提供了方法和属性。
一个类-建筑师的规划和建设
一个在现实世界里类似的情况是,将其映射到一个建筑师的情况下,建筑师首先构想一个建筑的外观和如何建筑结构,为传达他对于该建筑的思想,创建一个建筑规划图和蓝本,在其中指名材料和尺寸。
在这点上,他的工作完成了,他可以将蓝图给建筑师,建筑师将根据规划构建建筑,事实上,建筑师可以构建很多类似的建筑,全部基于相同的图纸,他们可以重用蓝图很多次。当建筑完成构架后,所有者可以决定涂什么颜色,他也可以决定安转警报,家具等。
在这个模拟中,建筑师的蓝图可以类比为class, object可以类比为由蓝图创造的建筑。蓝图规定可以安装警报和家具,这可以类比为methods.
此外,蓝图没有制定装饰时候的颜色,蓝图允许在建筑物构建后指定颜色,涂刷的颜色就是属性。
Type Libraries
是类的集合,可以基于其类重构object,type libraries是被编译的文件,提交它们的类给你的脚本。通常它们被编译到dynamic link libraries(DLL)或者AcitiveX Controls文件。
Instantitation
从class创建Object的术语称为instantiation,当一个对象被实例化的时候,它继承了这个类的定义的属性和方法。
经常要采用同一个class生成多个instances,类似于采用同一张图纸创建多个房子,给每个房子标注上编号,这样即使他们从一个图纸上构建而来,也不会相互影响。

二. 创建和使用Object

(1)创建Object
创建object
Libraries
WSH library 被Wshom.ocx文件所描述,并且默认安装在windows 2000的计算机上。
这个library在脚本中被访问的名字是:wscript
Class
Wscript library包含多个classes,比如network object,允许你采用脚本执行简单的网络任务。这个对象采用以下的语法继承:
Set <Object Variable> = CreateObject("<Library>.<Class>")
An example of how to create the Network object is as follows:
Set oNetwork = CreateObject("WScript.Network")
上面的语法中,采用了createobject()函数,它接受一个字符串作为参数,然后你可以使用这个新建的object了。
当对象被实例化后,你可以采用该对象执行网络任务,比如映射一个磁盘和打印机
MapNetworkDrive and AddPrinterConnection.
Set oNetwork = CreateObject("WScript.Network")
oNetwork.MapNetworkDrive "Z:", "\\MyServer\MyShare"
Wscript.Echo oNetwork.ComputerName

(2)使用对象
Assigning an object to a variable
使用关键词set来指定一个object, 这个set key通知脚本,“名称点”采用object variable, 指向该对象代码并存储数据在内存中。
使用一个object
objFSO.CreateFolder ("C:\Test")
删除一个object
Object消耗内存,所以,一个好的习惯是当你使用完毕后就删除它们。
Set objFSO = Nothing

三。 理解对象模型

(1)定义对象模型
定义object models
描述对象模型
对象模型是一个对象的集合,被设计来执行相关的一组任务,比如管理文件系统或从数据库中读取信息,对象类,方法和属性被集合在一起,表现为对象模型
在很多状况下,在对象模型中的对象被组织在结构中,在高层或顶层,对象提供对更深入的对象的访问,比如filesystemobject object 提供访问磁盘对象,不能在不使用filesystemobject的情况下使用磁盘对象。
很多对象要求你采用层次结构,通过一个对象来访问另一个对象,更现代化的实现可以直接访问对象,比如,ActiveX data object模型可以直接访问。它们并不被组织在结构中。
对象模型举例
WSH
执行简单管理任务
ADSI
能够访问和设置活动目录功能
Active data object
可以访问数据库sql server

(2)COM Object
Component Object Model(COM) 提供一个说明和规则的集合,定义了软件如何从重用组件被构造。
COM允许一个contract被定义和指名组件提供给客户的服务。
COM也支配数据如何在客户和对象之间传输,这个进入和传出的过程,称之为data marshalling
Contracts
Contract集合object支持的方法和属性。
DCOM
扩展了COM的marshalling,使其可以支持访问网络环境

(3)在实践中的COM
Class 被programmatic Identifier定义所标示,称为ProgID
Object Identification
ProgID被存放在HKEY_CLASSES_ROOT,它告诉系统哪个.dl, .exe 或.ocx文件包含着相关联的类定义,被用于构建对象。一个ProgID由library类型和类组成,由.分隔。
Library.Class
下面的例子使用Scripting.FileSystemObject ProgID来创建一个对象实例
Set MyObject = CreateObject("Scripting.FileSystemObject")
Automation
Automation定义了在开发COM object的时候,数据类型的限制和其他限制。
Type Libraries
虽然标准的library存储在.dll或者ocx文件中,它也能存储在独立的library file中,通常采用tlb扩展名。通过分析在type library中的元数据,可以发现在能够在脚本中使用的object,methods和properties。
object browser可以使用这信息来描述一个对象的图形化的视图。

(4)使用一个对象浏览器
Microsoft Object Browser is a tool使得你可以看到type library的内部,它将信息显示为可读,图形化的表格里。
这个功能存在在office的VBA中。


四。 脚本对象

(1)脚本对象模型
Filesystemobject:使用filesystemobject object来管理本地的文件和文件夹。除此之外,可以控制存在的文件夹和文件。
你只能使用filesystemobject创建新的文本文件,如果你想创建新的word document,你必须采用word object model
Filesystemobject object 同样不支持管理ntfs文件系统权限,如果你要改变文件的安全权限,必须采用额外的组件。
Dictionary
Dictionary object是一个容器对象,你可以使用它存储任意数据项目,你可以组织这些项目使用名称或独立的关键值,你可以使用这些值重用存储的数据
举例来说,你可以使用dictionary object来存储企业的所有管理员,细节可以包括名称,电话,和email地址。你可以连接(组织)每个dictionary entry采用独立唯一的管理员负责管理的站点。
Set AdminsList = Wscript.CreateObject("Scripting.Dictionary")
AdminsList.Add "UK", "Alan : +44 (0)117 555-0100"
AdminsList.Add "Europe", "Kathie : +33 (0)122 555-0105"
AdminsList.Add "US", "Don : +1 (0)25 555-0115"
WScript.Echo "The UK administrator is: " & AdminsList("UK")
Encoder
脚本被encoder object编码,encoding process由windows encoder utility来完成。 使得脚本不可见,不可拷贝,不可编辑,但还是能够执行。

(2)WSH对象模型
WSH object model
Type library Wshom.ocx为WSH提供object model. 这个object 提供一些对象,方法和属性,这些对象、方法和属性是脚本中最常用的。
Wscript
Wscrip对象是一个内在的对象,意思是当脚本执行的时候自动创建,而不需要明确的实例化.
支持一下的方法:
Createobject: 创建一个对象
Connectobject: 连接一个已存在的对象
Disconnectobject: 对已连接对象断开连接
Getobject : 从文件里重新调用(retrieval)一个已存在对象。
Echo: 显示信息
Quit: 终结当前的脚本
Sleep: 暂停执行脚本多少毫秒
Shell
Set objShell = WScript.CreateObject("WScript.Shell")
可以使用这个脚本开始一个新的进程,创建一个快捷方式,提供环境变量,比如:windir,computername,username等。
Specialfolders: 返回window shell folder,比如desktop folder,start menu folder ,my document folder等
Shortcut: 创建一个和快捷方式关联的对象
Urlshortcut: 创建一个和url关联的对象的快捷方式
Environment: 返回操作系统的环境变量
Network
Set objNetwork = WScript.CreateObject( "WScript.Network" )
为脚本提供网络功能
List all mapped drives.
Connect and disconnect remote drives.
List all mapped printers.
Connect and disconnect remote printers.
Set the default printer.

五。常见对象模型

(1)写作数据对象
CDO对象被设计来简单的使用脚本来具有电子邮件的功能。CDO libraries 来“暴露”messaging 对象,比如folders,messages,收件人地址,附件等。
CDO name :
先前的版本叫OLE messaging,在exchange 4中首先被支持
Cdo version 1被叫做active messaging,被安装在exchange 5.0中
Cdo version 1.2安装在exchange 5.5种,包含支持scheduling meeting 和appointments
286430 : 如何使用cdo for windows 2000和本地拾取目录发送html格式邮件
286431: 如何使用cdo for wondows 2000和远程smtp服务发送html格式邮件

(2)ActiveX对象模型
ADO能够快速有效的访问和操作数据源中的数据
数据源:
数据源往往和数据库有关,比如sql serve 2000,另外,ABO使你可以访问非关系数据库,比如AD,你可以使用ADO搜索活动目录对象和属性。
Examples of data providers
要访问存储在不同格式中的数据,ADO为每一个数据类型需要一个OLE database(DB) provider。
当前的ADO OLE DB提供include:
ODBC
Index server
Sql server
Active directory directory service
Exchange 2000
ADO模型包含下列对象
Connection: 负责联系一个OLE DB数据库源(比如ADSI)
Command: 对数据库执行的命令
Error: 包含数据访问错误细节,每一次错误发生的时候刷新
RecordSet: 执行命令后返回的记录集
Fields: 记录集的一块区域

(3)ADSI
Active Directory Service Interface,之前被称作OLE Directory Service.
给与开发者和管理员访问多种数据库服务的接口的能力。
LDAP
Windows NT
NDS:使得你可以访问Novell Directory Service
NetWare 3 bindery: 可以访问早期的Novell 3。X的服务器

(4)WMI
WMI 是一个单一的,一致的应用程序编程接口,被设计来为Windows 2000服务器家族进行管理(操作系统和数据)
Web-Based Enterprise Management
WBEM是一种工业标准的管理API
WMI
WMI是WBEM的微软实现
•监视,设置和控制管理信息
•Windows 操作系统
•系统设备
•活动目录
•注册表
•性能计数器
•在管理对象上执行方法,比如,压缩一个文件或重起系统
•接受并执行一个基于事件改变,比如SNMP和Windows event view service

(5)IE
IE
是脚本主机
不能访问WSH
IIS
支持ASP

一.VBScript基本规则
Vbscript的基本规则
•大小写不敏感:
WSCRIPT.ECHO
WScript.echo
wscript.echo
虽然对大小写不敏感,但是不应该使用全大写或全小写,这样使得脚本难于阅读
•跳过所有多余的空格
For example:
WScript. Echo "Hello"
is the same as:
WScript.Echo "Hello"
•不规定每行的最大长度
换言之,你可以将多个逻辑行用colon divider连接在一起
WScript.Echo "Test One" : WScript.Echo "Test Two"
•Vbscrip 允许你分割一个长句,可以用一个空格和一个下划线来隔断,这样使得阅读更加容易一点。
WScript.Echo "Message to" _
& vUserName _
& " Please make sure that you remember" _
& " to logoff or lock your workstation" _
& " if you leave it unattended, Thanks"
•名称不能超过255个字符,包括项目定义,变量,constants和procedures

二。 变量,常量和数据类型
(1)变量
变量
•可变化值的容器
nMyAge = nMyAge + 10
WScript.Echo nMyAge
•String Data
strServer = "MyServer"
•Date and time
•时间和日期变量的值要用”#”扩起来
•名称限制
•以字母开头
•不能有间隔
•便不能超过255个字符
•在当前的域中必须唯一
•申明变量
•默认情况下,脚本为第一次读到的变量创建一个值,但这样就会导致出现问题后难于跟踪:
nMyAge = 35
nMyAge = nMiAge + 10  (这里的nMyAge被打成了nMiAge,最后的值变成了10)
WScript.Echo nMyAge
Option Explicit
这样所有的变量使用前需要先申明
你可以使用下面的语句来声明变量:
Dim
Private
Public
Static
你可以用dim来声明变量,使得系统为变量保存一定的内存
Dim nMyAge
Dim nMyAge, nMyName, nMyAddress

(2)常量
就像声明变量,你可以在脚本中声明和使用constants
•在脚本执行的过程中不改变值
•使得脚本更加容易阅读和debug
•在脚本的开始的地方assigned
•Const语句
Constant 可以表示一个字符串,一个数字或算法、比较和逻辑操作符
Const COMP_NAME = "Microsoft“
注意,如果你尝试在脚本中改变常量的值得话,会导致下列错误:
Microsoft VBScript compilation error: Name redefined
Type Library constants
许多类libraries描述的对象模型包含constant values,它能够合法的作为方法参数传递。
比如,在ADSI object model,很多常量被暴露,用于帮助创建新的objects,比如活动目录中的用户和组。
当一个新的组创建,ADSI采用一个creation flag确定组的类型,如果flag的值是2,ADSI知道创建的是Global group,其他的常量值和其他的组类型相称。为了使得阅读容易,这个ADSI type library 使用有意义的名字来expose(暴露)这些常量值,比如:
ADS_GROUP_TYPE_GLOBAL_GROUP
如果要在一个标准的vbscript脚本中使用,常量的值必须在脚本的开头明确说明
CONST ADS_GROUP_TYPE_GLOBAL_GROUP = &H2
&H2代表16进制的2
Intrinsic constants
有一些有用的constants被内置在VBS edition中,,这些constants,提供了一种方便的途径来使用特定的值,而不必记住特定的值。因为那些constants已经被定义在vbscript,不需要明确的声明他们,你可以简单使用他们代表的值
vbCrLf
sMessage = "Welcome to the world of VBScript" & vbcrlf & _
"and all the useful commands that it provides" & _
vbcrlf & "Please press the OK button to continue"
MsgBox sMessage

(3)数据类型
数据类型:
Variants
一个variant可以包括数字,日期和时间,对象,布尔值或字符串,在很多情况下,VBScript会自动检测数据类型。
vDemoA = "My"
vDemoB = "Server"
vAnswer = vDemoA + vDemoB
WScript.Echo vAnswer
VDemoA = 5
vDemoB = 10
vAnswer = vDemoA + vDemoB
WScript.Echo vAnswer
Variant Subtypes
可以将variant数据类型分为子类型
Empty 变量没有初始化
Null 变量没有初始化
Byte: 0-255
Integer:-32768-32767
Long: –2,147,483,648 and 2,147,483,647.
转换函数:
有些时候,你需要将一种数据类型转换成另一种数据类型。(比如你要提取某个数据的第几位数据,你需要用ctsr将其转换成字符,然后用len,left,right等函数提取数据,然后将Cint将其转换成数字)。
CInt Returns a Variant of subtype Integer
CBool Returns a Variant of subtype Boolean
CByte Returns a Variant of subtype Byte
CCur Returns a Variant of subtype Currency
CDate Returns a Variant of subtype Date
CDbl Returns a Variant of subtype Double
CLng Returns a Variant of subtype Long
CSng Returns a Variant of subtype Single
CStr Returns a Variant of subtype String

(4) 命名约定
•并不需要,但最好有良好的命名习惯
•一些命名的约定的建议规则
•采用前缀:
str String
Fn Function
C (or capitalize each letter in the constant name) Constant(常量)
B Boolean (True or False)
d Date
obj An object reference
n A numeric value
函数,方法名在每一个多名字开头的地方用大写字母。比如:
WScript.Echo objMyServer.Name
Sub CheckDateSub()
早期的vbscript没有const命令,所以常量就被定义为变量,并且命名的时候全部采用大写字母:
COMPANY_NAME
DEFAULT_PATH
命名一致性:
你可以不采用匈牙利命名规范,可以自己定义命名规定,但必须贯彻在所有的脚本中,这将帮助排错和阅读。

(5)数组
一个变量可以有多个值
下面的定义的数组可以包含三个离散的值:
Dim MyArray(2)
给数组赋予值
MyArray(0) = 100
输出数组的值:
WScript.Echo MyArray(1)
多维数组:
Dim MyTable(4, 9)
5行10列的一个表格
注意,在vbscrip中你顶多定义60个维度。但注意,出于容易理解和阅读,不应该超过4到5个维度。
数组可以包含不同的数据类型,这经常用在存储相关联的同样对象上。(比如第一个值可以上用户姓名,其他的列为电话等等)。

(6)动态数组
不知道边界或维度的时候,需要动态数组
申明一个数组,但是省略掉边界
Dim MyArray()
初始化这个数组的尺寸:
ReDim MyArray(4)
非常重要的是:redim语句删除在数组中的值。
采用Preserver关键词,则数组中原来的值保持不变。
(注意,如果你resizing从大到小,你就不可避免的要丢失一些数据,不管你用不用preserver关键词)
动态数组也可以使用array语句来实现:
Dim MyArray
MyArray = Array(100, 200, 300, 400, 500)
删除数组:
Erase MyArray
这将删除数组的内容,但数组本身还在,当使用这个命令的时候,数据被删除,动态数组被“非初始化”,如果要使用这个数组,需要redim语句进行重定义。
Ubound函数
在采用动态数组的时候,你经常不知道数组包含了多少元素,可以采用UBound函数来解决这个问题:
UBound(arrayname[, dimension])
Dimension是维数,如果只有一维,则可以省略。

三。操作符

(1)操作符
操作符:
主要的操作符:
算法:
^ 求幂
- 负数
\ 整数除,返回整数值
连操作符:将多个字符串连接成一个 字符串
WScript.Echo "The path is, " & strPath & " on Server B"

nAge = InputBox("Please enter your Age.")
nTogo = 65 - nAge
MsgBox "You have " & nTogo & " years until you retire!"
比较符:返回的是真或假
IS 等价
result = value1 operator value2
逻辑操作符:
bNegResult = Not bResult
If the value of bResult is True, the value of bNegResult is set to False.
EQV 等值
IMP 牵连
操作优先级 (多用括号)
^

*, /, and \
MOD
+, -
&
=, <>, < >, <=, >=, and IS
NOT
AND
OR
XOR
EQV
IMP

四。条件和循环

(1)条件语句
条件语句
If then
If MyVar = 5 Then WScript.Echo "MyVar = 5"
Else
If MyVar = 5 Then
WScript.Echo "MyVar = 5"
Else
WScript.Echo "MyVar does not equal 5"
End If
Elseif
If MyVar = 0 Then
WScript.Echo "MyVar = 0"
ElseIf MyVar = 1 Then
WScript.Echo "MyVar = 1"
ElseIf MyVar = 2 then
WScript.Echo "MyVar = 2"
Else
WScript.Echo "Sorry value is out of range"
End If
End if
用在执行多个语句的情况下:
If MyVar = 5 Then
WScript.Echo "MyVar = 5"
WScript.Echo "Reseting MyVar"
MyVar = 0
End If

(2)select case语句
条件语句:select case
Select Case MyVar
Case "0"
WScript.Echo "MyVar = 0"
Case "1"
WScript.Echo "MyVar = 1"
Case "2"
WScript.Echo "MyVar = 2"
Case Else
WScript.Echo "Sorry value is out of range"
End Select

(3) for-next
For iCounter = 1 To 10
WScript.Echo "This is loop number " & iCounter
Next
For iCounter = 1 to 10 Step 2
WScript.Echo "Odd number " & iCounter
Next

For iCounter = 10 to 2 Step -2
action(s)
Next
Exit for
vInput = InputBox ("Enter the Value to stop the loop at")
iStop = CInt(vInput)
For iCounter = 1 to 10
WScript.Echo "Current iCounter Value = " & iCounter
If iStop = iCounter Then Exit For
WScript.Echo "Around we go again"
Next
WScript.Echo "Loop exited at value of " & iCounter
For each…next
用于不知道数组中有多少元素的情况
For Each File in objFiles
WScript.echo File.Name
Next

(4)do - loop /while - wend

当不知道要循环几次时,通常采用这种方法
Do While…Loop
Do While vMyVar < 100
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop
Do Until...Loop
Do Until vMyVar >= 100
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop
Do…Loop While (将检查点放置在循环语句的后面)
Do
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop While vMyVar < 100
注意,在检查这个条件的时候,即使条件不符合,也已经执行了一次操作。
Do…Loop Until
Do
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Loop Until vMyVar >= 100
Exit Do
就像Exit for一样,在中途退出,可以用Exit do
vInput = InputBox ("Enter the Value to stop the loop at")
iStop = CInt(vInput)
Do While iCounter < 10
iCounter = iCounter + 1
WScript.Echo "Current iCounter Value = " & iCounter
If iStop = iCounter Then Exit Do
WScript.Echo "Around we go again"
Loop
WScript.Echo "Loop exited at value of " & iCounter
While…Wend
是早期的vbscript的语法之一,现在也兼容
While vMyVar < 100
vMyVar = vMyVar + 1
WScript.Echo "vMyVar = " & vMyVar
Wend
通常情况下,用do…loop比while … wend好,因为有更好的兼容性和结构性。

五。内置函数

内置函数
日期和时间函数
Now
WScript.Echo Now
This function returns a value like 26/06/2000 15:23:41
其格式由你设置的国家设置决定
Time
WScript.echo Time
This function returns a value such as 15:24:27
Data
WScript.Echo "Today’s Date is : " & Date
This function returns a value such as 26/06/2000
DateDiff
返回两个日前之间的天数
vDate = DateDiff("d", Date, "01/01/3000")
WScript.Echo "Days until the next Millennium: " & vDate
“yyyy” 两年之间的年数
“m” 两个日前间的月数
“h” 两个日期间的小时数
字符操作函数
LCase (小写)
UCase (大写)
vName = InputBox("Please enter your home country?")
vName = LCase(vName)
Select Case vName
Case "uk"
WScript.Echo "Welcome to the UK!"
Case "usa"
WScript.Echo "Welcome to the States!"
Case "germany"
WScript.Echo "Welcome to Germany!"
Case "france"
WScript.Echo "Welcome to France!"
Case Else
WScript.Echo "Sorry, try again! "
End Select
数学函数
Rnd
返回0-1之间的7位小数
要初始化随机数,用randomize语句
Randomize
WScript.Echo Rnd
Randomize
WScript.Echo Rnd * 100
这样产生0-100之间的数值
Round
将数据转化成最近的整数
Randomize
vRnd = Rnd * 100
WScript.Echo Round(vRnd

六。过程

(1)子程序和函数
Sub和函数过程
在visual basic scripting edition中,有两种procedures:子程序和函数
Sub procedure
优点,代码重用
Dim sStausMessage
Call Welcome
sStausMessage = "Starting..."
Call Status
sStausMessage = "Ending..."
Call Status
Call Farewell
Sub Welcome()
WScript.Echo "Hello"
End Sub
Sub Status()
WScript.Echo sStausMessage
End Sub
Sub Farewell()
WScript.Echo "Goodbye"
End Sub
注意,call语句是可选的
Function procedures
和sub很相似,function通常返回一个值
Dim dDate
dDate=Tomorrow
WScript.Echo dDate
Function Tomorrow()
Tomorrow= DateAdd("d",1,Date())
End Function
Exiting a procedure
如果通过if then语句结构,决定要离开procedure,可以通过exit语句来退出。当到达end sub语句的时候,就回到调用的时间点。
传递参数
在子程序的括号中,以逗号分隔。
Function GrossValue(NetValue, TaxRate)
GrossValue=NetValue + (NetValue * TaxRate)
End Function
WScript.Echo "Gross Value is: " & GrossValue(100,0.175)
Byref: 如果你在子程序中改变了参数的值,初始的值也随之改变
Function GrossValue(ByRef NetValue, ByRef TaxRate)
GrossValue=NetValue + (NetValue * TaxRate)
End Function
Byval: 不改变初始的值
Function GrossValue(ByVal NetValue, ByVal TaxRate)
GrossValue=NetValue + (NetValue * TaxRate)
End Function
举例:
Dim iNumber, iResult
iNumber=30
iResult = Doubler(iNumber)
WScript.Echo "Two times " & iNumber & " is " & iResult
Function Doubler(ByRef InputNum)
InputNum = 2 * InputNum
Doubler = InputNum
End Function
结果:“Two times 60 is 60,”
Dim iNumber, iResult
iNumber=30
iResult = Doubler(iNumber)
WScript.Echo "Two times " & iNumber & " is " & iResult
Function Doubler(ByVal InputNum)
InputNum = 2 * InputNum
Doubler = InputNum
End Function
“Two times 30 is 60,”

(2)范围和生命周期
作用域和生存时间
Script-level变量
如果一个变量被在main body中被申明,变量可以在main body或任何procedures中,被称为script-level变量,有secrip-level作用域
可以用dim关键词或private关键词,这两个关键词是同义的关键词。用来定义script-level变量
Public关键词可以定义跨脚本的变量,你只能在一个脚本使用另一个脚本的时候使用,比如.wsf文件。
Script-level变量在整个脚本中必须唯一。
Procedure-level 变量
当一个变量在procedure中被申明,只有在procedure中可以访问或改变变量的值。被称为procedure-level变量。
Procedure-level变量只存在于procedure运行的时候,当procedure结束,这个变量将被删除。
可以有不同的procedure中有相同的变量名称
在procedure-level变量中,只能使用dim来申明变量,不能使用public或private.

一。错误处理

(1)错误类型
语法错误
比如错误的关键词,错误的构造(缺少next的for)
运行时错误
语法正确,但语句尝试执行一个不可能的操作,比如除以0,或向软盘存储,但软盘不存在
逻辑错误
执行没有达到预期的结果。

(2) 处理运行时错误
创建robust script
通过预设一些处理脚本,用来处理用户错误,使得不要中断程序运行。
使能Graceful Exits
有些时候,error-handling code不能解决一个run-time错误,这个时候,你的代码仍旧执行一个动作,比如关闭所有打开的数据文件并保存数据,同时,通知用户一个错误发生,并进行更多的描述。
实现错误处理
设置一个错误陷阱
确定发生什么错误
执行一些补救的动作或用gracefully script退出。

(3)错误对象
Err object属性
常见的属性包括:
Number: 返回一个合法的错误数字,number是err object的默认属性
Description: 错误消息
Err object 方法:
Clear 清楚所有的err object的属性设置,clear等价于err=0
Raise 生成一个run-time错误,你可以使用这个方法来测试错误处理代码。

(4) 设置一个错误陷阱
On Error Resume Next
当陷阱被设置之后,默认的vbscript处理运行时错误的动作将被替代,这使得你可以用你自己的代码来控制动作的顺序,(使错误处理更合适,更安全)。
通过设置On Error Resume Next语句设置错误陷阱,这将使得你的代码继续运行。
如果你采用了on error resume语句,你应该对可能出现的潜在错误在代码中都有所反映:
On Error Resume Next
Dim intNumberOfTests, intTotalPoints, nAverage
' collect test information
intTotalPoints = InputBox("Enter the Total points scored.")
intNumberOfTests = InputBox("Enter the number of exams.")
' calculate average
nAverage = intTotalPoints / intNumberOfTests
' check for runtime errors by zero
Select Case Err.Number
Case 0 'No error occurred
WScript.Echo "Average score = " & Str(lngAverage)
Case 11 'Division by zero
WScript.Echo "Cannot divide by zero."
Case 13 ' Type mis-match
WScript.Echo "Only numeric data is allowed."
Case Else
WScript.Echo "Unexpected error."
WScript.Quit
End Select
Fixing the Error
上面的例子并没有修复错误,只是顺利的退出,下面的例子是尝试修复错误:也就是让用户再次尝试。
Call MainProc
Sub MainProc()
Dim iResult, iAnswer
iResult = CalcAvg()
Select Case iResult
Case 1
WScript.Echo "Cannot divide by zero"
iAnswer = Msgbox("Do you want to try again?",vbYesNo)
If iAnswer = vbYes then
Call MainProc
Else
WScript.Quit
End IF
Case 2
WScript.Echo "Only numeric data is allowed"
iAnswer = Msgbox("Do you want to try again?",vbYesNo)
If iAnswer = vbYes then
Call MainProc
Else
WScript.Quit
End IF
Case 3
WScript.Echo "An unexpected error occurred"
iAnswer = Msgbox("Do you want to try again?",vbYesNo)
If iAnswer = vbYes then
Call MainProc
Else
WScript.Quit
End IF
End Select
End Sub
Function CalcAvg()
On Error Resume Next
Dim intNumberOfTests, intTotalPoints, nAverage
' collect test information
intTotalPoints = InputBox("Enter the Total points scored.")
intNumberOfTests = InputBox("Enter the number of exams.")
' calculate average
nAverage = CInt(intTotalPoints)/CInt(intNumberOfTests)
' check for runtime errors by zero
Select Case Err.Number
Case 0 'No error occurred
WScript.Echo "Average score = " & nAverage
CalcAverage = 0
Case 11 'Division by zero
CalcAvg = 1
Case 13 ' Type mis-match
CalcAvg = 2
Case Else
CalcAvg = 3
End Select
End Function

二。排错
(1) Microsoft script debugger
Microsoft script debugger是作为windows 2000的安转的一部分,它帮助你找到逻辑错误。
查看源代码
查看和控制脚本流
查看和改变变量和属性的值
查看脚本中过程执行的顺序
在WSH脚本中处理错误
过程:
•脚本被调入WSH进行解析
•报告在解析期间的任何语法错误
•在成功解析后,WSH执行脚本
•当运行时错误发生,将显示错误信息并停止执行。
使用microsoft script debugger
当错误发生的时候,WSH会指示发生错误的行,如果你在计算机上安装有debuger,你可以尝试排错脚本。以只读方式打开当前的脚本。
你不可以直接在debugger中编辑脚本,你必须修改原来的.vbs文件。

(2) 排错技术
设置断点和步进
To set a breakpoint on a specific line, take the following actions:
In the Microsoft Script Debugger, place the insertion point in the line where you want the breakpoint.
On the Debug menu, click Toggle Breakpoint.
The line where you set the breakpoint is displayed in red to indicate that it is a breakpoint.
Step Into:每步执行一行
Step Over:同样每步执行一行,但子过程中不分步执行。
Step Out: 在长的脚本中,指定某一段落全速执行
使用命令窗口
查看和改变值,可以使用命令窗口。
查看call stack
用来跟踪过程的调用

posted on 2009-01-06 00:40  starspace  阅读(1274)  评论(0编辑  收藏  举报

导航