' ---------------------------------------------------------- ' Script VBS de remplacement d'une chaine de caractères ' dans un ensemble de fichiers texte ' ' Syntaxe: ' replace -a -n -f [-b] [-c] [-s] [-r] ' Paramètres obligatoires : ' : chaine à remplacer ' : nouvelle chaine ' : nom du fichier, avec ou sans chemin. ' peut comporter les caractères génériques * et ? ' On peut remplacer un caractère dans les chaines par sa valeur hexadécimale ' sous la forme \xnn ' Par exemple le guillemet : \x22 ' ' Paramètres facultatifs : ' : : extension des fichiers de sauvegarde (par défaut ".bak") ' (le "." initial est facultatif) ' si ce commutateur est omis, il n'y a pas de backup ' -c : remplacement sensible à la casse ' dans ce cas, on distingue majuscules et minuscules ' -s : exploration des sous-répertoires requise ' -r : les chaines sont interprétées comme des expressions régulières ' ' ' JC BELLAMY © 2002 ' ---------------------------------------------------------- Dim shell, args, fso Set shell = WScript.CreateObject("WScript.Shell") Set fso = WScript.CreateObject("Scripting.FileSystemObject") Set args = Wscript.Arguments ForReading=1 ForWriting=2 nbargs=args.count defmoteur="cscript" If nbargs=0 or testarg("?") or testarg("h") Then Syntaxe "" ' Test du moteur utilisé TestHost true If not testarg("a") then Syntaxe "Ancienne chaine absente" If not testarg("n") then Syntaxe "Nouvelle chaine absente" If not testarg("f") then Syntaxe "Nom de fichier absent" OldStr=ReplaceSpecialChars(getarg("a")) NewStr=ReplaceSpecialChars(getarg("n")) If OldStr=NewStr Then Syntaxe "La nouvelle chaine est identique à l'ancienne" File=getarg("f") SubDir=testarg("s") Casse=testarg("c") If Casse Then ParamCasse=vbBinaryCompare else ParamCasse=vbTextCompare Regul=testarg("r") Backup=testarg("b") extBak="bak" If backup Then extBak=getarg("b") If left(extbak,1)<>"." Then extbak="." & extbak WildCards=false If InStr(File,"*")>0 or InStr(File,"?")>0 Then WildCards=true ps=InstrRev(file,"\") If ps=0 Then file=fso.GetAbsolutePathName(file) ps=InstrRev(file,"\") end if If not WildCards and not fso.FileExists(file) Then Syntaxe "Fichier " & File & " inexistant" dossier=left(file,ps-1) fichier=mid(file,ps+1) nfic=0 explore dossier,fichier wscript.echo VBCRLF & FormatStr(nfic,4) & " fichier(s) modifié(s)" Wscript.quit ' ------------------------------------- Sub explore(dossier,fichier) dim curfile,collfd,collf,d,file2,name,dir curfile=dossier & "\" & fichier file2=Replace(curfile,"\", "\\") file2=Replace(file2,".","\.") file2=Replace(file2,"?",".") file2=Replace(file2,"$","\$") file2=Replace(file2,"+","\+") file2=Replace(file2,"*",".*") & "$" set d=fso.GetFolder(dossier) set collf=d.Files For each fic in collf name=fic.Path If RegExptest(file2,name) Then Modif name Next If SubDir Then set colld=d.SubFolders For each dir in colld name=dir.Path explore name,fichier Next End If End Sub '-------------------------------------------------------------------- Function RegExpTest(patrn, strng) RegExptest=false Dim regEx, Match, Matches Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = True regEx.Global = false Set Matches = regEx.Execute(strng) If matches.count>0 Then RegExptest=true End Function '-------------------------------------------------------------------- Sub Modif(Fichier) ' On ne traite pas les fichiers de backup p=InstrRev(Fichier,".") If p>0 Then extension=mid(Fichier,p) If strcomp(extension,extbak,vbTextCompare)=0 Then exit sub End If dim fs,fd FicBak=Fichier & extbak fso.CopyFile Fichier, FicBak, true set fs=fso.getfile(Fichier) characters=fs.size nfic=nfic+1 wscript.echo FormatStr(nfic,4) & " - " & Fichier set fs=fso.OpenTextFile(FicBak,ForReading) set fd=fso.CreateTextFile(Fichier,ForWriting) oldline=fs.Read(characters) If Regul Then newline=RegExpReplace(oldline,OldStr,NewStr,Casse) Else newline=Replace(oldline,OldStr,NewStr,1,-1,ParamCasse) end if fd.Write newline fd.Close fs.Close If not Backup Then fso.DeleteFile FicBak,true End Sub '-------------------------------------------------------------------- Function RegExpReplace(Source,patrn,replStr,Casse) Dim regEx Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = not Casse RegExpReplace=regEx.Replace(Source,replStr) End Function '-------------------------------------------------------------------- ' Fonction destinée à remplacer les caractères codés en hexa ("\x..") Function ReplaceSpecialChars(ch) For i = 32 To 255 newc=chr(i) oldc="\x"+Hex(i) ch=Replace(ch, oldc, newc,1,-1,vbTextCompare) Next ReplaceSpecialChars=ch End Function '-------------------------------------------------------------------- Function FormatStr(ch,lmax) l=len(ch) If l"cscript" then If force then Init="Ce script doit être lancé avec CSCRIPT" Else Init="Il est préférable de lancer ce script avec CSCRIPT" End If rep=MsgBox(Init & VBCRLF & _ "Cela peut être rendu permanent avec la commande" & VBCRLF & _ "cscript //H:CScript //S /Nologo" & VBCRLF & _ "Voulez-vous que ce soit fait automatiquement?", _ vbYesNo + vbQuestion,strappli) if rep=vbYes then nomcmd="setscript.bat" Set ficcmd = fso.CreateTextFile(nomcmd) ficcmd.writeline "@echo off" ficcmd.writeline "cscript //H:CScript //S /Nologo" ficcmd.writeline "pause" params="" For i = 0 To nbargs-1 params=params & " " & args(i) next ficcmd.writeline chr(34) & strappli & chr(34) & params ficcmd.writeline "pause" ficcmd.close shell.Run nomcmd, SW_SHOWNORMAL,true force=true end if If force then WScript.Quit end if end sub ' ------------------------------------- Sub Syntaxe(info) If info="" Then msg= "Script de remplacement d'une chaine de caractères" & VBCRLF msg=msg & "dans un ensemble de fichiers texte" & VBCRLF msg=msg & "JC BELLAMY © 2002" & VBCRLF Else msg="*** " & info & " ***" & VBCRLF End If msg=msg & "------------------------------------------" & VBCRLF msg=msg & "Syntaxe : " & VBCRLF msg=msg & " replace -a -n -f [-b] [-s]" & VBCRLF msg=msg & " replace /a /n /f [/b] [/s]" & VBCRLF msg=msg & "Paramètres obligatoires :" & VBCRLF msg=msg & " : chaine à remplacer" & VBCRLF msg=msg & " : nouvelle chaine" & VBCRLF msg=msg & " : nom du fichier, avec ou sans chemin" & VBCRLF msg=msg & " peut comporter les caractères génériques * et ?" & VBCRLF msg=msg & " On peut remplacer un caractère dans les chaines par sa valeur" & VBCRLF msg=msg & " hexadécimale sous la forme \xnn" & VBCRLF msg=msg & " Par exemple le guillemet "" : \x22" & VBCRLF msg=msg & "Paramètres facultatifs :" & VBCRLF msg=msg & " : : extension des fichiers de sauvegarde (par défaut "".bak"")" & VBCRLF msg=msg & " (le ""."" initial est facultatif)" & VBCRLF msg=msg & " si ce commutateur est omis, il n'y a pas de backup" & VBCRLF msg=msg & " -c : remplacements sensibles à la casse" & VBCRLF msg=msg & " dans ce cas, on distingue majuscules et minuscules" & VBCRLF msg=msg & " -s : exploration des sous-dossiers requise" & VBCRLF msg=msg & " -r : les chaines sont interprétées comme expressions régulières " & VBCRLF msg=msg & "NB : les chaines et nom de fichier sont à encadrer par des guillemets" & VBCRLF msg=msg & " s'ils comportent des espaces" & VBCRLF & VBCRLF msg=msg & "Exemples :"& VBCRLF msg=msg & " replace /aEssai /n\x22Test\x22 -flisezmoi.txt -c -s -b$$$" & VBCRLF msg=msg & " remplace la chaine ""Essai"" par """"Test"""" en respectant la casse" & VBCRLF msg=msg & " dans tous les fichiers de nom ""lisezmoi.txt"" situés dans le" & VBCRLF msg=msg & " dossier courant et les sous-dossiers et effectue un backup de" & VBCRLF msg=msg & " chaque fichier modifié en ajoutant à son nom l'extension .$$$" & VBCRLF & VBCRLF msg=msg & " replace -a""array[0..255] of char"" -nstring -f""g:\mes projets\delphi\*.pas""" & VBCRLF msg=msg & " remplace la chaine ""array[0..255] of char"" par ""string""" & VBCRLF msg=msg & " dans tous les fichiers ""*.pas"" du dossier ""g:\mes projets\delphi""" & VBCRLF & VBCRLF msg=msg & " replace -a""(\S+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)(\s+)(\S+)"" "& VBCRLF msg=msg & " -n""$1$2$11$6$7$8$9$10$3$4$5"" -fm:\texte\signature.txt -r" & VBCRLF msg=msg & " permute les mots 11 et 3,4,5 (en tenant compte des espaces)" & VBCRLF msg=msg & " Ainsi le texte : ""May The Force be with You""" & VBCRLF msg=msg & " devient : ""May You be with The Force""" & VBCRLF & VBCRLF msg=msg & "Un aide-mémoire des expressions régulières est disponible p.ex. ici :" & VBCRLF msg=msg & "http://www.bellamyjc.net/fr/vbsobj/vspropattern.html" & VBCRLF & VBCRLF wscript.echo msg wscript.quit End Sub ' -------------------------------------