0

我正在使用 Windows 脚本托管 (JScript)。我的主要目标是知道注册表项是否存在。我正在尝试“RegRead”此密钥,如果它引发错误,则密钥不存在(这就是文档所说的http://msdn.microsoft.com/en-us/library/x05fawxd(v=vs.84) .aspx)。在 Win7 中一切正常,但是当我在 WinXP 中测试我的代码时它失败了。问题是,当您尝试没有设置默认值的“RegRead”键时,它会抛出错误(仅在 WinXP 上,在 Win7 上没问题)。更恶心的一点是,当你尝试读取不存在的键时,错误号是相等的(错误消息:注册表项“HKEY_CURRENT_USER\Software\NonExistKey\”中的根无效。错误代码:80070002)和没有默认值的现有键(错误消息:无法打开注册表项“HKEY_CURRENT_USER\Software\”进行读取。错误代码:80070002)。是的,错误消息是不同的,但我不想比较消息或使用 indexOf("invalid") 或 indexOf("unable") 来区分一个错误和另一个错误,因为在不同的 Windows 语言环境中会有不同的消息和单词。这是我的示例代码,只需使用此内容制作一个 JS 文件并运行它。

var shell = new ActiveXObject('WScript.Shell');

try{
    var valueKeyExist = shell.RegRead('HKEY_CURRENT_USER\\Software\\');
}catch(e2) {
     WScript.Echo([e2.message, e2.number]);
}

if (e2 !== undefined) {
    try{
        var valueNonExistKey = shell.RegRead('HKEY_CURRENT_USER\\Software\\NonExistKey\\');
    }catch(e1) {
        WScript.Echo([e1.message, e1.number]);
    }

    WScript.Echo('Seems like you are running this script on WinXP and reading reg key with default value not set throws an error.\nError messages are equal: ' + (e1.message == e2.message) + '\nError numbers are equal: ' + (e1.number == e2.number));
} else {
    WScript.Echo('Seems like you are running this script on Win7 and reading reg key with default value not set is ok');
}

有什么建议可以解决这个问题,或者我怎么知道注册表项是否存在?

4

1 回答 1

1

最终我为此使用了 WMI:

function _getRootCode(root) {
    var rootCode = null;
    switch(root){
        case 'HKCR':
        case 'HKEY_CLASSES_ROOT':
            rootCode = 0x80000000;
            break;
        case 'HKCU':
        case 'HKEY_CURRENT_USER':
            rootCode = 0x80000001;
            break;
        case 'HKLM':
        case 'HKEY_LOCAL_MACHINE':
            rootCode = 0x80000002;
            break;
        case 'HKU':
        case 'HKEY_USERS':
            rootCode = 0x80000003;
            break;
        case 'HKCC':
        case 'HKEY_CURRENT_CONFIG':
            rootCode = 0x80000005;
            break;
    }
    return rootCode;
},

function keyExist(root, path) {
    var WMIRegistry = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\default:StdRegProv");
    var keys;
    return WMIRegistry.EnumKey(_getRootCode(root), path, keys) == 0;
}

在 Win7 和 WinXP 上运行良好。

于 2013-09-20T21:44:30.373 回答