VBS脚本编程——WSH脚本宿主
Posted Ulysse
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBS脚本编程——WSH脚本宿主相关的知识,希望对你有一定的参考价值。
WSH的介绍
什么是WHS?
Windows 脚本宿主 (WSH) 是一种 Windows 管理工具。
WSH 为宿主脚本创建环境。也就是说,当脚本到达您的计算机时,WSH 充当主机的一部分,它使对象和服务可用于脚本,并提供一系列脚本执行指南。此外,Windows 脚本宿主还管理安全性并调用相应的脚本引擎。
对于与 WSH 兼容的脚本引擎来说,WSH 是与语言无关的。它为 Windows 平台提供了简单、功能强大而又灵活的脚本编写功能,允许您从 Windows 桌面和命令提示符运行脚本。
Windows 脚本宿主非常适合于非交互式脚本编写的需要,如脚本登录、脚本管理和计算机自动化。
WSH对象和服务
Windows 脚本宿主为直接操纵脚本执行提供了若干个对象,并为其他操作提供了 helper 函数。使用这些对象和服务,可以完成如下任务:
- 将消息打印到屏幕上
- 运行基本函数,如 CreateObject 和 GetObject
- 映射网络驱动器
- 与打印机连接
- 检索并修改环境变量
- 修改注册表项
脚本文件的类型
独立的脚本文件有一些不同的格式,每种格式都有自己的扩展名。
这就是 Windows 脚本宿主文件(WSF 文件)的有用之处。WSF 文件可以包含其他的脚本文件作为其脚本的一部分。这意味着多个 WSF 文件可以引用创建并保存在同一地点的库和有用的函数
使用Windows脚本宿主运行脚本
WSH 提供了两个用于执行脚本的接口,一个用于命令行,一个用于 Windows 环境。这两个接口各使用不同的宿主程序作为 VBScript 引擎:
● cscript.exe:用于在命令行中运行脚本
● wscript.exe:用于在 Windows 环境中运行脚本
之所以有两个宿主程序,是因为 cscript.exe 被设计为从控制台窗口启动(一般来说是 Windows 中的 MS-DOS 窗口),而 wscript.exe 则用于直接与 Windows GUI 进行交互。这两者就功能来讲几乎没有区别。
1、命令行执行
执行脚本文件的命令行界面,cscript.exe 调用方法如下:
1. 打开 Run 对话框(按下窗口键+R)或某个命令窗口(在 Windows 9x 中,可以依次单击 Start|Programs|DOS Prompt;在 Windows NT 中,依次单击 Start|Programs|Command Prompt;在 Vista/XP 中,依次单击 Start|All Programs|Accessories|Command Prompt)。
注意,在使用 Windows Vista 时,打开 Command Prompt 需要系统管理员权限。最简
单的方法是以系统管理员身份在开始菜单中用鼠标右键单击 Command Prompt 并选择 Ru
n。
2. 执行脚本如下:
cscript c:\\folderName\\YourScriptName.vbs
如果直接在命令行中运行 cscript.exe 时不加参数,就只会得到使用帮助信息:
用法:CScript scriptname.extension [option...] [arguments...]
选项:
//B 批模式:不显示脚本错误及提示信息
//D 启用 Active Debugging
//E:engine 使用执行脚本的引擎
//H:CScript 将默认的脚本宿主改为 CScript.exe
//H:WScript 将默认的脚本宿主改为 WScript.exe (默认)
//I 交互模式(默认,与 //B 相对)
//Job:xxxx 执行一个 WSF 工作
//Logo 显示徽标(默认)
//Nologo 不显示徽标:执行时不显示标志
//S 为该用户保存当前命令行选项
//T:nn 超时设定秒:允许脚本运行的最长时间
//X 在调试器中执行脚本
//U 用 Unicode 表示来自控制台的重定向 I/O
2、在Windows环境中执行WSH
执行脚本文件的 Windows GUI 界面是 wscript.exe,它允许以下列几种方式执行文件:
● 如果文件的类型注册为在 WSH 中执行,就可以直接在文件夹窗口或桌面上双击
这些文件的图标来执行。
● 如果使用 Run 命令对话框,那么就只要输入脚本的完整路径和名称即可。
在 Run 命令对话框中,可以调用 wscript.exe。
执行脚本如下:
wscript c:\\folderName\\YourScriptName.vbs
如果在命令行提示符下运行 wscript.exe,就不会有输出信息,而是会出现一个如图所示的对话框。该对话框提供了最基本的定制选项。
单击 OK 按钮后,将不会有任何反应。在系统级定制脚本行为的唯一方法就是使用先前曾详细介绍的 cscript 选项。
WScript对象
WSH 对象模型的基础就是 WScript 对象。这个对象提供了使开发人员能够访问各种信息的属性和方法,如:
● 将要执行的脚本的名称和路径信息
● Microsoft 脚本引擎的版本
● 与外部对象的链接
● 与用户的交互
● 延迟或中断脚本执行的能力
1、WScript属性
WScript 对象具有下列属性:
● Arguments
● FullName
● Interactive
● Name
● Path
● ScriptFullName
● ScriptName
● StdErr
● StdIn
● StdOut
● Version
1.Arguments
Arguments 属性包含了 WshArguments 对象(一个参数集合)。从该集合中获取单个参数时,使用由 0 开始的索引。
例、新建一个Argu.vbs脚本文件,写入如下代码
Dim objArgs,i,sum,s1,s2
Set objArgs = WScript.Arguments
s1 = objArgs.Item(0)
s2 = objArgs.Item(1)
sum = 0
For i = s1 To s2
sum = sum + i
Next
WScript.Echo "从"&s1&"到"&s2&"之间的整数和为:"&sum
在打开命令提示符,进入到当前脚本文件所在路径,输入
cscript Argu.vbs 1 100 //nologo
按回车,即可算出从1到100之间的整数和为:5050
2.FullName
FullName 属性是一个只读的字符串,它代表宿主可执行文件(cscript.exe 或 wscript.exe)的有效完整路径。下面的代码使用了 FullName 属性。
WScript.Echo WScript.FullName
3.Interactive
Interactive 属性设置脚本的模式,或识别脚本的模式。使用该属性会返回一个布尔值。有两种可用的模式:批处理模式和交互模式。
可以使用 WSH 命令行开关脚本模式//I(交互模式)和//B(批处理模式)来设置脚本模式。
4.Name
Name 属性返回 WScript 对象(宿主可执行文件)的名称,它是一个只读的字符串。下面的代码使用了 Name 属性:
WScript.Echo WScript.Name
5.Path
Path 属性返回包含宿主可执行文件(cscript.exe 或 wscript.exe)的目录名。该属性返回一个只读的字符串。
下面的 VBScript 代码将显示可执行文件所在的目录名:
WScript.Echo WScript.Path
6.ScriptFullName
ScriptFullName 属性返回当前正在运行的脚本的完整路径。该属性返回一个只读的字符
串。
7.ScriptName
ScriptName 属性返回当前正在运行的脚本的文件名。该属性返回一个只读的字符串。
8.StdErr
StdErr 属性开放当前脚本的只写的错误输出流。该属性返回一个标识标准错误流的对象。只有使用 cscript.exe 时才能访问 StdIn、StdOut 和 StdErr 流。使用 wscript.exe 时如果想访问这些流就会产生一个错误。
9.StdIn
StdIn 属性开放当前脚本的只读的输入流。该属性返回一个标识标准错误流的对象。
10.StdOut
StdOut 属性开放当前脚本的只写的错误输出流。该属性返回一个标识标准错误流的对象。
下面的示例使用了这三种类型的内建流打印匹配某一特定扩展名的所有文件列表。这是通过将 DOS 的 dir 命令结果使用管道重定向到过滤器脚本来实现的,其中将扩展名字符串作为参数。
例、新建一个filter.vbs脚本文件,写入如下代码
\'用法:dir | csript filter.vbs ext
\' ext:需要匹配的扩展名
Dim StreamOut,StreamIn,StreamErr
Set StreamOut = WScript.StdOut
Set StreamIn = WScript.StdIn
Set StreamErr = WScript.StdErr
Dim strExt,strLineIn
Dim intMatch
strExt = WScript.Arguments(0)
intMatch = 0
Do While Not StreamIn.AtEndOfStream
strLineIn = StreamIn.ReadLine
If StrComp(strExt,Right(strLineIn,Len(strExt)),vbTextCompare)=0 Then
StreamOut.WriteLine strLineIn
intMatch = intMatch + 1
End If
Loop
If intMatch = 0 Then
StreamErr.WriteLine "未找到"&strExt&"文件"
End if
在打开命令提示符,进入到当前脚本文件所在路径,输入
dir /s | filter.vbs vbs //nologo
按回车,即可查询当前目录及子目录下的所有扩展名为.vbs的文件
这个示例中使用 StdIn、StdOut 和 StdErr 进行消息的处理,所以不仅能将匹配的文
件打印在屏幕上,也能够将输出结果发送到一个文本文件或其他有重定向或附加管道功能的
应用程序中。
11.Version
该属性返回 WSH 的版本。下面的代码显示当前 WSH 的版本。
WScript.Echo WScript.Version
2、WScript方法
WScript 对象具有下列方法:
● CreateObject
● ConnectObject
● DisconnectObject
● GetObject
● Echo
● Quit
● Sleep
1.CreateObject
WScript 对象的这个方法用于创建一个 COM 对象。
object.CreateObject(strProgID[,strPrefix])
- object:WScript 对象。
- strProgID:值为字符串,表示想要创建的对象的程序标识符(ProgID)。
- strPrefix:可选。值为字符串,表示函数前缀。
使用 CreateObject 方法和 strPrefix 参数创建的对象是已连接对象。对象被创建后,其输
出接口与脚本文件相连接。每个事件函数都由这个前缀加上事件的名称来命名。如果创建对象时没有使用 strPrefix 参数,也可以使用 ConnectObject 方法同步对象的事件。只要对象产生一个事件,WSH 就会调用一个子程序,其名称是 strPrefix 加上事件的名称。
2.ConnectObject
该方法将对象的事件源连接到具有给定前缀的函数。
object.ConnectObject(strObject, strPrefix)
- object:WScript 对象。
- strObject:必需的。表示想要连接的对象名称的字符串。
- strPrefix:必需的。表示函数前缀的字符串。
同步一个对象的事件时,已连接对象是很有用的。对象被创建后,ConnectObject 方法将对象的输出接口连接到脚本文件。事件函数的名称就是这个前缀加上事件的名称。
3.DisconnectObject
该方法用于断开已连接对象的事件源的连接。
object.DisconnectObject(obj)
- object:WScript 对象。
- obj:表示想要断开连接的对象名称的字符串。
断开一个对象的连接意味着 WSH 无法再响应它的事件。但是,有一点很重要,那就是断开连接后对象仍然能够产生事件。还要注意的是,如果指定的对象尚未连接,DisconnectObject 方法就不会做任何事。
4.GetObject
GetObject 方法根据指定的 ProgID 获取某个已存在对象,或从文件创建一个新的对象。
object.GetObject(strPathname [,strProgID], [strPrefix])
- object:WScript 对象。
- strPathname:包含将对象保存到磁盘的文件所使用的完整的有效路径名。
- strProgID:可选。值为字符串,表示想要创建的对象的程序标识符(ProgID)。
- strPrefix:可选。进行对象事件同步时有用。如果提供了 strPrefix 参数,WSH 就会在创建对象之后将对象的输出接口连接到脚本文件。
如果内存中存在对象的一个实例,或者想从文件创建一个对象,都需要使用 GetObject方法。GetObject 方法适用于所有 COM 类,与创建对象使用的脚本语言无关。如果内存不存在对象的实例,也不想从文件创建对象,就可以使用 CreateObject 方法。
5.Echo
该方法输出一个消息框或一个命令控制台窗口。
object.Echo [Arg1] [,Arg2] [,Arg3] ...
- object:WScript 对象。
- Arg1、Arg2、Arg3、……:可选。表示要显示项目的列表。
根据当前使用的 WSH 引擎的不同,Echo 方法输出的类型也有所变化。
6.Quit
该方法强制脚本在任意时刻立即停止执行。
- object.Quit([intErrorCode])
- object:WScript 对象。
- intErrorCode:可选。返回一个整数值,作为进程的返回码。如果忽略 intErrorCode 参数,就不会有返回值。
Quit 方法可以用于返回一个可选的错误代码。如果 Quit 方法是脚本中的最后一条命令(并且不需要返回一个非零值),就可以不使用任何参数,这样脚本就会正常退出。
7.Sleep
该方法将脚本的执行挂起一段时间,然后接着执行。
object.Sleep(intTime)
- object:WScript 对象。
- intTime:这是一个整数值,表示希望脚本进程保持非活跃状态的时间间隔(以毫秒为单位)。
使用这个方法时,运行脚本的线程被挂起,占用的 CPU 被释放。当间隔时间到,就会继续恢复执行。要想被事件所触发,脚本必须持续活跃,因为已经结束执行的脚本是肯定不能检测到任何事件的。脚本所处理的事件在脚本休眠时仍然会被执行。
向 Sleep 方法传递 0 或-1 作为参数,就不会导致脚本不确定性地挂起。
例、新建一个time.vbs脚本文件,写入如下代码
Do While True
WScript.Echo Time
WScript.Sleep 1000
Loop
在打开命令提示符,进入到当前脚本文件所在路径,输入
cscript time.vbs //nologo
按回车,即可每过一秒显示当前的时间
WshArguments对象
编程过程中,参数的使用是一种非常有益的机制,可以给脚本提供输入以支持它的工作。
如果考虑在 DOS 提示符下工作,那么多数命令行可执行文件都使用参数来确定要做的事情。
创建使用参数的脚本是编写可重用代码的一个良好开端。创建设计用于在命令行中执行
的脚本的开发人员会立竿见影地感受到使用 Arguments 属性带来的好处。不过,在 WSH 中,
还有更好的理由来使用这个对象,因为这就是拖放功能得以实现的原因。使用这个对象的最后一个好处就是它允许开发人员在其他脚本中重用脚本代码,只要以
命令行运行的方式运行想重用的脚本,并给它传递可能在运行时需要的参数即可。
1、访问 WshArgument 对象
它是通过使用 WScript.Arguments 属性来实现的。
Set objArgs = WScript.Arguments
2、WshArguments对象的属性
WshArgument 对象是一个由 WScript 对象的 Arguments 属性返回的集合(WScript.Arguments)。
访问命令行参数集合有下列三种方法:
- 使用 WshArguments 对象访问整个参数集合。
- 使用 WshNamed 对象访问有名字的参数。
- 使用 WshUnnamed 对象访问没有名字的参数。
下面的例子是一个遍历 WshArguments 集合的简单循环,依次显示每个元素:
Set objArgs = WScript. Arguments
For x = 0 to objArgs.Count - 1
WScript.Echo objArgs(x)
Next
WshShell对象
Windows 脚本宿主提供了一种便捷的方式,可以用于获取系统环境变量的访问、创建
快捷方式、访问 Windows 的特殊文件夹,如 Windows Desktop,以及添加或删除注册表条
目。还可以使用 Shell 对象的功能创建更多的定制对话框以进行用户交互。
1、访问WshShell对象
要使用下面这一节中将要列出的属性,程序员必须创建一个 WScript.Shell 对象的实例。
这样以后对 WshShell 对象的引用实际就是对新创建实例的引用。
Set WshShell= WScript.CreateObject( "WScript.Shell" )
2、WshShell对象的属性
WshShell 对象有三个属性:
● CurrentDirectory
● Environment
● SpecialFolders
1.CurrentDirectory
该属性获取或更改当前活动目录。
object.CurrentDirectory
- object:WshShell 对象。
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo WshShell.CurrentDirectory
2.Environment
该属性返回 WshEnvironment 对象(一个环境变量集合)。
object.Environment ([strType])
- object:WshShell 对象。
- strType:可选。指定环境变量的位置。
Environment 属性包含 WshEnvironment 对象(一个环境变量集合)。如果指定了 strType,就指定了环境变量所在的级别的值:
- System
- User
- Volatile
- Process
如果没有指定 strType,Environment 属性就会根据不同的操作系统返回不同的环境变量类型。
要注意的是,脚本有可能访问其他应用程序所设置的环境变量。
下面是一个关于在代码中如何使用上面列出的这些变量的示例。该示例返回系统中存在的处理器个数。
Set WshShell = CreateObject("Wscript.Shell")
Set WshSysEnv = WshShell.Environment
WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
3.SpecialFolders
该属性返回一个SpecialFolders对象(一个特殊文件夹集合)
object.SpecialFolders(objWshSpecialFolders)
- object:WshShell 对象。
- onjWshSpecialFolders:特殊文件夹的名称。
WshSpecialFolders 对象是一个集合,它包含所有的 Windows 特殊文件夹。
特殊文件夹的名称用于索引集合以获取想要的具体文件夹。如果被请求的文件夹(strFolderName)不可用,SpecialFolder 属性将返回一个空字符串。
下面是可用的特殊文件夹:
- AllUsersDesktop
- AllUsersStartMenu
- AllUsersPrograms
- AllUsersStartup
- Desktop
- Favorites
- Fonts
- MyDocuments
- NetHood
- PrintHood
- Programs
- Recent
- SendTo
- StartMenu
- Startup
- Templates
下面的代码用于获取 Start Menu 文件夹并在 strDeskTop 变量中保存路径以备后面的使用。
strDesktop = WshShell.SpecialFolders("StartMenu")
3、WshShell对象的方法
WshShell 对象有 11 个方法。所有这些方法都与操作系统 shell 相关,可以用于控制 Wi
ndows 注册表,也可以创建弹出式消息框和快捷方式以及激活和控制正在运行的应用程序:
● Run
● SendKeys
● AppActivate
● Exec
● CreateShortcut
● Popup
● ExpandEnvironmentStrings
● LogEvent
● RegRead
● RegWrite
● RegDelete
1.Run
Run 方法在一个新进程中运行一个程序。
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
object:WshShell 对象。
- strCommand:一个字符串,表示想要运行的命令行,必须包含所有要传递给可
- 执行文件的参数。
- intWindowStyle:可选。一个整数值,表示程序窗口的外观。并不是所有的程序
- 都使用这一信息。
- bWaitOnReturn:可选。一个 Boolean 值,表示脚本在其下一条语句之前是否需要等待程序结束。如果设置为 True,脚本一直停止执行直到程序结束,Run 返回任一个由程序返回的错误代码。如果设置为 False(默认),程序启动后,Run 方法立即返回 0(这不是错误代码)。
Run 方法返回一个整数。该方法使用一个新的 Windows 进程启动运行一个程序。可以
让脚本等待程序运行完毕再继续执行,这样就可以是脚本和程序同步执行。如果将某个文件类型成功注册到某一个特定程序,那么对该文件调用 Run 方法就会启动注册的程序。例如,对一个*.txt 文件调用 Run 方法,就会启动记事本程序并将文本文件加载到其中。下表列出了 intWindowStyle 的可用值。