2012-03-07 45 views
10

Tôi nghĩ điều này sẽ dễ dàng, nhưng dường như không ai làm điều đó ... Tôi đang cố gắng xem liệu khóa đăng ký có tồn tại hay không. Tôi không quan tâm nếu có bất kỳ giá trị bên trong của nó như (Mặc định).Kiểm tra xem khóa đăng ký có tồn tại không?

Đây là những gì tôi đã cố gắng.

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 

Tôi chỉ muốn biết nếu HKEY_USERES \ .DEFAULT \ .Network tồn tại. Bất cứ điều gì tôi tìm thấy khi tìm kiếm chủ yếu là dường như để thảo luận về thao tác chúng và khá nhiều giả định chìa khóa không tồn tại kể từ khi nó được tạo ra một cách kỳ diệu nếu nó không.

Trả lời

9

Tôi đã tìm ra giải pháp.

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

chỉnh sửa (xin lỗi tôi nghĩ bạn muốn VBA).

Bất cứ khi nào bạn cố gắng đọc một giá trị không tồn tại từ sổ đăng ký, bạn sẽ lấy lại một Null. Vì vậy tất cả những gì bạn phải làm là kiểm tra giá trị Null.

Sử dụng IsNull không 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

Ngược lại với VBA, 'Lỗi trên Goto {label}' không hoạt động trên VBScript, nhưng bạn có thể sử dụng 'On Error Resume Next' và đọc đối tượng' err' bằng 'err.Number' hoặc 'err.Description' – AutomatedChaos

+1

Điều này không nhận được những gì tôi cần. Tôi cần phải biết nếu chìa khóa tồn tại. Không phải cặp Giá trị: Dữ liệu. Thử nghiệm dựa trên giá trị mặc định "" sẽ ổn. Tuy nhiên, bản sao/dán bạn đã cung cấp dễ tìm thấy trong tìm kiếm không phân biệt giá trị tồn tại hay không, trống hoặc không có giá trị. Tôi cần phải biết nếu chỉ có chìa khóa tồn tại. – MTeck

0

Xem Guy tập lệnh! Blog:

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

Họ thảo luận làm việc kiểm tra trên một máy tính từ xa và cho thấy rằng nếu bạn đọc một giá trị chuỗi từ khóa, và nếu giá trị là Null (như trái ngược với trống), chìa khóa không hiện hữu.

Đối với việc sử dụng phương pháp RegRead, nếu cụm từ "khóa" đề cập đến đường dẫn (hoặc thư mục) nơi lưu trữ giá trị đăng ký và nếu các mục lá trong khóa đó được gọi là "giá trị", sử dụng WshShell.RegRead (strKey) để phát hiện sự tồn tại quan trọng (như trái ngược với giá trị tồn tại) xem xét những điều sau (như được quan sát trên Windows XP):

Nếu tên strKey không phải là tên của đường dẫn đăng ký hiện có, Err.Description ghi "Gốc không hợp lệ trong khóa đăng ký "... với số Err.Number là 0x80070002. Nếu strKey đặt tên cho đường dẫn đăng ký tồn tại nhưng không bao gồm dấu "\", phương thức RegRead sẽ giải thích strKey dưới dạng tham chiếu path \ value thay vì tham chiếu đường dẫn đơn giản và trả về cùng một giá trị Err.Number nhưng với một Err.Description của "Không thể mở khóa registry". Thuật ngữ "khóa" trong thông báo lỗi xuất hiện có nghĩa là "giá trị". Đây là kết quả tương tự thu được khi strKey tham chiếu đến đường dẫn \ giá trị mà đường dẫn tồn tại, nhưng giá trị không tồn tại.

7

Cách thứ hai trong hai phương pháp ở đây thực hiện những gì bạn muốn. Tôi đã chỉ sử dụng nó (sau khi tìm thấy không có thành công trong chủ đề này) và nó đã làm việc cho tôi.

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

Mã:

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

Đối với những người tò mò, liên kết ở trên đã chết và tôi không thể tìm thấy trang được lưu trong bộ nhớ cache; một bản sao của nó có vẻ là [ở đây] (http://linsong837.blogspot.com/2013/01/check-if-string-in-registry-exists.html), nhưng cách khác chỉ là câu trả lời được đưa ra bởi @MTeck – Tukaro

+2

Trang đó vẫn hoạt động khi tôi kiểm tra. –

+0

Vì vậy, nó là. Tôi phải quản lý để truy cập nó trong một cúp tạm thời hoặc một cái gì đó, xin lỗi. – Tukaro

4

Cách đơn giản nhất tránh RegRead và xử lý lỗi thủ đoạn.consts thân thiện với tùy chọn cho registry:

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

Sau đó kiểm tra với:

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 

GHI CHÚ QUAN TRỌNG CHO TRÊN:

  • Có 4 thông số được truyền cho EnumKey, không phải là bình thường 3 .
  • Bằng không có nghĩa là khóa EXISTS.
  • Dấu gạch chéo sau tên khóa là tùy chọn và không bắt buộc.
+0

Một lưu ý quan trọng hơn: Nếu sử dụng 'HKEY_LOCAL_MACHINE' làm tham số đầu tiên, hãy đặt hằng số trước câu lệnh IF như sau:' Const HKEY_LOCAL_MACHINE = & H80000002' – Beems

+0

@Beems Điểm tốt, đã thêm các const để tránh nhầm lẫn. – WhoIsRich

1

Trong trường hợp bất kỳ ai khác điều này, tôi lấy ví dụ của WhoIsRich và sửa đổi nó một chút. Khi gọi ReadReg tôi cần phải làm như sau: ReadReg ("App", "HKEY_CURRENT_USER \ App \ Version") mà sau đó sẽ có thể đọc số phiên bản từ sổ đăng ký, nếu nó tồn tại. Tôi cũng đang sử dụng HKCU vì nó không yêu cầu quyền quản trị để ghi vào.

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 
Các vấn đề liên quan