VBScript: Windows脚本宿主介绍

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\notepad.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就会返回默认的值。所以要读取一个键的默认值,只要指定键的名称即可。

    1. 名称(Name)
    2. 数据类型(Data Type)
    3. 值(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 "HKCU\Software\WROX\VBScript\",1,"REG_BINARY"
WshShell.RegWrite "HKCU\Software\WROX\VBScript\ProgRef","VB_is_great","REG_SZ"
'RegRead部分
bKey = WshShell.RegRead("HKCU\Software\WROX\VBScript\")
WScript.Echo WshShell.RegRead("HKCU\Software\WROX\VBScript\ProgRef")
'RegDelete部分
WshShell.RegDelete "HKCU\Software\WROX\VBScript\ProgRef"
WshShell.RegDelete "HKCU\Software\WROX\VBScript\"
WshShell.RegDelete "HKCU\Software\WROX\"
  • 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程序员参考手册》

posted @ 2013-07-15 14:30  ITGirl笑笑  阅读(2340)  评论(0编辑  收藏  举报