1

我正在尝试通过迭代 Uninstall 中的子项来匹配 HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall 中的 Java 版本。我正在尝试将正则表达式与 Java 7 Update 40 匹配,但正则表达式匹配所有 DisplayName 条目。下面是代码:

 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。这是我第一次在这里发帖,所以请放轻松...

4

2 回答 2

1

您应该从所有脚本Option ExplicitDim所有变量开始。那么你就不需要 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'

如果您坚持使用全局On Error Resume Next(最危险的错误做法),那么您应该禁用它,直到您的脚本被彻底调试。将 OERN 保存在一个已知即使有最轻微问题的脚本中也会招致灾难。就包含全局 OERN 的代码寻求帮助是徒劳的。因此,在没有 OERN 的情况下运行您的程序,看看其不当行为的原因是否不明显。

诊断输出应尽可能具体。您WScript.Echo "Match"只是表明该语句已执行;aWScript.Echo "Match", disname会好一点。使用 .Execute 并查看 Match 的详细信息可能会更有启发性。

.Pattern 应该更具体。如果您寻找 java 更新,在字符串的开头锚定一个文字“java”,并要求“升级”而不是“\w{6}”可能有助于避免误报。OTOH,我的显示名称看起来不像

Java 7 Update 19

但喜欢

Java(TM) 6 Update 19

谁知道 Java 的下一个所有者会在显示名称中添加什么。

于 2013-10-04T20:23:49.020 回答
0

You seem to have a few typo's

objRedEx.IgnoreCase = True
...
If objRexEx.Test( reDisName ) Then

于 2013-10-04T18:57:11.573 回答