2012-03-07 20 views
10

Myślałem, że to będzie łatwe, ale najwyraźniej nikt tego nie robi ... Próbuję sprawdzić, czy istnieje klucz rejestru. Nie obchodzi mnie, czy są w nim jakieś wartości, takie jak (domyślne).Sprawdź, czy istnieje klucz rejestru

To jest to, czego próbowałem.

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 

Chcę tylko wiedzieć, czy istnieje HKEY_USERES \ .DEFAULT \ .Network. Wszystko, co znajduję podczas wyszukiwania, wydaje się omawiać manipulowanie nimi i zakłada, że ​​klucz istnieje, ponieważ jest magicznie stworzony, jeśli nie jest.

Odpowiedz

9

Znalazłem rozwiązanie.

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

edytuj (przepraszam, myślałem, że chcesz VBA).

Za każdym razem, gdy spróbujesz odczytać nieistniejącą wartość z rejestru, odzyskasz wartość zerową. Zatem wszystko, co musisz zrobić, to sprawdzić wartość Null.

Użyj IsNull nie 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

W przeciwieństwie do VBA, 'On Error Goto {etykieta}' nie działa w VBScript, ale można użyć 'On Error Resume Next' i odczytać' err' obiektu przez 'err.Number' lub 'err.Description' – AutomatedChaos

+1

To nie dostanie tego, czego potrzebuję. Muszę wiedzieć, czy klucz istnieje. Nie wartość: para danych. Testowanie z domyślną wartością "" byłoby w porządku. Jednak podana kopia/wklej, którą można łatwo znaleźć w wyszukiwaniu, nie rozróżnia, czy wartość istnieje, jest pusta lub ma wartość null. Muszę wiedzieć, czy tylko klucz istnieje. – MTeck

0

Zobacz Skrypciarza! Blog:

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

dyskutują robi kontrolę nad zdalnym komputerem i pokazać, że jeśli czytasz ciąg znaków z klucza, a jeżeli wartość jest zerowa (w przeciwieństwie do pusta), klucz nie robi istnieć.

Jeśli chodzi o użycie metody RegRead, jeśli termin "klucz" odnosi się do ścieżki (lub folderu), w którym przechowywane są wartości rejestru, oraz czy elementy listka w tym kluczu są nazywane "wartościami", używając WshShell.RegRead (strKey) w celu wykrycia kluczowego istnienia (w przeciwieństwie do wartości existing) rozważ następujące (jak zaobserwowano w systemie Windows XP):

Jeśli nazwa strKey nie jest nazwą istniejącej ścieżki do rejestru, Err.Description czyta "Invalid root in klucz rejestru "... z numerem błędu 0x80070002.

Jeśli w parametrze strKey podano ścieżkę rejestru, która istnieje, ale nie zawiera końcowego "\", metoda RegRead wydaje się interpretować strKey jako odwołanie do ścieżki \ wartości, a nie jako zwykłe odwołanie do ścieżki, i zwraca ten sam numer Err. z opcją Err. "Nie można otworzyć klucza rejestru". Termin "klucz" w komunikacie o błędzie wydaje się oznaczać "wartość". Jest to ten sam wynik, który uzyskuje się, gdy strKey odwołuje się do ścieżki \ value, gdzie ścieżka istnieje, ale ta wartość nie istnieje.

7

Druga z dwóch metod tutaj robi to, co chcesz. Właśnie go użyłem (po znalezieniu żadnego sukcesu w tym wątku) i to działało dla mnie.

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

Kod:

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

Dla ciekawskich, powyższy link jest martwy i nie mogę znaleźć strony z pamięci podręcznej; jego kopia wydaje się być [tutaj] (http://linsong837.blogspot.com/2013/01/check-if-string-in-registry-exists.html), ale innym sposobem jest po prostu odpowiedź udzielona przez @MTeck – Tukaro

+2

Ta strona jest nadal dostępna, gdy ją sprawdzam. –

+0

Tak jest. Musiałam go odwiedzić podczas chwilowego wyłączenia lub czegoś podobnego, przepraszam. – Tukaro

4

Najprostszy sposób uniknięcia RegRead i obsługa błędów sztuczki.Opcjonalne przyjazne consts do rejestru:

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

Następnie skontaktować się z:

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 

Ważne uwagi dotyczące powyższego:

  • Istnieją 4 parametry są przekazywane do EnumKey, nie zwykły 3
  • Wartość zero oznacza klucz EXISTS.
  • Ukośnik po nazwie klucza jest opcjonalny i nie jest wymagany.
+0

Jeszcze jedna ważna uwaga: jeśli pierwszym parametrem jest 'HKEY_LOCAL_MACHINE', ustaw stałą przed instrukcją JEŻELI:' Const HKEY_LOCAL_MACHINE = & H80000002' – Beems

+0

@Bemems Dobra uwaga, dodano stałe, aby uniknąć nieporozumień. – WhoIsRich

1

W przypadku, gdy ktoś inny na to wpadnie, wziąłem przykład WhoIsRicha i trochę go zmodyfikowałem. Podczas wywoływania ReadReg, musiałem wykonać następujące czynności: ReadReg ("App", "HKEY_CURRENT_USER \ App \ Version"), które mogłyby następnie odczytać numer wersji z rejestru, jeśli istniał. Używam również HKCU, ponieważ nie wymaga uprawnień administratora do zapisu.

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 
Powiązane problemy