Créer des menus de sélections dans un batch Windows

Dans un script Batch (.bat) une fonction très utile est de créer un menu de sélection afin de laisser l’utilisateur choisir parmi une ou plusieurs actions préprogrammée(s).
Pour ce faire, on peut utiliser plusieurs solutions.

Un menu avec ECHO, SET /P, IF, GOTO

La première peut se faire avec un affichage des différents sélections à l’aide la commande ECHO, puis de demander la sélection à l’aide de la commande SET /P variable=Question de sélection : 
On stocke donc le choix de l’utilisateur dans la variable variable, à choisir librement mais dans la bonne pratique, un nom en rapport avec le menu ou l’action que vous souhaitez réaliser.
Ensuite il faut gérer toutes les situations possibles à l’aide de la commande IF. S’il s’agit d’une action simple, on peut mettre la(les) action(s) directement à la suite de IF, sinon on peut aussi faire un branchement vers une sous fonction à l’aide de la commande GOTO s’il n’y a plus d’actions communes à tous les choix à réaliser.
Si le choix n’a pas besoin d’être sensible à la casse (ex « O » ou « o »/ »OUI » ou « Oui » ou « oui ») il sera possible d’utiliser le commutateur /I de la commande IF.

Cette méthode peut s’avérer compliqué à mettre en oeuvre si les choix et actions sont complexes, et notamment une gestion des réponses non attendues, obligeant des tests et une boucle supplémentaire.

Exemple de Script :

@ECHO OFF
:: Boucle du menu à reprendre
:MENU
CLS
ECHO *** Mon premier MENU ***
ECHO(
:: LISTE des sélections
ECHO 1: Choix 1
ECHO 2: Choix 2
ECHO 3: Choix 3
ECHO(
ECHO 0: Fin du programme
ECHO(
ECHO(
:: Choix de l'utilisateur stocké dans la variable %C%
SET /P C=Veuillez faire votre choix : 
:: Vérification du choix avec les différentes possibilités
IF %C% NEQ 0 IF %C% NEQ 1 IF %C% NEQ 2 IF %C% NEQ 3 GOTO MENU
CLS
:: Branchements des actions en fonction du choix
IF %C%==0 GOTO FIN
IF %C%==1 ECHO Vous avez fais le choix 1
IF %C%==2 ECHO Vous avez fais le choix 2
IF %C%==3 ECHO Vous avez fais le choix 3
ECHO(
:: Un sélection simple de confirmation O/N
:CONF
SET /P conf=Est-ce correct (O/N) ? 
:: Vérification du choix correspond aux sélections
IF /I %conf% NEQ O IF /I %conf% NEQ N GOTO CONF
:: Branchements des actions en fonction du choix
ECHO(
IF /I %conf%==o ( ECHO Merci ) ELSE ( ECHO Refaite votre choix )
PAUSE
:: Bouclage pour reprise du menu
GOTO MENU
:: Fin du programme sélection 0
:FIN

Un menu avec les commandes CHOICE, IF, %ERRORLEVEL% …

Une deuxième solution serait d’utiliser la commande CHOICE, qui est beaucoup plus adapté pour un menu complexe, car elle gère d’elle même les réponses inattendues ou hors contexte par rapport aux choix proposés.

En effet on donne à la commande CHOICE, les différentes réponses possibles, mais elle se limite à un seul caractère, mais propose une temporisation et un choix par défaut.

Comme pour le première solution, on peut proposer une sélection de choix évolués à l’aide de la commande ECHO, mais au lieu de demander le choix à l’aide de la commande SET /P et stocker la réponse dans une variable, on utilisera la commande CHOICE qui stockera la réponse dans la variable %ERRORLEVEL%. Les différentes actions découlants du choix seront gérer comme pour la première solution par des commandes IF complétées par des sauts GOTO selon les besoins.

Exemple de script :

@ECHO OFF
:: Début du menu avec point de reprise (:MENU)
:MENU
CLS
:: Liste des sélections
ECHO *** Mon premier MENU ***
ECHO(
ECHO 1: Choix 1
ECHO 2: Choix 2
ECHO 3: Choix 3
ECHO(
ECHO 0: Fin du programme
ECHO(
ECHO(
:: Choix possible on économise une vérification de la cohérence du choix par rapport à SET /P
:: Si une valeur non attendu est saisie un bip retentit et attend une sélection valide
:: Ici une tempo de 30s et un choix par défaut de fin de programme à la fin de cette tempo
CHOICE /T 30 /C 0123 /M "Veuillez faire votre choix " /D 0
:: Simplification de la variable en reprenant le contenu de %ERRORLEVEL%
SET C=%ERRORLEVEL%
CLS
:: Branchement en fonction du choix effectué
:: Attention CHOICE renvoi l'ordre du choix à %ERRORLEVEL% et non le choix lui même
IF %C%==1 GOTO FIN
IF %C%==2 ECHO Vous avez fais le choix 1
IF %C%==3 ECHO Vous avez fais le choix 2
IF %C%==4 ECHO Vous avez fais le choix 3
ECHO(
:: Sans modificateur de choix (/C) le choix est [O/N]
CHOICE /M "Est-ce correct " 
ECHO(
IF %ERRORLEVEL%==1 (
ECHO Merci
) ELSE (
ECHO Refaite votre choix
)
PAUSE
GOTO MENU
:FIN

Un menu évolué et dynamique à l’aide de la commande FOR

Une dernière méthode pour créer un menu avec des sélections dynamiques ou variables, peut s’effectuer à l’aide d’une commande FOR.
Cette commande est très puissante et complexe, aussi je vous invite à consulter l’aide en ligne (FOR /?) et tous sites WEB traitant de cette commande pour vous aidez à l’appréhender. (Batcher, SS64 …)

Effectivement, la commande FOR permet des exécutions récursives (boucles), sur une liste, un fichier, un résultat de commande(s) …

Cette variante est intéressante car elle permet de stocker les différentes options du menu dans une variable déclaré en début de script, et ainsi de n’avoir à modifier que cette variable et le traitement (GOTO et label correspondant), en cas de modification ou d’ajout d’une option du script.

Les commandes FOR et Choice s’adapteront aux contenus des variables. On peut aussi créer un menu depuis un Fichier externe, et même utiliser un fichier pour des choix plus complexes, voire imbriqués …

Pour l’exemple nous allons rester sur un menu simple.

Exemple de script :

@ECHO OFF
REM *** Activation de l'expansion des variables dans une boucle ***
REM *** Permet que le contenu soit évalué dans une boucle FOR ***
REM *** sans cette commande l'appel d'une variable modifiée dans la boucle ***
REM *** resterait à son contenu avant ou après la boucle ***
SETLOCAL Enabledelayedexpansion

REM *** Initialisation des variables ***
REM *** ID = Sélection des Options de menu de la commande "Choice" ***
REM *** M = Entrée des menus à afficher, séparer les différentes entrées soit par "," ou ";" ***
REM *** si une entrée doit contenir un espace, encadrer les valeurs par des guillemets "..." ***
REM *** I = Index qui servira à obtenir l'entrée de l'ID ***
REM *** correspondant à l'entrée du menu M dans la boucle FOR ***
SET ID=1230
SET M="Option 1","Option 2","Option 3",FIN
SET I=0

REM *** Affichage du Menu ***
CLS
ECHO *********** MENU ***********
ECHO(
FOR %%i IN (%M%) DO (
REM *** Une astuce non documentée trouver sur le site SS64 pour l'extraction partielle de variable ***
REM *** %VARIABLE:~1,1% ne fonctionne qu'avec une donnée numérique directe sur le début et quantité à extraire ***
REM *** Utiliser CALL avant la commande pour pouvoir remplacer les valeurs numériques par le contenu d'une variable ***
REM *** La variable doit être encadrée par %% au lieu d'un seul % traditionnellement ***
REM *** A noter aussi l'appel de l'entrée de menu par %%~i au lieu de %%i ***
REM *** Concept que l'on a pu voir dans l'extension de variables qui sert à récupérer le contenu d'une variable sans les guillemets ***
CALL ECHO %%ID:~!I!,1%% : %%~i
REM *** Incrémentation de l'index de la variable ID ***
SET /A I+=1
)
ECHO(
CHOICE /C %ID% /M "Votre choix "

REM *** Actions et branchements en fonctions des choix ***
REM *** Le menu est terminé, libre à vous de réaliser vos branchements ***
REM *** Le choix est enregistré par %ERRORLEVEL% ***
REM *** 1 pour choix 1 ***
REM *** 2 pour choix 2 ***
REM *** ... ***
REM *** 4 pour choix 0 ***
IF %ERRORLEVEL%==4 GOTO END
CLS
FOR /F "delims=, tokens=%ERRORLEVEL%" %%c IN ("%M%") DO ECHO Choix %%~c
PAUSE
:END

Menu de sélection

Laisser un commentaire