regex - 使用 VBS 替换两个文件之间的变量值

标签 regex variables vbscript replace

我正在处理一个脚本,如果没有你的帮助我将无法创建它。 这就是我需要的:我有两个 .txt 文件,其中一个包含变量(在两个 @ 之间),如下所示:

@PickupFolder@=E:/SonicDataFiles/AR_INT/GPP_VE/IN           
@Db1Url@=jdbc:sonic:sqlserver://CARASETMS:1433;databaseName=CRM

另一个.txt包含需要从前一个文件完成的变量

@Db1Url@=
@Db1Pwd@=

我需要获取第一个文件中的每个变量(我想我必须使用正则表达式),并在变量存在时替换第二个文件中的值。

如果有人有类似的脚本来获得想法,我将非常感激。我正在尝试用 VBS 来实现。

非常感谢。

杰拉尔多。
阿根廷布宜诺斯艾利斯。

这是我原来的脚本:

            'ReplaceScript "c:\Variables_INT.txt" "C:\AR_INT.tailoring.properties"

            'DEFINE CONSTANTS
            Const ForReading = 1
            Const ForWriting = 2
            Const ForAppending = 8

            'DEFINE VARIABLES
            strTxtFile = Wscript.Arguments(0)
            strTailoringFile = Wscript.Arguments(1)
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            Set WshShl = WScript.CreateObject("WScript.Shell")
            Set objFileVariablesTXT = objFSO.OpenTextFile (strTxtFile, ForReading)                      'Variables_INT.txt
            Set objFileTailoring = objFSO.OpenTextFile (strTailoringFile, ForReading)                   'AR_INT.tailoring.properties
            Dim strQuartz, strPickupfFolder, strUrl, strDbPwd, strDbUser, strDbDestTable

            strSearchString = objFileVariablesTXT.ReadAll
            'SEARCH THE FILE FOR THE NEEDED DATA
                vQuartz = InStr(strSearchString, "@QuartzJars@=")
                vPickupFolder = InStr(strSearchString, "@PickupFolder@=")
                vDbUrl = InStr(strSearchString, "@Db1Url@=")
                vDbPwd = InStr(strSearchString, "@Db1Pwd@=")
                vDbUser = InStr(strSearchString, "@Db1User@=")
                vDbDestTable = InStr(strSearchString, "@DestinationTable@=")

            'PARSE OUT THE NEEDED INFO
                If vQuartz <> 0 Then
                    'vQuartz = vQuartz + 13
                    strQuartz = Mid(strSearchString, vQuartz, 304)
                        ' WScript.Echo strQuartz
               End If 
               If vPickupFolder <> 0 Then
                    'vPickupFolder = vPickupFolder + 15
                    strPickupfFolder = Mid(strSearchString, vPickupFolder, 50)
                     '    WScript.Echo strPickupfFolder
               End If 
               If vDbUrl <> 0 Then
                    'vDbUrl = vDbUrl + 9
                    strUrl = Mid(strSearchString, vDbUrl, 65)
                       '  WScript.Echo strUrl
               End If 
               If vDbPwd <> 0 Then
                    'vDbPwd = vDbPwd + 9
                    strDbPwd = Mid(strSearchString, vDbPwd, 17)
                         'WScript.Echo strDbPwd
               End If 
               If vDbUser <> 0 Then
                    'vDbUser = vDbUser + 10
                    strDbUser = Mid(strSearchString, vDbUser, 25)
                         'WScript.Echo strDbUser
               End If 
               If vDbDestTable <> 0 Then
                    'vDbDestTable = vDbDestTable + 19
                    strDbDestTable = Mid(strSearchString, vDbDestTable, 29)
                         'WScript.Echo strDbDestTable
               End If 

            objFileVariablesTXT.Close


            strReplaceString = objFileTailoring.ReadAll


            arrReplacements = Array("@QuartzJars@=Ç" & strQuartz , "@PickupFolder@=Ç" & strPickupfFolder, "@Db1Url@=Ç" & strUrl, "@Db1Pwd@=Ç" & strDbPwd, "@Db1User@=Ç" &strDbUser, "@DestinationTable@=Ç" & strDbDestTable)

            objFileTailoring.Close

            Set objFileTailoring = Nothing

            For Each strReplacement In arrReplacements
                    strReplaceWhat = Split(strReplacement, "Ç")(0)
                    'WScript.Echo strReplaceWhat
                    strReplaceWith = Split(strReplacement, "Ç")(1)
                    'WScript.Echo strReplaceWith
                    strReplaceString = Replace(strReplaceString, strReplaceWhat, strReplaceWith)
            Next
            'wScript.Echo strReplaceString

            Set objFileTailoring = objFSO.OpenTextFile(strTailoringFile, 2, true)
            objFileTailoring.Write strReplaceString

            objFileTailoring.Close

最佳答案

快速而肮脏:

  Dim sFSpec1 : sFSpec1    = "..\data\frs.txt"
  Dim sFSpec2 : sFSpec2    = "..\data\sec.txt"
  Dim dicRpl  : Set dicRpl = CreateObject( "Scripting.Dictionary" )
  Dim reCut   : Set reCut  = New RegExp
  reCut.Global  = True
  reCut.Pattern = "(@[^@]+@)\s*=\s*(.*?)\s*$"
  Dim sAll    : sAll       = goFS.OpenTextFile( sFSpec1 ).ReadAll
  WScript.Echo sAll
  WScript.Echo "---------------"
  Dim oMTS    : Set oMTS   = reCut.Execute( sAll )
  Dim oMT
  For Each oMT In oMTS
      dicRpl( oMT.SubMatches( 0 ) ) = oMT.SubMatches( 1 )
  Next
  sAll = goFS.OpenTextFile( sFSpec2 ).ReadAll
  WScript.Echo sAll
  WScript.Echo "---------------"
  Dim sKey
  For Each sKey In dicRpl.Keys
      sAll = Replace( sAll, sKey, dicRpl( sKey ) )
  Next
  WScript.Echo sAll

输出:

@PickupFolder@=E:/SonicDataFiles/AR_INT/GPP_VE/IN
@Db1Url@=jdbc:sonic:sqlserver://CARASETMS:1433;databaseName=CRM

---------------
@Db1Url@=
@Db1Pwd@=

---------------
jdbc:sonic:sqlserver://CARASETMS:1433;databaseName=CRM=
@Db1Pwd@=

如果原则上可以解决您的问题,我们就可以确定细节。

添加:

Jean-François Corbett 肯定是对的,请使用该模式

reCut.Pattern = "(@[^@]+@=)(.*?)\s*$"

以及最终的替换

sAll = Replace( sAll, sKey, sKey & dicRpl( sKey ) )

此版本假定两个文件均采用严格的 @x@=[y] 格式。

关于regex - 使用 VBS 替换两个文件之间的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7027746/

相关文章:

xml - 使用 MSXML 以 UTF-8 格式保存 XML

vbscript - 我如何通过 vbscript 将 CDO 与 Exchange 一起使用

vbscript - 在 VbScript 中绕过 UAC

ios - 检查邮政编码是否在范围内

具有不同忽略字符的正则表达式掩码

PHP变量和MySQL查询

python - 将超过 255 个参数传递给函数

regex - 用于密码验证的正则表达式

java - 正则表达式正在获取其他单词

php - 使用 php 变量显示图像