これは簡単だと思いましたが、明らかに誰もそれをしません...レジストリキーが存在するかどうかを確認しようとしています。その中に(デフォルト)などの値があるかどうかは気にしません。
これは私が試してきたことです。
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が存在するかどうかを知りたいだけです。私が検索で見つけたものはほとんどそれらを操作することについて議論しているようであり、キーが存在しない場合は魔法のように作成されるため、キーが存在することをほぼ仮定します。
私は解決策を見つけました。
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つの方法の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
RegReadおよびエラー処理のトリックを回避する最も簡単な方法。レジストリのオプションのフレンドリーなconst:
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
上記の重要事項:
他の誰かがこれに遭遇した場合に備えて、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
Scripting Guy!をご覧ください。ブログ:
レジストリに値が存在するかどうかを確認する方法はありますか?
リモートコンピューターでのチェックについて説明し、キーから文字列値を読み取り、値が(空ではなく)Nullの場合、キーが存在しないことを示します。
RegReadメソッドの使用に関して、「キー」という用語がレジストリ値が保持されるパス(またはフォルダー)を指し、そのキーのリーフアイテムが「値」と呼ばれる場合、WshShell.RegRead(strKey)を使用して(値の存在とは対照的に)キーの存在を検出するには、次のことを考慮してください(Windows XPで観察されます)。
StrKey名が既存のレジストリパスの名前でない場合、Err.Descriptionは「レジストリキーの無効なルート」を読み取り、Err.Numberが0x80070002になります。
StrKeyが存在するレジストリパスの名前に末尾の「\」を含まない場合、RegReadメソッドはstrKeyを単純なパス参照ではなくパス\値参照として解釈し、同じErr.Numberを返しますがErrを返します。 「レジストリキーを開けません」の説明。エラーメッセージの「キー」という用語は、「値」を意味するように見えます。これは、strKeyがパスが存在するパス\値を参照しているが、値が存在しない場合に得られる結果と同じです。
編集(VBAが欲しかったと思います)
レジストリから存在しない値を読み取ろうとすると、Nullが返されます。したがって、Null値を確認するだけです。
IsNull
ではなく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