Windows脚本宿主(Windows Script Host, WSH)是一个Windows管理工具。WSH创建了一个脚本运行的主环境,WSH使脚本能够使用对象和服务,并提供脚本执行的准则。WSH还负责安全管理以及调用适当的脚本引擎。
使用Windows脚本宿主运行脚本
WSH提供了两个用于执行脚本的接口,这两个接口各使用不同的宿主程序作为VBScript引擎:
cscript.exe:用于在命令行中运行脚本,
wscript.exe:用于在Windows环境中运行脚本,直接与Windows GUI进行交互。
这两者就功能来讲几乎没有区别。
Windows脚本宿主的内建对象
1.WScript对象:WSH对象模型的基础。
属性:
Arguments,FullName,Interactive,Name,Path,ScriptFullName,ScriptName,StdErr,StdIn,StdOut,Version.
方法:
CreateObject,ConnectObject,DisconnectObject,Echo,GetObject,Quit,Sleep
2.WshArgument对象:是一个由WScript对象的Arguments属性返回的集合(WScript.Arguments),下面为遍历WshArguments集合的简单循环,依次显示每个元素:
Set objArgs = WScript.Arguments
For x = 0 To objArgs.Count - 1
WScript.Echo objArgs(x)
Next
3. WshNamed对象:WshNamed对象提供从命令行中对有名参数的访问。
4. WshUnnamed对象:WshNamed对象提供从命令行中对无名参数的访问。
- 使用WshArguments对象访问整个参数集合。
- 使用WshNamed对象访问有名字的参数。
- 使用WshUnamed对象访问没有名字的参数。
5.WshShell对象:用于获取系统环境变量的访问、创建快捷方式、访问Windows的特殊文件夹,如Windows Desktop,以及添加或删除注册表条目,还可使用Shell对象的功能创建更多的定制对话款以进行用户交互。
1)访问WshShell对象:要想使用WshShell对象的属性和方法,必须创建一个WScript.Shell对象的实例。这样以后对WshShell对象的引用实际就是对新创建实例的引用。
Set WshShell = WScript.CreateObject("WScript.Shell")
2)WshShell对象的属性:
- CurrentDirectory:该属性获取或更改当前活动目录。返回一个字符串,其中包含当前活跃进程的当前工作目录的完整有效路径名。
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo WshShell.CurrentDirectory
- Environment: 该属性返回WshEnvironment对象(一个环境变量集合)。
object.Environment([strType])
strType:可选,指定环境变量的位置。包括:System,User,Volatile,Process
下例返回系统中存在的处理器个数。
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshSysEnv = WshShell.Environment("SYSTEM")
WScript.Echo WshSysEnv("NUMBER_OF_PROCESSORS")
- SpecialFolders: 该属性返回一个SpecialFolders对象(一个特殊文件夹集合)。如果被请求的文件夹不可用,SpecialFolders属性将返回一个空字符串。
object.SpecialFolders(objWshSpecialFolders)
下例将Start Menu文件夹保存在变量strDesktop变量中
strDesktop = WshShell.SpecialFolders("StartMenu")
3)WshShell对象的方法(11个方法,均与操作系统shell相关)
- AppActivate:该方法用于激活一个指定的已经打开的应用程序窗口。返回一个Boolean类型的值,标志着过程调用是否成功。这个方法用于将焦点切换至指定名称的应用程序或窗口。
用法:object.AppActivate title
下例为打开计算器,并使用计算器计算3*5=15的过程(要运行下面的代码,需要将其保存为.wsf扩展名的Windows脚本宿主文件)。
<package>
<job id="vbs">
<script language="VBScript">
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "calc"
WScript.Sleep 100
WshShell.AppActivate "Calculator"
WScript.Sleep 100
WshShell.SendKeys "1{+}"
WScript.Sleep 500
WshShell.SendKeys "3"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 500
WshShell.SendKeys "*5"
WScript.Sleep 500
WshShell.SendKeys "~"
WScript.Sleep 2500
</script>
</job>
</package>
- CreateShortcut: 该方法用于创建一个新的快捷方式,或打开一个已有的快捷方式。要创建一个快捷方式,必须完成下列三个步骤:
- 创建WshShortcut对象的一个实例。
- 初始化其属性。
- 使用Save方法将其保存到磁盘。
用法:object.CreateShortcut(strPathname)
下例创建了一个记事本的快捷方式到桌面:
<package>
<job id="vbs">
<script language="VBScript">
Set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
Set oShellLink = WshShell.CreateShortcut(strDesktop & _
"Shortcut Script.lnk")
oShellLink.TargetPath = "%windir%system32
otepad.exe"
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+N"
oShellLink.IconLocation = "nopepad.exe, 0"
oShellLink.Description = "Shortcut to Notepad"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save
</script>
</job>
</package>
- ExpandEnvironmentStrings: 该方法返回环境变量的扩充值,且只对PROCESS环境空间内定义的环境变量进行扩充。环境变量的名称必须以"%"包围,并且是大小写不敏感的。
用法:object.ExpandEnvironmentStrings(strString)
strString为一个字符串值,表示想要扩充的环境变量的名称。
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Echo "Then path to WinDir is " _
& WshShell.ExpandEnvironmentStrings("%WinDir%")
- LogEvent: 该方法用于向日志文件中添加一个事件条目。
- Popup: 该方法用于在弹出式消息框中显示文本。无论使用哪种宿主可执行文件(wscript.exe或cscript.exe)运行脚本,都可以使用Popup方法显示一个消息框。
用法:intButton = object.Popup(strText,[nSecondsToWait],[strTitle],[nType])
strText: 一个字符串值,包含了想要显示在弹出式消息框中的文本。
nSecondsToWait: 一个数值,表示想要弹出式消息框现实的最长时间(以秒为单位)。默认值为0,表示弹出式消息框一直可见,直到被关闭。
strTitle: 一个字符串值,指定想要出现在弹出式消息框标题栏中的文本。若不指定,默认值为"Windows Script Host"。
nType: 一个数值,表示想在弹出式消息框中出现的按钮和图标的类型。
IntButton: 一个整数值,表示关闭消息框时单击的按钮的序号,这个值是由Popup方法返回的。
下面三个表格分别列出按钮类型、图标类型、关闭消息框是所单击的按钮的编号:
按钮类型:
值 | 描述 |
0 | 显示OK按钮 |
1 | 显示OK和Cancel按钮 |
2 | 显示Abort、Retry和Ignore按钮 |
3 | 显示Yes、No和Cancel按钮 |
4 | 显示Yes和No按钮 |
5 | 显示Retry和Cancel按钮 |
图标类型:
值 | 描述 |
16 | 显示中止(Stop Mart)图标 |
32 | 显示问号(Question Mart)图标 |
48 | 显示叹号(Exclamation Mark)图标 |
64 | 显示提示信息(Information Mark)图标 |
关闭消息框时所单击的按钮的编号:
值 | 描述 |
1 | OK按钮 |
2 | Cancel按钮 |
3 | Abort按钮 |
4 | Retry按钮 |
5 | Ignore按钮 |
6 | Yes按钮 |
7 | No按钮 |
举例:
Dim WshShell, BtnCode
Set WshShell = WScript.CreateObject("WScript.Shell")
BtnCode = WshShell.Popup("Do you like this code?", 7, "Quick survey:", 4 + 32)
Select Case BtnCode
Case 6 WScript.Echo "Glad to hear it - Thanks!"
Case 7 WScript.Echo "I'm sorry you didn't like it."
Case -1 WScript.Echo "Helllloooooooo?"
End Select
- RegDelete: 该方法从注册表中删除一个键或其键值。如果strName以反斜杠结尾,就可以指定键名,如果不使用反斜杠,就可以指定键值名。
用法:object.RegDelete(strName)
下表给出了根键名及其缩写:
根键名 | 缩写 |
HKEY_CURRENT_USER | HKCU |
HKEY_LOCAL_MACHINE | HKLM |
HKEY_CLASSES_ROOT | HKCR |
HKEY_USERS | HKEY_USERS |
HKEY_CURRENT_CONFIG | HKEY_CURRENT_CONFIG |
- RegRead: 该方法返回注册表中一个键或键值的名称。
用法:object.RegRead(strName)
一个键值包含三部分:如果指定了键名(相对于键值名来说),RegRead就会返回默认的值。所以要读取一个键的默认值,只要指定键的名称即可。
- 名称(Name)
- 数据类型(Data Type)
- 值(Value)
RegRead方法返回的值有5种类型:
类型 | 描述 | 形式 |
REG_SZ | 字符串 | 字符串 |
REG_DWORD | 数字 | 整数 |
REG_BINARY | 二进制值 | 整数构成的VBArray |
REG_EXPAND_SZ | 可扩充字符串(例如%windir%\notepad.exe) | 字符串 |
REG_MULTI_SZ | 字符串数组 | 字符串构成的VBArray |
- RegWrite: 该方法可以创建一个新键,给现有键添加另一个键值名(并制定一个值),或修改现有键值名的值。
用法:object.RegWrite(strName, anyValue [,strType])
strName: 一个字符串值,表示想要创建、添加或修改的键名、键值名或键值。
anyValue: 想要创建的新键的名称,或想添加到现有键的键值名,或想指定给某个现有键值名的新键值。
strType: 一个表示键值数据类型的字符串。RegWrite方法不支持REG_MULTI_SZ类型,支持上表中的其余四种类型。
Dim WshShell, bKey
Set WshShell = WScript.CreateObject("WScript.Shell")
'RegWrite部分
WshShell.RegWrite "HKCUSoftwareWROXVBScript",1,"REG_BINARY"
WshShell.RegWrite "HKCUSoftwareWROXVBScriptProgRef","VB_is_great","REG_SZ"
'RegRead部分
bKey = WshShell.RegRead("HKCUSoftwareWROXVBScript")
WScript.Echo WshShell.RegRead("HKCUSoftwareWROXVBScriptProgRef")
'RegDelete部分
WshShell.RegDelete "HKCUSoftwareWROXVBScriptProgRef"
WshShell.RegDelete "HKCUSoftwareWROXVBScript"
WshShell.RegDelete "HKCUSoftwareWROX"
- Run: Run方法在一个新进程中运行一个程序。
用法:object.Run(strCommand,[intWindowStyle],[bWaitOnReturn])
在AppActivate方法示例中已经用到过Run方法。下例代码打开命令提示符窗口并显示C盘内容:
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
oShell.Run "cmd /K CD C: & Dir"
Set oShell = Nothing
- SendKeys: SendKeys方法向活跃窗口发送一次或多次击键(仿佛来自键盘)。
用法:object.SendKeys(string)
要发送一个单独的键盘字符,只要将该字符本身作为字符串参数发送即可,如"x";
也可以发送多次击键,如,要发送击键x、y和z,可以发送字符串参数"xyz";
要发送特殊字符,包括圆括弧、尖括弧、花括弧以及加号(+),上尖号(^),百分号(%),波浪号(~),可以将它们包含在一对花括弧"{}"中间,如发送加号,可以发送字符串"{+}"。
- Exec: Exec方法在一个子命令解释器中运行一个应用程序,子命令解释器提供对StdIn、StdOut和StdErr流的访问。该方法只能执行命令行应用程序,并且不能用于运行远程脚本。
6. WshNetwork对象: WshNetwork对象提供对计算机所连接的网络上共享资源的访问。
1)访问WshNetwork对象: 通过创建WScript.Network对象的实例实现。
2)WshNetwork对象的属性:
- ComputerName
- UserDomain
- UserName
下例用到了这三个属性:
<package>
<job id = "vbs">
<script language="VBScript">
Set WshNetwork = WScript.CreateObject("WScript.Network")
WScript.Echo "Domain = " & WshNetwork.UserDomain
WScript.Echo "Computer Name = " & WshNetwork.ComputerName
WScript.Echo "User Name = " & WshNetwork.UserName
</script>
</job>
</package>
3)WshNetwork对象的方法:
AddWindowsPrinterConnection: 在计算机系统中添加一个Windows打印机连接。
AddPrinterConnection: 在计算机系统中添加一个远程打印机连接。
EnumPrinterDrives:返回当前网络驱动器的映射信息。
EnumPrinterConnection:返回当前网络打印机的映射信息。
MapNetworkDrive:在计算机系统中添加一个共享网络驱动器。
RemoveNetworkDrive:在计算机系统中删除一个共享的网络驱动器。
RemovePrinterConnection:在计算机系统中删除一个共享的网络打印机连接。
SetDefaultPrinter:将某个远程打印机指定为默认打印机。
7.WshEnvironment对象:提供对Windows环境变量集合的访问。
属性方法略。
8. WshSpecialFolders对象:提供对Windows特殊文件夹集合的访问。
属性方法略。
9. WshShortcut对象:允许使用脚本创建快捷方式。
属性方法略。
10. WshUrlShortcut对象:允许使用脚本创建到Internet资源的快捷方式。
属性方法略。
本文参考资料:
《VBScript程序员参考手册》