set /p et caractères spéciaux
Bonjour,
Je suis actuellement en train de réaliser un petit batch pour une sauvegarde, et si la sauvegarde ne s'effectue pas correctement, il est demandé à l'utilisateur si il souhaite effectuer une nouvelle tentative:
Code:
1 2 3 4 5 6 7 8 9 10
| set /p "choix=>"
if not defined %choix% goto NONCOMPRIS
if /I %choix%== o goto INSTALLATION
if /I %choix%== oui goto INSTALLATION
if /I %choix%== y goto INSTALLATION
if /I %choix%== yes goto INSTALLATION
if /I %choix%== n goto LATER
if /I %choix%== no goto LATER
if /I %choix%== non goto LATER
goto NONCOMPRIS |
Problème: les caractères spéciaux font planter le script!
J'ai tenté des petits workaround en controlant avec des "%errorlevel%" en mettant "@set /p"
ou encore avec des boucles "for /f" pour chercher des caractères spéciaux et inscrire une valeur (genre false ou pascompris, etc..) dans %choix%.
Pour cela j'utilisait une valeur tampon: set /p input= et si %input% ne contenait aucun caractères définis (vérifiés par la boucle for /f) je mettais choix=%input%.
J'ai aussi fait une tentative avec if "%choix:"=%"=="" mais sans succès.
Mais il semblerait que j' échoue lamentablement à chaque fois. Soit le programme ne plante jamais mais il va directement à :NONCOMPRIS, soit il plante avec:
les espaces et avec ,&;^`|<>
Si quelqu'un pouvait m'indiquer une direction dans laquelle regarder cela me permettrait d'avoir un programme un peu plus sûr.
Cordialement,
PY
Edit:
en allant trainer du coté des FAQ je me suis laisser tenter par une nouvelle tentative d'utilisation de "setlocal enableDelayedExpansion" même si les précédentes étaient infructueuses.
J'arrive désormais à ceci (mon fichier de test )
Code:
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 29 30 31 32 33 34 35 36 37 38 39 40
| :TEST
@echo off
cls
Echo.
Echo.
Echo "Test"
Echo.
Echo.
set /p input=
setlocal enableDelayedExpansion
set choix=default
for /F %%D in ("%input%") do (
for /F "tokens=1 delims=\&;<>^`%ù*µ$£¤!§:/.,?~é'|è²_] ()+-*°=" %%E in ("%%D") do (
set choix=%%E
echo "voici choix: !choix! et voici input: %input%"
pause
if /I !choix!== n goto W00T
if /I !choix!== n goto W00T
if /I !choix!== no goto W00T
if /I !choix!== non goto W00T
if /I !choix!== default GOTO NONCOMPRIS
pause
goto NONCOMPRIS
)
)
endlocal
:NONCOMPRIS
cls
Echo.
Echo.
Echo " Pas comprendre "
pause
goto TEST
:W00T
cls
Echo.
Echo.
Echo " Trois petits cochons.... w00t! "
pause
goto TEST |
Le code supporte presque tout mais de temps en temps il plante!
j'ai pourtant testé tous les caractères spéciaux un à un et il tient bon, mais quand je met il crash. Je pense avoir testé toutes les autres combinaisons mais il est possible que j'en ai loupé une au passage.
Y'a t-il un moyen d'éviter cela?