遍历注册表项
Iterate over registry keys
我已经知道如何使用 RegRead:
读取注册表值
var WshShell = W.CreateObject("WScript.Shell");
var val = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Audio\EnableCaptureMonitor");
WScript.Echo(val);
现在我想遍历某些注册表路径中的所有键。有什么想法吗?
我能想到几个方法。第一个(也是最简单的,IMO)是使用 reg.exe
命令行实用程序(自 Windows XP 起可用)为您完成脏活。这是一个查询 HKEY_LOCAL_MACHINE\Software
:
的所有子键的示例
var objShell = new ActiveXObject("WScript.Shell");
var objExec = objShell.Exec("REG QUERY HKLM\SOFTWARE");
var strKeys = objExec.StdOut.ReadAll();
var a = strKeys.split("\n");
for (var i = 0; i < a.length; ++i) {
WScript.Echo(a[i]);
}
请注意,该实用程序似乎 return 在输出的开头和结尾添加一个额外的换行符,因此请准备好过滤数组中的几个空白条目。
第二种方法使用WMI的StdRegProv
class。从 JScript(与 VBScript 相比)使用有点麻烦,但这是可能的。这是一个显示如何迭代相同子项的示例:
// Constant for HKEY_LOCAL_MACHINE...
var HKLM = 0x80000002;
// Get an instance of the StdRegProv class...
var objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default");
var objReg = objService.Get("StdRegProv");
// Prepare the EnumKey method...
var objMethod = objReg.Methods_.Item("EnumKey");
var objParamsIn = objMethod.InParameters.SpawnInstance_();
objParamsIn.hDefKey = HKLM;
objParamsIn.sSubKeyName = "Software";
// Execute the method and collect the output...
var objParamsOut = objReg.ExecMethod_(objMethod.Name, objParamsIn);
// If successful, iterate the subkeys...
if (objParamsOut.ReturnValue === 0) {
if (objParamsOut.sNames != null) {
var a = objParamsOut.sNames.toArray();
for (var i = 0; i < a.length; ++i) {
WScript.Echo(a[i]);
}
}
}
我已经知道如何使用 RegRead:
读取注册表值var WshShell = W.CreateObject("WScript.Shell");
var val = WshShell.RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Audio\EnableCaptureMonitor");
WScript.Echo(val);
现在我想遍历某些注册表路径中的所有键。有什么想法吗?
我能想到几个方法。第一个(也是最简单的,IMO)是使用 reg.exe
命令行实用程序(自 Windows XP 起可用)为您完成脏活。这是一个查询 HKEY_LOCAL_MACHINE\Software
:
var objShell = new ActiveXObject("WScript.Shell");
var objExec = objShell.Exec("REG QUERY HKLM\SOFTWARE");
var strKeys = objExec.StdOut.ReadAll();
var a = strKeys.split("\n");
for (var i = 0; i < a.length; ++i) {
WScript.Echo(a[i]);
}
请注意,该实用程序似乎 return 在输出的开头和结尾添加一个额外的换行符,因此请准备好过滤数组中的几个空白条目。
第二种方法使用WMI的StdRegProv
class。从 JScript(与 VBScript 相比)使用有点麻烦,但这是可能的。这是一个显示如何迭代相同子项的示例:
// Constant for HKEY_LOCAL_MACHINE...
var HKLM = 0x80000002;
// Get an instance of the StdRegProv class...
var objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default");
var objReg = objService.Get("StdRegProv");
// Prepare the EnumKey method...
var objMethod = objReg.Methods_.Item("EnumKey");
var objParamsIn = objMethod.InParameters.SpawnInstance_();
objParamsIn.hDefKey = HKLM;
objParamsIn.sSubKeyName = "Software";
// Execute the method and collect the output...
var objParamsOut = objReg.ExecMethod_(objMethod.Name, objParamsIn);
// If successful, iterate the subkeys...
if (objParamsOut.ReturnValue === 0) {
if (objParamsOut.sNames != null) {
var a = objParamsOut.sNames.toArray();
for (var i = 0; i < a.length; ++i) {
WScript.Echo(a[i]);
}
}
}