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