2012-03-07 28 views
10

Pensé que esto sería fácil, pero aparentemente nadie lo hace ... Estoy tratando de ver si existe una clave de registro. No me importa si hay algún valor dentro de él, como (Predeterminado).Compruebe si existe la clave de registro

Esto es lo que he estado intentando.

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 

Solo quiero saber si HKEY_USERES \ .DEFAULT \ .Network existe. Todo lo que encuentro al buscar parece tratar sobre manipularlos y casi supone que la clave existe, ya que se crea mágicamente si no lo hace.

Respuesta

9

Encontré la solución.

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 
0

editar (lo siento, pensé que quería VBA).

Cada vez que intente leer un valor inexistente del registro, obtendrá un Nulo. Por lo tanto, todo lo que tienes que hacer es verificar el valor Nulo.

Utilice IsNull no 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 
+0

Al contrario de VBA, 'On Error Goto etiqueta {}' no funciona en VBScript, pero se puede usar 'On Error Resume Next' y leyó el objeto' 'err' por err.Number' o 'err.Description' – AutomatedChaos

+1

Esto no da lo que necesito. Necesito saber si la clave existe. No es el valor: par de datos. Las pruebas en contra del valor predeterminado "" estarían bien. Sin embargo, el copiar/pegar que proporcionó que se encuentra fácilmente en una búsqueda no establece ninguna distinción entre si el valor existe, está vacío o es nulo. Necesito saber si solo existe la clave. – MTeck

0

See the Scripting Guy! Blog:

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

Discuten haciendo la comprobación en un equipo remoto y mostrar que si se lee un valor de cadena de la clave, y si el valor es nulo (en contraposición a vacío), la clave no hace existe.

Con respecto al uso del método RegRead, si el término "clave" hace referencia a la ruta (o carpeta) donde se guardan los valores de registro, y si los elementos de la hoja se llaman "valores", utilizando WshShell.RegRead (strKey) para detectar existencia de clave (en oposición a la existencia de valor) considere lo siguiente (como se observa en Windows XP):

Si strKey name no es el nombre de una ruta de registro existente, Err.Description dice "Invalid root in clave de registro "... con un Número Err.de 0x80070002.

Si strKey nombra una ruta de registro que existe pero no incluye un "seguimiento" posterior, el método RegRead parece interpretar strKey como una referencia de ruta \ valor en lugar de una simple referencia de ruta, y devuelve el mismo Número Err.pero con un Err.Descripción de "No se puede abrir la clave de registro". El término "clave" en el mensaje de error parece significar "valor". Este es el mismo resultado que se obtiene cuando strKey hace referencia a un path \ value donde existe la ruta, pero el valor no existe.

7

El segundo de los dos métodos aquí hace lo que está buscando. Lo acabo de usar (después de no encontrar ningún éxito en este hilo) y me funcionó.

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

El código:

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 
+0

Para los curiosos, el enlace de arriba está muerto y no puedo encontrar una página en caché; una copia parece ser [aquí] (http://linsong837.blogspot.com/2013/01/check-if-string-in-registry-exists.html), pero la otra forma es simplemente la respuesta dada por @MTeck – Tukaro

+2

Esa página aún está activa cuando la reviso. –

+0

Así es. Debo haber logrado visitarlo durante un apagón momentáneo o algo, lo siento. – Tukaro

4

manera más simple evitando RegRead y trucos de manejo de errores.consts amigables opcionales para el registro:

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

y después con:

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 

NOTAS IMPORTANTES PARA ARRIBA:

  • Hay 4 parámetros que se pasan a EnumKey, no el habitual 3
  • Igual a cero significa que la clave EXISTE.
  • La barra oblicua después del nombre de la tecla es opcional y no es necesaria.
+0

Una nota más importante: si se usa 'HKEY_LOCAL_MACHINE' como el primer parámetro, establezca una constante antes de la instrucción IF como esta:' Const HKEY_LOCAL_MACHINE = & H80000002' – Beems

+0

@Beems Buen punto, se han agregado las constelaciones para evitar confusiones. – WhoIsRich

1

En caso de que alguien más se encuentre con esto, tomé el ejemplo de WhoIsRich y lo modifiqué un poco. Cuando llamé a ReadReg, tuve que hacer lo siguiente: ReadReg ("Aplicación", "HKEY_CURRENT_USER \ App \ Version") que luego podría leer el número de versión del registro, si existía. También estoy usando HKCU ya que no requiere privilegios de administrador para escribir.

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 
Cuestiones relacionadas