我认为这很容易,但显然没有人这样做...... 我正在尝试查看是否存在注册表项。我不在乎里面是否有任何值,如(默认)。
这就是我一直在尝试的。
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是否存在。我在搜索时发现的任何东西似乎都在讨论操纵它们,并且几乎认为密钥确实存在,因为如果没有它就会神奇地创建。
答案 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
上述重要说明:
答案 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引用路径存在的路径\值时获得的结果相同,但该值不存在。