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é
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=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
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=" 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 aux moins un argument à comparer
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.
contient un espace.
pour contourner ce problème on peut utiliser les guillemets:
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 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
va retourner une erreur car au moins l'un des 2 arguments contient
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.
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:
le resultat doit être "a!b" malheureusement on a le contraire "a=b"
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
l'astuce pour palier à cette lacune est d'utiliser cette syntaxe:
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 ==> 0 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 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
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
Partager