salut,
Pour remplacer une chaine par une autre, on peux utiliser les variables de substitutions:
c'est bien vous dites, mais malheureusement on ne pourra pas faire une chose du genre:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 set chaine=1+2+3+4+5 set chaine=%chaine:+=#% echo %chaine%
comme vous voyer le caractère astérisque "*", même si on essaye de l'echapper par des caractères d'echappement la substitution ne prendra pas effet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 set chaine=1*2*3*4*5 set chaine=%chaine:*=#% echo %chaine%
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 set chaine=1*2*3*4*5 set chaine=%chaine:^*=#% echo %chaine%
Le caractère asterisque "*" a sa propre fonction dans les variables de substitution , il permet s'il précéde une chaine, de traiter la chaine au debut et jusqu'a la première accurrence du reste de la chaine à traiter:
donc il faut envisager d'autres manières pour le remplacement des "*". en voici quelques-unes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 set chaine=12345World set chaine=%chaine:*5=Hello % echo %chaine%
Méthode 1:
----------
petite description: on découpe la chaine en caractères puis on teste chaque caractère à part
Méthode 2:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 @echo off set "string=**1*2*3**" set del=* set char=# set result= for /f "skip=7 delims=" %%_ in (' "%ComsPec% /u /c set string|find /v """"" ') do (if "%%_"=="%del%" (call set "result=%%result%%%char%" ) else (call set "result=%%result%%%%_") ) echo %result% goto:eof
----------
petite description: substitution par conversion et utilisation de la variable dynamique =ExitCodeAscii
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 @echo off setlocal EnableDelayedExpansion set old_str=**hello * world ** set oldchar=* set newchar=$ set new_str= >$1 (<nul,set/P=%old_str%) For %%a in ($1) do set /A cnt=%%~za >$2 (For /l %%a in (1 1 %cnt%) do <nul,set/P=µ) For /f "tokens=3" %%a in ('"fc /b $2 $1|findstr :"') do ( set /A dec=0x%%a %ComsPec% /c exit /b !dec! if "!=ExitCodeAscii!"=="%oldchar%" ( set new_str=!new_str!%newchar% ) else ( set new_str=!new_str!!=ExitCodeAscii! ) ) del $? echo %old_str% echo %new_str% pause
Méthode 3:
----------
petite description: utilisation du beau vieux utilitaire EDLIN, la substitution ce fait par le bias d'un fichier temporaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 @echo off 1>nul 2>nul 3>nul 4>nul setlocal EnableDelayedExpansion set string=**hello*World** set old_char=* set new_char=# pushd %Temp%.\ set string>f1.t copy nul+nul f0.t for /f %%a in (f0.t) do ( ( echo 1r%old_char%%%a%new_char% echo w echo e ) | edlin /b f1.t ) for /f "tokens=*" %%i in (f1.t) do set %%i echo !string:%new_char% =%new_char%! >con del f0.t f1.t f1.bak popd pause
Méthode 4:
----------
petite description: la méthode classique, on teste chaque caractère par le biais des sous expressions de variables
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 @echo off setlocal EnableDelayedExpansion set string=**hello * World** set old_char=* set new_char=# set new_str= for /l %%a in (0 1 0xFF) do ( if !string:~%%a^,1!. neq %old_char%. ( set "new_str=!new_str!!string:~%%a,1!" ) else if !string:~%%a^,1!. neq . ( Set new_str=!new_str!%new_char%)) echo !new_str! endlocal pause
Méthode 5:
----------
petite description: dans cette exemple on va combiner JS à notre code. cette méthode nous permet d'utiliser les RegExp's
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @echo off set str=**hello ** world** set old=\* set new=# for /f "useback delims=" %%_ in (`@mshta "about:<script>var string='%str%';new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(string.replace(/%Old%/g,'%New%'));close();</script>" ^|more`) do set res=%%_ echo %str% echo %res% pause
Méthode 6:
----------
petite description: cette exemple montre la flexibilité de PS,
Walid
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @echo off set string=*hello***World* set oldchar=* set newchar=$ for /f "tokens=*" %%* in (' "powershell -c ""$env:string"".replace('%oldchar%','%newchar%')" ') do set result=%%* echo %result% pause
Partager