我正在处理一个脚本,如果没有你的帮助我将无法创建它。
这就是我需要的:我有两个 .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/