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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
@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 : 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
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