当前位置:首页 >> 脚本专栏

Vbscript写注册表的方法

早些年用过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(读取注册表数据)。 

先看个简单的例子

'注册表:regedit
dim WshShell
Set WshShell = CreateObject("Wscript.Shell")
WshShell.RegWrite "HKEY_CURRENT_USER\Software\VMware, Inc.\VMware Tray",0,"REG_SZ"
Wscript.Echo "完毕"
Wscript.Quit

  通常我们只需要用到前两种方法,它们具体的使用方法如下: 

一、RegWrite(写入或新建注册表数据) 

  * 新建子主键 

  语法为:WshShell.RegWrite "子主键名" 

  例如,我们想新建一个子主键“HKEY_CURRENT_USERMyReg”,可使用如下的语句: 

  WshShell.RegWrite "HKCUMyReg" 

  说明:子主键名必须以反斜线 () 结束,若不小心忘记输入了这个(),则该方法返回的是键值,即表示你是想在  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_USERMyReg” 下新建一个字符串键值KeyValue,设置键值的数据为“str”,可使用如下的语句: 

WshShell.RegWrite "HKCUMyRegKeyValue", "str" 

  (注:键值为字符串值,可省去"键值类型"的声明) 

  若所建的为二进制值或DWORD值,数据为“1”,则还必须声明键值的类型,如下: 

  WshShell.RegWrite "HKCUMyRegKeyValue",1,"REG_BINARY" 

  WshShell.RegWrite "HKCUMyRegKeyValue",1,"REG_DWORD" 

  注意二进制值和DWORD值的数据不能加引号,而字符串值的数据则必须加引号。 

二、RegDelete(删除注册表数据) 

  * 删除一个子主键 

  语法为:WshShell.RegDelete "子主键名" 

  例如,我们想删除子主键“HKEY_CURRENT_USERMyReg”,可使用如下的语句: 

  WshShell.RegDelete "HKCUMyReg" 

  * 删除子主键的某个键值 

  语法为:WshShell.RegDelete "子主键名键值名" 

  例如,我们想删除子主键“HKEY_CURRENT_USERMyReg” 的键值KeyValue,可使用如下的语句: 

  WshShell.RegDelete "HKCUMyRegKeyValue" 

  类似于RegWrite,有一个“”号表示的是删除子主键,没有“”则表示要删除的是子主键下的键值。 
除了WshShell对象外,我们还必须了解一下WScirpt 对象。WScirpt对象即代表Scripting Engine,只要启动Engine就会自动产生此对象。WScript对象提供了创建和读取对象的方法。要使用WSH的其他对象(例如WshShell对象),就必须先用WScript对象的有关方法(CreateObject、GetObject)来创建和读取。 

  创建对象的语法如下: 

  WScript.CreateObject(strProgID) 

  其中strProgID就是我们所要创建的对象的标识名。 

  例如:我们要使用WshShell对象及其属性和方法,首先就要用WScript对象的方法CreateObject来创建一个WshShell对象,语句如下: 

  Set WSHShell = WScript.CreateObject("WScript.Shell") 

  举一个例子吧。大家都知道,如果你使用了“开始”菜单中的“运行”,Windows将在列表框里记录下你“作案” 的痕迹。其实这些数据是记录在注册表中HKEY_CURRENT_USERSoftwareMicrosoftWindows 

  CurrentVersionExplorerRunMRU子键下,我们只要把这个子键删除,然后再重新建立,不就可以了吗? 

  现在我们可以来编写一个脚本了。以VBS为例,我们可以用记事本新建一个文件,然后输入(其中“//”后的文字为注释,不必输入): 

  //定义对象,要编辑注册表,我们需要使用WSHShell对象及其方法 
  Dim WSHShell 
  //对象的方法CreateObject来创建WSHShell对象 
  Set WSHShell = WScript.CreateObject("WScript.Shell") 
  //然后我们使用WSHShell对象的方法RegDelete来删除 HKEY_CURRENT_USERSoftwareMicrosoft 
  WindowsCurrentVersionExplorerRunMRU子键 
  WSHShell.RegDelete "HKCUSoftwareMicrosoft 
  WindowsCurrentVersionExplorerRunMRU" 
  //最后我们恢复该主键,并在该主键下恢复字符串值“MRUList”,设置其数据为空串 
 WSHShell.RegWrite "HKCUSoftwareMicrosoft 
  WindowsCurrentVersionExplorerRunMRUMRUList","" 

  程序到此结束,我们把文件另存为CleanMRU.vbs就可以了。现在我们就可以使用Scripting Engine来执行这个程序了。假设我们刚才把这个文件保存在D:TEMP里,我们就可以使用“开始”菜单的“运行”——Wcript.exe D:TEMPCleanMRU.vbs。重新启动,怎么样?“运行”里已经是空空如也了吧! 

  如果我们这样费尽心思地编了程序,最后还是得靠手工来运行,那还不如每次直接用注册表编辑器来操作呢!其实我们完全可以让它在每次开机时自动加载。这么一说,大家肯定都知道了——我们可以使用注册表编辑器,在“HKEY_LOCAL_MACHINESoftwareMicrosoftWindows 

  CurrentVersionRun”子主键下建立一个字符串值 “CleanMRU”,设置其数据为"Wcript.exe D:TEMPCleanMRU.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”就可以了。