2012-03-07 18 views
10

मैंने सोचा कि यह आसान होगा, लेकिन स्पष्ट रूप से कोई भी ऐसा नहीं करता है ... मैं यह देखने का प्रयास कर रहा हूं कि कोई रजिस्ट्री कुंजी मौजूद है या नहीं। मुझे कोई परवाह नहीं है कि इसके अंदर कोई मूल्य है (डिफ़ॉल्ट)।जांचें कि क्या रजिस्ट्री कुंजी मौजूद है

यही वह है जो मैं कोशिश कर रहा हूं।

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 मौजूद है या नहीं। जो कुछ भी मुझे मिलते समय मिलता है, वह उन पर छेड़छाड़ करने पर चर्चा करता है और बहुत अधिक मानता है कि कुंजी मौजूद है क्योंकि यह जादूगर रूप से बनाई गई है, अगर ऐसा नहीं होता है।

उत्तर

9

मुझे समाधान मिला।

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

संपादित करें (क्षमा करें मैंने सोचा था कि आप वीबीए चाहते थे)।

जब भी आप रजिस्ट्री से मौजूद एक गैर-मौजूद मूल्य को पढ़ने का प्रयास करते हैं, तो आप वापस एक नल प्राप्त करते हैं। इस प्रकार आपको केवल एक शून्य मूल्य की जांच करनी है।

IsNullIsEmpty का उपयोग करें।

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

VBA के विपरीत में, 'पर त्रुटि गोटो {लेबल}' VBScript पर काम नहीं करता है, लेकिन आप 'फिर से शुरू Next' उपयोग कर सकते हैं त्रुटि पर और' err.Number' द्वारा 'err' वस्तु बाहर पढ़ने के लिए या 'err.Description' – AutomatedChaos

+1

यह मुझे जो चाहिए वह प्राप्त नहीं करता है। मुझे पता होना चाहिए कि कुंजी मौजूद है या नहीं। मूल्य नहीं: डेटा जोड़ी। डिफ़ॉल्ट मान के खिलाफ परीक्षण "" ठीक होगा। हालांकि, आपके द्वारा प्रदत्त प्रतिलिपि/पेस्ट जो खोज में आसानी से पाई जाती है, वह इस बात का कोई भेद नहीं करती है कि मूल्य मौजूद है या नहीं, खाली है, या शून्य है। मुझे पता होना चाहिए कि क्या कुंजी मौजूद है या नहीं। – MTeck

0

स्क्रिप्टिंग गाय देखें! ब्लॉग:

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

वे एक दूरस्थ कंप्यूटर पर जांच कर रही है और है कि यदि आप कुंजी से एक स्ट्रिंग मान पढ़ा है, और यदि मान रिक्त है (के रूप में खाली के खिलाफ), कुंजी नहीं है दिखाने पर चर्चा मौजूद।

RegRead विधि का उपयोग करने के संबंध में, यदि "कुंजी" शब्द पथ (या फ़ोल्डर) को संदर्भित करता है जहां रजिस्ट्री मान रखा जाता है, और यदि उस कुंजी में पत्ती के आइटम को "मूल्य" कहा जाता है, तो WshShell.RegRead का उपयोग करके (strKey) मुख्य अस्तित्व का पता लगाने के लिए (मूल्य अस्तित्व के विपरीत) निम्नलिखित पर विचार करें (जैसा कि विंडोज एक्सपी पर देखा गया है):

यदि स्ट्रैकी नाम मौजूदा रजिस्ट्री पथ का नाम नहीं है, तो एरर। डिस्क्रिप्शन "अमान्य रूट रजिस्ट्री कुंजी "... 0x80070002 की एक Err.Number के साथ।

यदि स्ट्रैकी एक रजिस्ट्री पथ का नाम है जो मौजूद है लेकिन इसमें पीछे नहीं है "\" RegRead विधि स्ट्रैकी को एक साधारण पथ संदर्भ के बजाय पथ \ मान संदर्भ के रूप में समझने के लिए प्रतीत होता है, और उसी Err.Number देता है लेकिन एक एरर के साथ "रजिस्ट्री कुंजी खोलने में असमर्थ" का विवरण। त्रुटि संदेश में "कुंजी" शब्द का अर्थ "मान" है। यह वही परिणाम प्राप्त होता है जब strKey पथ \ value का संदर्भ देता है जहां पथ मौजूद है, लेकिन मान मौजूद नहीं है।

7

यहां दो विधियों में से दूसरा वह है जो आप चाहते हैं। मैंने अभी इसका इस्तेमाल किया है (इस धागे में कोई सफलता नहीं मिलने के बाद) और यह मेरे लिए काम करता है।

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

उत्सुक के लिए, ऊपर दिया गया लिंक मर चुका है और मुझे कैश किए गए पृष्ठ नहीं मिल रहे हैं; इसकी एक प्रति [यहां] प्रतीत होती है (http://linsong837.blogspot.com/2013/01/check-if-string-in-registry-exists.html), लेकिन दूसरी तरफ केवल उत्तर दिया गया है @MTeck – Tukaro

+2

यह पृष्ठ तब भी रहता है जब मैं इसे जांचता हूं। –

+0

तो यह है। मुझे एक क्षणिक आउटेज या कुछ के दौरान, इसे माफ करना होगा। – Tukaro

4

सबसे आसान तरीका RegRead से बचने और त्रुटि से निपटने के गुर।रजिस्ट्री के लिए वैकल्पिक अनुकूल consts: उपरोक्त के लिए

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 

महत्वपूर्ण टिप्पणियाँ::

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

फिर से जाँच

  • 4 मानकों EnumKey को पारित किया जा रहा है, न कि हमेशा की तरह 3 रहे हैं
  • बराबर शून्य का मतलब मुख्य EXISTS है।
  • कुंजी नाम के बाद स्लैश वैकल्पिक है और आवश्यक नहीं है।
+0

एक और महत्वपूर्ण नोट: यदि पहले पैरामीटर के रूप में 'HKEY_LOCAL_MACHINE' का उपयोग करना है, तो इस तरह के IF कथन से पहले स्थिर सेट करें:' Const HKEY_LOCAL_MACHINE = & H80000002' – Beems

+0

@ बेम्स अच्छा बिंदु, किसी भी भ्रम से बचने के लिए कॉन्स्ट को जोड़ दिया है। – WhoIsRich

1

यदि कोई और इसमें चलता है, तो मैंने WhoIsRich का उदाहरण लिया और इसे थोड़ा सा संशोधित किया। ReadReg को कॉल करते समय मुझे निम्न कार्य करने की आवश्यकता होती है: ReadReg ("App", "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 
संबंधित मुद्दे