[Trucs&astuces] Tests et Comparaison de chaînes
salut,
Comparer entre 2 chaines avec un "IF"
AIDE:
-----
INS = Instruction "IF"
INT = Intérprétation du code
BUG = si "0" alors c'est bon sinon "1"
RES = Resultat retourné
Code:
1 2 3 4 5 6 7
| set "a=chaine1"
set "b=chaine2"
INS ==> if %a%==%b% (echo a=b) else (echo a!b)
INT ==> if chaine1==chaine2 (echo a=b) else (echo a!b)
BUG ==> 0
RES ==> a!b |
test concluant donc pas de problème pour l'instant..
Code:
1 2 3 4 5 6 7
| set "a="
set "b=chaine2"
INS ==> if %a%==%b% (echo a=b) else (echo a!b)
INT ==> if ==chaine2 (echo a=b) else (echo a!b)
BUG ==> 1
RES ==> (echo était inattendu. |
va retourner une erreur car l'une des 2 variables est non-définie
Code:
1 2 3 4 5 6 7
| set "a=chaine 1"
set "b=chaine 2"
INS ==> if %a%==%b% (echo a=b) else (echo a!b)
INT ==> if chaine 1==chaine 2 (echo a=b) else (echo a!b)
BUG ==> 1
RES ==> 1==chaine était inattendu. |
va retourner une erreur car aux moins un argument à comparer
contient un espace.
pour contourner ce problème on peut utiliser les guillemets:
Code:
1 2 3 4 5 6 7
| set "a="
set "b=chaine 1"
INS ==> if "%a%"=="%b%" (echo a=b) else (echo a!b)
INT ==> if ""=="chaine 2" (echo a=b) else (echo a!b)
BUG ==> 0
RES ==> a!b |
mais si l'une des chaînes à comparer contenait un guillemts de plus une erreur sera retourner
Code:
1 2 3 4 5 6 7 8
|
set "a=test " de chaine"
set "b=chaine 2"
INS ==> if "%a%"=="%b%" (echo a=b) else (echo a!b)
INT ==> if "test " de chaine"=="chaine 2" (echo a=b) else (echo a!b)
BUG ==> 1
RES ==> de était inattendu. |
va retourner une erreur car au moins l'un des 2 arguments contient
un guillemets "
une des solutions possibles pour contourner ce bug "logique" :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
set "a=test " de chaine"
set "b=chaine 2"
set "X=@%a%"
set "Y=@%b%"
INS ==> if ["%X:"=@%"]==["%Y:"=@%"] (echo a=b) else (echo a!b)
INT ==> if ["@test @ de chaine"]==["@chaine 2"] (echo a=b) else (echo a!b)
BUG ==> 0
RES ==> a!b |
mais malheureusement, cette solution peux causer quelques surprises si elle rencontre un
contenu de variable telque:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
set "a=test " de chaine"
set "b=test @ de chaine"
set "X=@%a%"
set "Y=@%b%"
INS ==> if ["%X:"=@%"]==["%Y:"=@%"] (echo a=b) else (echo a!b)
INT ==> if ["@test @ de chaine"]==["@test @ de chaine"] (echo a=b) else (echo a!b)
BUG ==> 1
RES ==> a=b |
le resultat doit être "a!b" malheureusement on a le contraire "a=b"
l'astuce pour palier à cette lacune est d'utiliser cette syntaxe:
Code:
1 2 3 4 5 6 7 8 9 10
| set "a=test " de chaine"
set "b=test @ de chaine"
set "X=@%a%"
set "Y=@%b%"
INS ==> if ["%X:"=^@%"]==["%Y:"=^@%"] (echo a=b) else (echo a!b)
INT ==> if ["@test ^@ de chaine"]==["@test @ de chaine"] (echo a=b) else (echo a!b)
BUG ==> 0
RES ==> a=b |
si on précede l'arobase @ par un signe caret "^" le script va générer une erreur
Code:
1 2 3 4 5 6 7 8 9 10
| set "a=test " de chaine"
set "b=test ^@ de chaine"
set "X=@%a%"
set "Y=@%b%"
INS ==> if ["%X:"=^@%"]==["%Y:"=^@%"] (echo a=b) else (echo a!b)
INT ==> if ["@test ^@ de chaine"]==["@test @ de chaine"] (echo a=b) else (echo a!b)
BUG ==> 1
RES ==> a=b |
la solution peut être d'échapper le signe "^"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| @echo off
setlocal
set "str1=hello " world"
set "str2=hello ^@ world"
set "str1=@%str1%"
set "str2=@%str2%"
set str | findstr "\^^^^^@">nul && (
set "str1=%str1:^^^^^@=@%"
set "str2=%str2:^^^^^@=@%"
)
if ["%str1:"=^^^^^@%"]==["%str2:"=^^^^^@%"] (echo equ) else (echo dif)
endlocal
pause |
mais reste encore un problème que je le citerai la prochaine fois...un problème d'interprétation de caractères reservés,
et pour finir voici une autre manière pour comparer entre 2 chaînes
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @echo off
setlocal
md .$.
set "a=hello " world"
set "b=hello @ world"
>.$.\1 echo.%a%
>.$.\2 echo.%b%
cd .$.
fc /b 1 2 >nul 2>nul
if %errorlevel% equ 0 (echo equ) else (echo dif)
cd..
rd /s /q .$.
endlocal |