我需要创建一个不依赖 WMI 的脚本来执行以下操作:
- 检查注册表值是否存在,以及它是否具有所需的类型
- 如果注册表值存在但类型错误,请将其删除
- 如果注册表值不存在,或者在步骤 #2 中被删除,则使用特定类型创建它
- 如果注册表值存在且类型正确,请确保其值正确
我在 Internet 上找到的几乎所有注册表操作 VBScript 代码片段都依赖于 WMI。由于某些原因,这是不可接受的。
您对如何在不依赖 WMI 的情况下操作注册表有任何建议吗?
Windows Scripting Host (WSH) 中的 VBScript/JScript确实具有来自WScript.Shell
对象的注册表功能,但它们仅限于读取、写入和删除键/值。没有任何功能可以检索注册表项或值的存在,除非通过读取它并检查结果。检索注册表值类型的函数也不存在。
除了从 WMI 对象访问注册表的其他方法是通过函数使用打包的REG.EXE
命令行工具。WScript.Shell.Exec
这是通过使用QUERY
, ADD
, DELETE
, IMPORT
, 或EXPORT
命令参数来完成的。运行REG.EXE
显示使用摘要,或REG.EXE QUERY /?
,REG.EXE EXPORT /?
等显示命令使用详情。
如果存在,命令的输出QUERY
将显示值数据及其类型。该EXPORT
命令也可以使用,除了它将结果保存在REG
文件中。工具的结果REG.EXE
也可以在CMD.EXE
. 例如:
CMD.EXE /C REG.EXE QUERY "HKEY_CURRENT_USER\Control Panel\Cursors" > "reg output.txt"
请注意,文件output.txt
的内容与文件的内容不同REG
。该REG
文件具有标准格式,在 Microsoft 知识库KB310516中有部分描述。
通过检查REG.EXE
工具的退出代码,并解析其输出或生成的REG
文件,检索注册表值类型是可能的。WScript.Shell
如果可能并且如果性能是一个问题,应该使用可以使用对象完成的注册表操作。