Windows 使用VBScript检查注册表项是否存在
我以为这很容易,但显然没有人这么做。。。 我正在尝试查看是否存在注册表项。我不在乎里面是否有任何值,比如(默认值) 这就是我一直在尝试的Windows 使用VBScript检查注册表项是否存在,windows,vbscript,registry,Windows,Vbscript,Registry,我以为这很容易,但显然没有人这么做。。。 我正在尝试查看是否存在注册表项。我不在乎里面是否有任何值,比如(默认值) 这就是我一直在尝试的 Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv") objRegistry.GetStringValue &H80000003,".DEFAULT\Network","",regValue If IsEmpty(regValue) Then Wscript.E
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_用户\默认\网络是否存在。我在搜索时发现的任何东西似乎都是在讨论如何操作它们,并且基本上假设密钥确实存在,因为它是神奇地创建的,如果它不存在的话。编辑(对不起,我以为你想要VBA)。
每当您试图从注册表读取一个不存在的值时,就会返回一个空值。因此,您所要做的就是检查空值
使用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
我找到了解决办法
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
dim bExists
ssig=“无法打开注册表项”
设置wshShell=Wscript.CreateObject(“Wscript.Shell”)
strKey=“HKEY\U用户\.Default\Software\Microsoft\Windows\CurrentVersion\internetsettings\Digest\”
出错时继续下一步
当前=WshShell.重新研磨(strKey)
如果错误号为0,则
如果right(strKey,1)=“\”则'strKey是一个注册表项
如果指令(1,错误描述,ssig,1)为0,则
bExists=true
其他的
bExists=false
如果结束
else的strKey是注册表值名称
bExists=false
如果结束
清楚
其他的
bExists=true
如果结束
错误转到0
如果bExists=vbFalse,则
wscript.echo strKey&“不存在。”
其他的
wscript.echo strKey&“存在。”
如果结束
看看脚本编写人员!博客:
他们讨论在远程计算机上执行检查,并显示如果从键中读取字符串值,并且如果该值为Null(与空相反),则该键不存在
关于使用“遗憾”方法,如果“KEY”一词指的是保存注册表值的路径(或文件夹),并且如果该键中的叶项被称为“值”,则使用WSHECKE.RADAD(STRKEY)检测密钥存在(相对于值存在性)考虑以下(如在WindowsXP上观察到的):
如果strKey name不是现有注册表路径的名称,则错误描述将显示“注册表项中的根无效”。。。错误号为0x80070002如果strKey指定了一个已存在但不包含尾随“\”的注册表路径,则Regrad方法会将strKey解释为path\value引用,而不是简单的path引用,并返回相同的Err.Number,但带有“无法打开注册表项”的Err.Description。错误消息中的术语“键”似乎表示“值”。这与strKey引用路径存在但该值不存在的路径\值时得到的结果相同。这里的两种方法中的第二种可以满足您的需要。我刚刚使用了它(在这个线程中没有发现成功之后),它对我很有用 守则:
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
避免重磨和错误处理技巧的最简单方法。注册表的可选友好常量:
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个
- 等于零表示密钥存在
- 键名后的斜杠是可选的,不是必需的
- 为了防止其他人遇到这种情况,我以WhoIsRich的例子对其进行了一些修改。在调用ReadReg时,我需要执行以下操作:ReadReg(“应用”、“HKEY\U当前用户\应用\版本”),这样就可以从注册表中读取版本号(如果存在)。我也在使用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
被接受的答案太长,其他答案对我不起作用。我要把这个留着以后用
Dim sKey, bFound
skey = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SecurityHealth"
with CreateObject("WScript.Shell")
on error resume next ' turn off error trapping
sValue = .regread(sKey) ' read attempt
bFound = (err.number = 0) ' test for success
on error goto 0 ' restore error trapping
end with
If bFound Then
MsgBox = "Registry Key Exist."
Else
MsgBox = "Nope, it doesn't exist."
End If
这是注册表树的列表,请根据当前任务选择自己的基础
HKCR = HKEY_CLASSES_ROOT
HKCU = HKEY_CURRENT_USER
HKLM = HKEY_LOCAL_MACHINE
HKUS = HKEY_USERS
HKCC = HKEY_CURRENT_CONFIG
与VBA相反,
On Error Goto{label}
在VBScript上不起作用,但您可以使用On Error Resume Next
并通过err.Number
或err.Description
读取err
对象,但这并不能满足我的需要。我需要知道钥匙是否存在。不是值:数据对。根据默认值“”进行测试就可以了。但是,您提供的在搜索中容易找到的复制/粘贴不会区分该值是否存在、是否为空或是否为null。我需要知道是否只有密钥存在。出于好奇,上面的链接已经死了,我找不到缓存页面;它的副本似乎是,但另一种方式是@mteckt给出的答案,当我检查该页面时,该页面仍然处于活动状态。确实如此。很抱歉,我一定是在短暂停机或其他情况下访问了它。还有一个重要提示:如果使用HKEY\U LOCAL\U MACHINE
作为第一个参数,请在If语句之前设置一个常量,如下所示:Const HKEY\U LOCAL\U MACHINE=&H8000002
@Beems Good point,为了避免混淆,我们添加了常量。有人能解释一下第四个参数吗?谢谢