Проверьте, существует ли раздел реестра
Я думал, что это будет легко, но, похоже, никто этого не делает...
Я пытаюсь посмотреть, существует ли раздел реестра. Меня не волнует, есть ли внутри него какие-либо значения, такие как (по умолчанию).
Это то, что я пытался.
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. Все, что я нахожу при поиске в основном, похоже, обсуждает манипулирование ими и в значительной степени предполагает, что ключ существует, поскольку он создан магически, если он этого не делает.
Ответы
Ответ 1
Я нашел решение.
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
Ответ 2
Второй из этих двух способов делает то, что вы хотите. Я только что использовал его (не найдя успеха в этой теме), и это сработало для меня.
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
Ответ 3
Простейший способ избежать ошибок 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
ВАЖНЫЕ ЗАМЕЧАНИЯ ДЛЯ ВЫШЕ:
- В EnumKey передаются 4 параметра, а не обычные 3.
- Одиночный нуль означает ключ EXISTS.
- Слэш после имени ключа является необязательным и не требуется.
Ответ 4
В случае, если кто-то еще сталкивается с этим, я взял пример WhoIsRich и немного изменил его. При вызове ReadReg мне нужно было сделать следующее: ReadReg ( "Приложение", "HKEY_CURRENT_USER\App\Version" ), который затем сможет прочитать номер версии из реестра, если он существует. Я также использую 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
Ответ 5
изменить (извините, я думал, что вы хотите VBA).
В любое время, когда вы пытаетесь прочитать несуществующее значение из реестра, вы возвращаете нуль. Таким образом, все, что вам нужно сделать, это проверить значение Null.
Используйте IsNull
not 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
Ответ 6
Посмотрите на сценариста! Блог:
Как я могу узнать, существует ли ценность в реестре?
Они обсуждают выполнение проверки на удаленном компьютере и показывают, что если вы читаете строковое значение из ключа, и если значение Null (в отличие от Empty), ключ не существует.
Что касается использования метода RegRead, если термин "ключ" относится к пути (или папке), где хранятся значения реестра, и если листовые элементы в этом ключе называются "значениями", использование WshShell.RegRead( strKey), чтобы обнаружить существование ключа (в отличие от значения), рассмотрим следующее (как это наблюдается в Windows XP):
Если имя strKey не является именем существующего пути реестра, Err.Description читает "Недопустимый корень в разделе реестра"... с номером ошибки 0x80070002.
Если strKey называет путь к реестру, который существует, но не содержит завершающий "\" метод RegRead, как представляется, интерпретирует strKey как ссылку на путь\значение, а не как простую ссылку на путь, и возвращает тот же номер Err.Number, но с Err.Description "Не удается открыть раздел реестра". Термин "ключ" в сообщении об ошибке означает "значение". Это тот же результат, полученный, когда strKey ссылается на путь \value, где существует путь, но значение не существует.