''' ' USAGE: cscript replace.vbs file_to_read regex_search replace_pattern [output_file] [/i ignore case] ' '-------------------------------- ' Luca Zarotti ' Scalebox s.r.l. ' luca.zarotti@scalebox.it '-------------------------------- ''' Set argvs = Wscript.Arguments Dim collectArgs, ignoreCase, params, param_separator collectArgs = "" ignoreCase = False param_separator = vbTab 'esamino gli argomenti per eventuali casistiche particolari (e.g.: case insensitive) For Each strArg in argvs Select Case LCase(strArg) Case "/i" ignoreCase = True Case Else 'grazie VBS, per essere un linguaggio di script senza array dinamici e nemmeno metodi di append collectArgs = collectArgs + strArg + param_separator 'accodo un separatore con il quale ottenere un array ex-novo End Select Next 'splittando la stringa per il separatore, riottengo un array pulito params = Split(Trim(collectArgs), param_separator) 'grazie VBS, grazie Dim fName, searchStr, replaceStr, fNameOutput fName = params(0) 'nome del file da aprire searchStr = params(1) ' regex di ricerca replaceStr = params(2) ' pattern di sostituzione: i gruppi vengono recuperati con $1 $2 ... fNameOutput = params(3) ' file di output, se indicato... If fNameOutput = "" Then '...altrimenti sovrascrivo quello di origine fNameOutput = fName End If Set fileSys = CreateObject("Scripting.FileSystemObject") Set RegexObj = CreateObject("VBScript.RegExp") RegexObj.Global = True 'per ovvie ragioni RegexObj.Multiline = True 'altrimenti rischio di vanificare il senso del caret ^ RegexObj.IgnoreCase = ignoreCase 'ovvero il parametro /i da riga di comando RegexObj.Pattern = searchStr Set fObject = fileSys.OpenTextFile(fName, 1) Dim newContent newContent = RegexObj.Replace(fObject.ReadAll, replaceStr) 'cuore di tutto: dalla regex compilata ottengo il nuovo contenuto fObject.Close() If fNameOutput = fName Then 'in caso il file sia lo stesso Set fObject = fileSys.OpenTextFile(fNameOutput, 2) Else 'in caso di file di output devo riutilizzare un metodo diverso e non un banale parametro, maledetto VB Set fObject = fileSys.CreateTextFile(fNameOutput, 2) End If fObject.Write(newContent) fObject.Close() Wscript.Echo("OK")