Java VBScript:正则表达式与不正确的注册表值匹配时出错
我试图通过迭代卸载中的子项来匹配HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall中的Java版本。我试图将正则表达式与Java7Update40相匹配,但正则表达式与所有DisplayName条目相匹配。代码如下:Java VBScript:正则表达式与不正确的注册表值匹配时出错,java,regex,vbscript,registry,Java,Regex,Vbscript,Registry,我试图通过迭代卸载中的子项来匹配HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall中的Java版本。我试图将正则表达式与Java7Update40相匹配,但正则表达式与所有DisplayName条目相匹配。代码如下: On Error Resume Next Const HKEY_LOCAL_MACHINE = &H80000002 Dim oReg Dim objShell Set
On Error Resume Next
Const HKEY_LOCAL_MACHINE = &H80000002
Dim oReg
Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")
Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\.\root\default:StdRegProv")
Dim sPath, aSub, sKey
Set objRegEx = New RegExp
objRegEx.Pattern = "\w{4}\s\d{1}\s\w{6}\s\d+"
objRedEx.IgnoreCase = True
objRegEx.Global = False
sPath = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKEY_LOCAL_MACHINE, sPath, aSub
For Each sKey In aSub
disName = "HKLM" & "\" & sPath & "\" & sKey & "\DisplayName"
unString = "HKLM" & "\" & sPath & "\" & sKey & "\UninstallString"
reDisName = objShell.RegRead(disName)
reUnString = objShell.RegRead(unString)
'Wscript.echo(reDisName)
If objRexEx.Test( reDisName ) Then
Wscript.echo "Match"
End If
'Wscript.echo ObjShell.RegRead(disName)
'Wscript.echo ObjShell.RegRead(unString)
Next
很抱歉,如果格式设置已关闭,我会在每个代码行前面放置一个ctrl-k。这是我第一次在这里发帖,所以请放轻松…您似乎有一些打字错误 objRe
d
Ex.IgnoreCase=True…
如果objRe
x
Ex.Test(reDisName),那么您似乎有一些打字错误
objRed
Ex.IgnoreCase=True…
如果objRe
x
Ex.Test(reDisName),则应使用选项Explicit
和Dim
启动所有脚本。那么你就不需要sln的鹰眼来发现你的打字错误了:
Option Explicit
Dim objRegEx : Set objRegEx = New RegExp
objRegEx.Pattern = "\w{4}\s\d{1}\s\w{6}\s\d+"
objRedEx.IgnoreCase = True
输出:
cscript 19188400.vbs
...\19188400.vbs(4, 1) Microsoft VBScript runtime error: Variable is undefined: 'objRedEx'
如果您坚持在错误恢复下一步使用全局(最危险的错误实践),那么您应该禁用它,直到您的脚本被彻底调试。将OERN保存在一个已知存在哪怕是最轻微问题的脚本中是一件非常麻烦的事情。请求对包含全局OERN的代码的帮助是徒劳的。因此,在不使用OERN的情况下运行程序,并查看其错误行为的原因是否不明显
诊断输出应尽可能具体。您的WScript.Echo“Match”
仅显示语句已执行;一个WScript.Echo“匹配”,disname
会更好一些。使用.Execute并查看比赛细节可能会更具启发性
.Pattern应该更特定于。如果您查找java更新,在字符串开头锚定一个文本“java”,并请求“upgrade”而不是“\w{6}”,可能有助于避免误报。OTOH,我的显示名称看起来不像
Java 7 Update 19
但就像
Java(TM) 6 Update 19
谁知道Java的下一个所有者将在显示名中输入什么呢。您应该使用选项Explicit
和Dim
启动所有脚本。那么你就不需要sln的鹰眼来发现你的打字错误了:
Option Explicit
Dim objRegEx : Set objRegEx = New RegExp
objRegEx.Pattern = "\w{4}\s\d{1}\s\w{6}\s\d+"
objRedEx.IgnoreCase = True
输出:
cscript 19188400.vbs
...\19188400.vbs(4, 1) Microsoft VBScript runtime error: Variable is undefined: 'objRedEx'
如果您坚持在错误恢复下一步使用全局(最危险的错误实践),那么您应该禁用它,直到您的脚本被彻底调试。将OERN保存在一个已知存在哪怕是最轻微问题的脚本中是一件非常麻烦的事情。请求对包含全局OERN的代码的帮助是徒劳的。因此,在不使用OERN的情况下运行程序,并查看其错误行为的原因是否不明显
诊断输出应尽可能具体。您的WScript.Echo“Match”
仅显示语句已执行;一个WScript.Echo“匹配”,disname
会更好一些。使用.Execute并查看比赛细节可能会更具启发性
.Pattern应该更特定于。如果您查找java更新,在字符串开头锚定一个文本“java”,并请求“upgrade”而不是“\w{6}”,可能有助于避免误报。OTOH,我的显示名称看起来不像
Java 7 Update 19
但就像
Java(TM) 6 Update 19
谁知道Java的下一个所有者将在显示名中输入什么。您可以将每行缩进5个空格,形成一个代码块。请看,您可以将每行缩进5个空格,形成一个代码块。看看是否把RedEx改成了Regex,还是一样的问题。此外,当迭代reg值时,似乎会多次打印某些值,但仍与预期值不匹配。我的正则表达式应该与“Java7Update40”匹配,我已经测试过了,它在测试脚本中也能工作。我不知所措……如果把RedEx改成Regex,那还是一样的问题。此外,当迭代reg值时,似乎会多次打印某些值,但仍与预期值不匹配。我的正则表达式应该与“Java7Update40”匹配,我已经测试过了,它在测试脚本中也能工作。我无言以对……谢谢你的建议。我是windows编码的新手,前几天刚开始学习。我更习惯于在linux上使用python,而全局“下一步错误恢复”被意外地留在了那里。在终端窗口中使用cscript运行它之前,我使用IDE执行它,突然出现的Wscript.echo错误让我发疯。再次感谢您的帮助。我敢打赌,那个Java(主要)更新次要版本会咬我的屁股。这将在一个有几百台机器的域上运行。所有windows 7。我现在让它工作,它匹配正确,并返回正确的卸载字符串。我唯一担心的正是您在文章中指出的java可能是注册表中DisplayName中的java(TM)。这就是我在大约15年前选择linux的原因。登记处。我用VBScript学习了很多东西,而且做起来很有趣。这真的让我比以前更加尊重办公室里的windows员工。谢谢你的建议。我是windows编码的新手,前几天刚开始学习。我更习惯于在linux上使用python,而全局“下一步错误恢复”被意外地留在了那里。在终端窗口中使用cscript运行它之前,我使用IDE执行它,突然出现的Wscript.echo错误让我发疯。再次感谢您的帮助。我敢打赌,那个Java(主要)更新次要版本会咬我的屁股。这将在一个有几百台机器的域上运行。所有windows 7。我现在让它工作,它匹配正确,并返回正确的卸载字符串。我唯一担心的正是您在文章中指出的java可能是注册表中DisplayName中的java(TM)。这就是我在大约15年前选择linux的原因。登记处。我用VBScript学习了很多东西,而且做起来很有趣。这真的让我在办公室里比以前更加尊重windows员工。