2017-10-11 3 views
0

VBScript가 작동하지만 Regex를 통해 효율성을 높이고 싶습니다. 예를 들어 RTM을 통해 SQL Server의 여러 버전을 찾는 환경에서 : 문자열이없는 경우 "^ 10 *"그 다음은 SQL Server 2008을 작성해야하는 경우 나 스크립트를 싶습니다 Regex with 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 

인식합니다 "^ 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에서 Regex를 통해 줄일 수있는 방법이 있습니까?

답변

1

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 
0

다른 접근 방식 : 선도 숫자 대신 Case (코드)의 사전 (데이터)를 얻을 수 Split 사용 :

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 
0

내 친구가 나에게 도움 : 출력

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 

이 스크립트는 잘 작동합니다.

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