使用VBScript检查是否存在注册表项

时间:2012-03-07 15:27:37

标签: windows vbscript registry

我认为这很容易,但显然没有人这样做...... 我正在尝试查看是否存在注册表项。我不在乎里面是否有任何值,如(默认)。

这就是我一直在尝试的。

Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv")
objRegistry.GetStringValue &H80000003,".DEFAULT\Network","",regValue

If IsEmpty(regValue) Then
    Wscript.Echo "The registry key does not exist."
Else
    Wscript.Echo "The registry key exists."
End If

我只想知道HKEY_USERES \ .DEFAULT \ .Network是否存在。我在搜索时发现的任何东西似乎都在讨论操纵它们,并且几乎认为密钥确实存在,因为如果没有它就会神奇地创建。

6 个答案:

答案 0 :(得分:10)

我找到了解决方案。

dim bExists
ssig="Unable to open registry key"

set wshShell= Wscript.CreateObject("WScript.Shell")
strKey = "HKEY_USERS\.Default\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Digest\"
on error resume next
present = WshShell.RegRead(strKey)
if err.number<>0 then
    if right(strKey,1)="\" then    'strKey is a registry key
        if instr(1,err.description,ssig,1)<>0 then
            bExists=true
        else
            bExists=false
        end if
    else    'strKey is a registry valuename
        bExists=false
    end if
    err.clear
else
    bExists=true
end if
on error goto 0
if bExists=vbFalse then
    wscript.echo strKey & " does not exist."
else
    wscript.echo strKey & " exists."
end if

答案 1 :(得分:8)

这两种方法中的第二种可以满足您的需求。我刚刚使用过它(在这个帖子中找不到成功之后),它对我有用。

http://yorch.org/2011/10/two-ways-to-check-if-a-registry-key-exists-using-vbscript/

代码:

Const HKCR = &H80000000 'HKEY_CLASSES_ROOT
Const HKCU = &H80000001 'HKEY_CURRENT_USER
Const HKLM = &H80000002 'HKEY_LOCAL_MACHINE
Const HKUS = &H80000003 'HKEY_USERS
Const HKCC = &H80000005 'HKEY_CURRENT_CONFIG

Function KeyExists(Key, KeyPath)
    Dim oReg: Set oReg = GetObject("winmgmts:!root/default:StdRegProv")
    If oReg.EnumKey(Key, KeyPath, arrSubKeys) = 0 Then
        KeyExists = True
    Else
        KeyExists = False
   End If
End Function

答案 2 :(得分:5)

避免RegRead和错误处理技巧的最简单方法。注册表的可选友好协议:

Const HKEY_CLASSES_ROOT   = &H80000000
Const HKEY_CURRENT_USER   = &H80000001
Const HKEY_LOCAL_MACHINE  = &H80000002
Const HKEY_USERS          = &H80000003
Const HKEY_CURRENT_CONFIG = &H80000005

然后检查:

Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

If oReg.EnumKey(HKEY_LOCAL_MACHINE, "SYSTEM\Example\Key\", "", "") = 0 Then
  MsgBox "Key Exists"
Else
  MsgBox "Key Not Found"
End If

上述重要说明:

  • 有4个参数传递给EnumKey,而不是通常的3。
  • 等于零表示键EXISTS。
  • 键名后的斜杠是可选的,不是必需的。

答案 3 :(得分:2)

如果有其他人碰到这个,我拿了WhoIsRich的例子并对其进行了一些修改。在调用ReadReg时,我需要执行以下操作:ReadReg(&#34; App&#34;,&#34; HKEY_CURRENT_USER \ App \ Version&#34;)然后可以从注册表中读取版本号,如果它存在。我也在使用HKCU,因为它不需要管理员权限来写入。

Function ReadReg(RegKey, RegPath)
      Const HKEY_CURRENT_USER = &H80000001
      Dim objRegistry, oReg
      Set objRegistry = CreateObject("Wscript.shell")
      Set oReg = GetObject("winmgmts:!root\default:StdRegProv")

      if oReg.EnumKey(HKEY_CURRENT_USER, RegKey) = 0 Then
        ReadReg = objRegistry.RegRead(RegPath)
      else
        ReadReg = ""
      end if
End Function

答案 4 :(得分:0)

编辑(抱歉,我以为你想要VBA)。

每当您尝试从注册表中读取不存在的值时,您都会返回Null。因此,您所要做的就是检查Null值。

使用IsNull而非IsEmpty

Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & _ 
    strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
strValueName = "Test Value"
objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

If IsNull(strValue) Then
    Wscript.Echo "The registry key does not exist."
Else
    Wscript.Echo "The registry key exists."
End If

答案 5 :(得分:0)

请参阅脚本专家!博客:

How Can I Tell Whether a Value Exists in the Registry?

他们讨论在远程计算机上进行检查,并显示如果从键中读取字符串值,并且如果值为Null(而不是Empty),则该键不存在。

关于使用RegRead方法,如果术语“key”指的是保留注册表值的路径(或文件夹),并且该键中的叶子项称为“values”,则使用WshShell.RegRead( strKey)检测密钥存在(与存在值相反)考虑以下(在Windows XP上观察到):

如果strKey名称不是现有注册表路径的名称,则Err.Description将读取“注册表项中的无效根目录”... Err.Number为0x80070002。

如果strKey命名存在但不包含尾随“\”的注册表路径,则RegRead方法似乎将strKey解释为路径\值引用而不是简单的路径引用,并返回相同的Err.Number但是Err.Description“无法打开注册表项”。错误消息中的术语“密钥”似乎表示“值”。这与strKey引用路径存在的路径\值时获得的结果相同,但该值不存在。

相关问题