正则表达式与If在VBScript中查找并写入结果
问题描述:
我有一个VBScript正在工作,但我想通过正则表达式提高效率,例如,在一个环境中,我通过RTM查找多个SQL Server版本:正则表达式与If在VBScript中查找并写入结果
10.5.1720.0 SQL Server 2008 R2 CU2 10.5.1702.0 SQL Server 2008 R2 CU1 9.00.4305 SQL Server 2005 SP3 CU10 9.00.4294 SQL Server 2005 SP3 CU9 8.00.2039 SQL Server 2000 SP4 8.00.760 SQL Server 2000 SP3
我想剧本承认如果字符串为“^ 10 *”然后,它应该如果不写的SQL Server 2008“^ 9 *”写的SQL Server 2005等
所以这里是我的脚本:
Dim mts, objShell, PV
Set objShell = CreateObject("WScript.Shell")
Set ArgObj = WScript.Arguments
PV = "$(PV)"
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Global = True
regEx.MultiLine = True
regEx.Pattern = "^10\.*"
If PV = "7.0.623" Then
WScript.Echo "7.0"
ElseIf PV = "7.0.699" Then
WScript.Echo "7.0"
ElseIf PV = "7.0.842" Then
WScript.Echo "7.0"
ElseIf PV = "7.0.961" Then
WScript.Echo "7.0"
ElseIf PV = "7.0.1063" Then
WScript.Echo "7.0"
ElseIf PV = "8.0.194" Then
WScript.Echo "2000"
ElseIf PV = "8.0.384" Then
WScript.Echo "2000"
ElseIf PV = "8.0.532" Then
WScript.Echo "2000"
ElseIf PV = "8.0.760" Then
WScript.Echo "2000"
ElseIf PV = "8.0.2039" Then
WScript.Echo "2000"
ElseIf PV = "13.1.4001.0" Then
WScript.Echo "2016"
Else
WScript.Echo "DTP"
End If
有什么办法可以通过VB中的正则表达式来减少?
答
我建议结合正则表达式与Select Case
声明。
Set re = New RegExp
re.Pattern = "^(\d+)\."
For Each m In re.Execute(PV)
Select Case m.Submatches(0)
Case "7" : version = "7.0"
Case "8" : version = "2000"
Case "9" : version = "2005"
Case "10" : version = "2008"
Case "13" : version = "2016"
Case Else : version = "DTP"
End Select
Next
WScript.Echo version
答
不同的方法:使用Split
获得领先的数量和替代Case
(代码)的字典(数据):
Option Explicit
Function makeDict(sK, sV)
Dim d : Set d = CreateObject("Scripting.Dictionary")
Dim aK : aK = Split(sK)
Dim aV : aV = Split(sV)
Dim i
For i = 0 To UBound(aK)
d(aK(i)) = aV(i)
Next
d(Null) = aV(i)
Set makeDict = d
End Function
Dim d : Set d = makeDict("10 7", "2008 7.0 DTP")
Dim ts : Set ts = CreateObject("Scripting.FileSystemObject").OpenTextFile("data.txt")
Do Until ts.AtEndOfStream
Dim s : s = ts.ReadLine()
Dim k : k = Split(s, ".")(0)
Dim r
If d.Exists(k) Then
r = d(k)
Else
r = d(Null)
End If
WScript.Echo s, "=>", r
Loop
ts.Close
输出:
cscript 46691612-2.vbs
10.5.1720.0 SQL Server 2008 R2 CU2 => 2008
10.5.1702.0 SQL Server 2008 R2 CU1 => 2008
9.00.4305 SQL Server 2005 SP3 CU10 => DTP
9.00.4294 SQL Server 2005 SP3 CU9 => DTP
8.00.2039 SQL Server 2000 SP4 => DTP
8.00.760 SQL Server 2000 SP3 => DTP
7.00.760 SQL Server sieben => 7.0
答
我的朋友帮我并使这个脚本运行良好:
Dim mts, objShell, Version
set objShell = CreateObject("Wscript.Shell")
Set ArgObj = WScript.Arguments
Version ="$(Version)"
erro="DTP"
a=Split(Version,".")
IF uBound(a) > 0 Then
VersionInt = CInt(a(0))
saida=""
IF VersionInt = 7 or VersionInt = 6 Then
saida = VersionInt
End If
IF VersionInt = 8 Then
saida = "2000"
End If
IF VersionInt = 9 Then
saida = "2005"
End If
IF VersionInt = 10 Then
saida = "2008"
IF uBound(a) > 1 Then
ReleaseVersionInt = CInt(a(1))
If ReleaseVersionInt > 49 then
saida = "2008 R2"
End If
End If
End If
IF VersionInt = 11 Then
saida = "2012"
End If
IF VersionInt = 12 Then
saida = "2014"
End If
IF VersionInt = 13 Then
saida = "2016"
End If
IF VersionInt = 14 Then
saida = "2017"
End If
If saida="" Then
Wscript.echo erro
else
Wscript.echo saida
End IF
Else
Wscript.echo erro
End IF