早些年用过 DOS 系统的用户都知道,MS-DOS 操作系统允许普通用户 编写批处理文件来实现简单的编程。它有效地简化了我们的工作,带给我 们许多方便。当时甚至出现了一些专门编写批处理文件的程序员呢。
事实上,操作系统除了提供易于操作的使用界面外,还应当有一套内 建的 Script (脚本)语言才算完整。从某种角度来说,批处理文件可以 说就是 MS-DOS 下的脚本语言。到了 Windows 时代,虽然 Windows 系统 仍然保留了批处理,但是批处理在 Windows 中就显得功能过于简单,无法 满足用户的需要了——比如修改注册表,批处理能做得到吗? 事实上, Windows 98 之后的 Windows 系统,除了保留原来的批处理系统之外,开 始加入了对脚本语言的支持,这就是“Windows Scripting Host”,中文译 名为“Windows 脚本宿主”,简称 WSH。
WSH 本身并不是脚本语言,它是脚本语言的运行环境,WSH 支持的 脚本语言有 JScript(微软版的 JavaScript,与真正 JavaScript 不太一样) 和 VBScript ——这个东东大家一定很熟悉啦,网页上常用。
WSH 的脚本引擎(Scripting Engine)有两种方式,一种是 Command 方式的 CScript.exe,另一种是 Windows 方式的 WScript.exe。我们编写的脚 本程序(扩展名为“.js”和“.vbs”的纯文本文件)必须通过这两者之一来加 载运行。
虽然 WSH 支持 JScript 和 VBScript 语言,但仍然要配合 WSH 本身所提 供的一些对象,以及对象的属性(Properties)和方法(Method)才能够发 挥最大的效用。关于 JScript 和 VBScript 的程序设计我们这里就不多说了。我 们现在还是把注意力放在 WSH 的对象上面。事实上,本文涉及的注册表编程 就几乎不需要关于 VBScript 的任何知识,我们只需简单地套用现成的语句就 可以了。
WSH 中的对象主要有:WScirpt 、WshArguments 、WshShell 、 WshUrlShortcut、WshNetwork、WshSpecialFolders、WshCollection、 WshEnvironment、WshShort 等。
每一个对象又都有各自的属性和方法。在这里我们仅就访问注册表所涉 及的有关对象的方法和属性略做介绍。
首先是 WshShell 对象。该对象可用来设置系统环境变量以及修改注册表 的数据。要修改注册表的数据,需要使用 WshShell 对象的三种方法: RegDelete (删除注册表数据)、RegWrite (写入或新建注册表数据)和 RegRead(读取注册表数据)。
通常我们只需要用到前两种方法,它们具体的使用方法如下:
一、RegWrite (写入或新建注册表数据)
* 新建子主键
语法为:WshShell.RegWrite " 子主键名 \" 例如,我们想新建一个子主键“HKEY_CURRENT_USER\MyReg”,
可使用如下的语句:
WshShell.RegWrite "HKCU\MyReg\"
说明:子主键名必须以反斜线 (\) 结束,若不小心忘记输入了这个(\), 则该方法返回的是键值,即表示你是想在 HKEY_CURRENT_USER\ 下建 立了一个名叫 MyReg 的键值了。这一点一定要十分注意!
注意引号里子主键的开头必须是下列根键名之一:
HKEY_CURRENT_USER(可简写为 HKCU)、HKEY_LOCAL_MACHINE
(HKLM)、HKEY_CLASSES_ROOT
(HKCR )、HKEY_USERS 和 HKEY_CURRENT_CONFIG
* 在子主键下建立新的键值(或改 写已有的键值的数据)
语法为:WshShell.RegWrite " 子主 键名 \ 键值名 "," 键值的数据 "," 键值的类 型 "
例 如 我 们 想 在 子 主 键
“HKEY_CURRENT_USER\MyReg” 下新建一个字符串键值 KeyValue ,设置 键值的数据为“str ”,可使用如下的语 句:
WshShell.RegWrite
"HKCU\MyReg\KeyValue", "str"
(注: 键值为字符串值,可省去 " 键值 类型 " 的声明)
若所建的为二进制值或 DWORD 值, 数据为“1”,则还必须声明键值的类型,如 下:
WshShell.RegWrite
"HKCU\MyReg\KeyValue",1,
"REG_BINARY"
WshShell.RegWrite
"HKCU\MyReg\KeyValue",1,
"REG_DWORD" 注意二进制值和 DWORD 值的数据不
能加引号,而字符串值的数据则必须加 引号 。
二、RegDelete(删除注册表数据)
* 删除一个子主键 语法为:WshShell.RegDelete " 子主键
名 \"
例 如 , 我 们 想 删 除 子 主 键
“HKEY_CURRENT_USER\MyReg”, 可使用如下的语句:
WshShell.RegDelete
"HKCU\MyReg\"
* 删除子主键的某个键值 语法为:WshShell.RegDelete " 子主键
名 \ 键值名 "
例 如 , 我 们 想 删 除 子 主 键
“HKEY_CURRENT_USER\MyReg” 的键值 KeyValue ,可使用如下的语句:
WshShell.RegDelete
"HKCU\MyReg\KeyValue"
类似于 RegWrite,有一个“\ ”号 表示的是删除子主键,没有“\ ”则表 示要删除的是子主键下的键值。除了 WshShell 对象外,我们还必须了解一下 WScirpt 对象。WScirpt 对象即代表 Scripting Engine,只要启动 Engine 就会自动产生此对象。WScript 对象提供了创建和 读取对象的方法 。 要使用 W S H 的其他对象 ( 例如 WshShell 对象),就必须先用 WScript 对象的有关方法
(CreateObject 、GetObject )来创建和读取。 创建对象的语法如下: WScript.CreateObject(strProgID)
其中 strProgID 就是我们所要创建的对象的标识名。 例如:我们要使用 WshShell 对象及其属性和方法,首先
就要用 WScript 对象的方法 CreateObject 来创建一个 WshShell 对象,语句如下:
Set WSHShell = WScript.CreateObject("WScript. Shell")
举一个例子吧。大家都知道,如果你使用了“开始”菜 单中的“运行”,Windows 将在列表框里记录下你“作案” 的 痕 迹 。 其 实 这 些 数 据 是 记 录 在 注 册 表 中 HKEY_CURRENT_USER\Software\Microsoft\Windows\ CurrentVersion\Explorer\RunMRU 子键下,我们只要把 这个子键删除 ,然后再重新建立,不就可以了吗 ?
现在我们可以来编写一个脚本了。以 VBS 为例,我们 可以用记事本新建一个文件,然后输入(其中“// ”后的 文字为注释,不必输入):
// 定义对象,要编辑注册表,我们需要使用 WSHShell 对象及其方法 Dim WSHShell
// 对象的方法 CreateObject 来创建 WSHShell 对象
Set WSHShell = WScript.CreateObject("WScript.Shell")
// 然后我们使用 WSHShell 对象的方法 RegDelete 来删除 HKEY_CURRENT_USER\Software\Microsoft\ Windows\CurrentVersion\Explorer\RunMRU子键
WSHShell.RegDelete "HKCU\Software\Microsoft\ Windows\CurrentVersion\Explorer\RunMRU\"
// 最后我们恢复该主键,并在该主键下恢复字符串值“MRUList”,设置 其数据为空串
WSHShell.RegWrite "HKCU\Software\Microsoft\ Windows\CurrentVersion\Explorer\RunMRU\MRUList",""
程序到此结束,我们把文件另存为 CleanMRU.vbs 就 可以了。现在我们就可以使用 Scripting Engine 来执行这个 程序了。假设我们刚才把这个文件保存在 D:\TEMP 里,我 们就可以使用“开始”菜单的“运行”—— Wcript.exe D:
\TEMP\CleanMRU.vbs。重新启动,怎么样?“运行”里 已经是空空如也了吧!
如果我们这样费尽心思地编了程序,最后还是得靠手 工来运行,那还不如每次直接用注册表编辑器来操作呢!其 实我们完全可以让它在每次开机时自动加载。这么一说,大 家肯定都知道了 —— 我们可以使用注册表编辑器 , 在
“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ CurrentVersion\Run ”子主键下建立一个字符串值
“CleanMRU ”,设置其数据为 "Wcript.exe D:
\TEMP\CleanMRU.vbs"。嘿嘿,这样才算大功告成。 以后你每次开机,Windows 就会自动执行该脚本以清除
“运行”中的历史记录了。 限于篇幅,本文仅仅介绍了 WSH 有关注册表修改部分
的对象的初步使用。我们只要在脚本里加上一些简单的语 句,就可以很方便地实现交互性的操作——当然,这就需要大家掌握更多的关于 WSH 和 VBScript 的知识。如果感兴趣 的话,大家可以到微软网站下载有关 WSH 和 VBScript 的帮 助文档,URL 分别是 http://www.microsoft.com/china/ scripting/windowshost/wshdoc.exe 和 http://www. microsoft.com/china/scripting/vbscript/download/ vbsdoc.exe(都是中文)。另外,在 Windows 的 Samples 目 录下,有一个 WSH 文件夹,那里面有不少.vbs 和.js 例程, 大家可以去打开来看看(鼠标右击图标,选择“编辑”),相 信一定会有不少收获的。
最后 ,如果你的机器上已经安装了 Windows Scripting Host,而 VBS 程序仍然无法运行的话,很可 能是你自己或其他应用程序修改了.VBS 的关联。据笔者 所知,几乎每台机器上都装有的“超级解霸”就会修改. VBS 文件的关联。没关系的,你只要从“控制面板”—“添 加 / 删除程序”—“Windows 安装程序”—“附件”—“详细资料”里先卸掉 ,然后再重新装上“Windows Scripting Host”就可以了。