J'ai un fichier de commandes qui automatise la copie d'un tas de fichiers d'un endroit à l'autre et inversement pour moi. La seule chose qui compte, c’est que cela m’aide beaucoup. Je continue de sélectionner accidentellement cette commande dans mon tampon de commande et d’écraser en masse les modifications non validées.
De quel code aurais-je besoin pour que mon fichier .bat dise "êtes-vous sûr" et me fait-il taper "y" avant que le reste du fichier ne soit exécuté? Si vous tapez autre chose que "y", il devrait quitter l'exécution sur cette ligne.
Edit Nov 27 .__ Ok, je l'ai marqué à nouveau sans réponse parce que je ne peux toujours pas le comprendre. Quand j'appelle "exit" il ferme cmd.exe qui n'est pas ce que je veux. Tout cela parce que Windows a mal implémenté le tampon de commande [différemment de ce que je suis au moins habitué]
Vous voulez quelque chose comme:
@echo off
setlocal
:Prompt
SET /P AREYOUSURE=Are you sure (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END
echo ... rest of file ...
:END
endlocal
essayez la commande CHOICE , par exemple.
CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
La commande choice
n'est pas disponible partout. Avec les nouvelles versions de Windows, la commande set
a l'option /p
à laquelle vous pouvez obtenir une entrée utilisateur.
SET /P variable=[promptString]
voir set /?
pour plus d'informations
Deux commandes sont disponibles pour les invites de l'utilisateur sur la ligne de commande Windows:
/P
disponible sur toutes les versions de Windows NT avec extensions de commande activées et set est une commande interne du processeur de commandes Windows cmd.exe
. L'option /P
to Inviter un utilisateur à entrer une chaîne est disponible uniquement avec les extensions de commande activées qui sont activées par défaut, sinon aucun fichier de traitement par lots ne fonctionnerait plus de nos jours.
choice.exe est une application de console distincte (commande externe) située dans %SystemRoot%\System32
. choice.exe
de Windows Server 2003 peut être copié dans le répertoire %SystemRoot%\System32
sur une machine Windows XP pour être utilisé sous Windows XP, comme beaucoup d'autres commandes non disponibles par défaut sous Windows XP, mais disponibles par défaut sous Windows Server 2003.
Il est recommandé de privilégier l'utilisation de CHOIX par rapport à l'utilisation de SET/P pour les raisons suivantes:
/C
(et Ctrl+C) et émet un bip d’erreur si l’utilisateur appuie sur une mauvaise touche.echo Y | call PromptExample.bat
à l'aide de CHOICE.cmd
en raison d'une erreur de syntaxe, ou exécution de commandes non incluses du tout dans le fichier de commandes sur fichier de commandes mal codé. Il faut faire quelques efforts pour obtenir SET/P une protection contre les erreurs, par erreur ou intentionnellement, de l'utilisateur.Voici un exemple d’Invite utilisant le paramètre préféré CHOIX et SET/P sur choice.exe
non disponible sur un ordinateur usagé fonctionnant sous Windows.
@echo off
echo This is an example for prompting a user.
echo/
if exist "%SystemRoot%\System32\choice.exe" goto UseChoice
setlocal EnableExtensions EnableDelayedExpansion
:UseSetPrompt
set "UserChoice=N"
set /P "UserChoice=Are you sure [Y/N]? "
set "UserChoice=!UserChoice: =!"
if /I "!UserChoice!" == "N" endlocal & goto :EOF
if /I not "!UserChoice!" == "Y" goto UseSetPrompt
endlocal
goto Continue
:UseChoice
%SystemRoot%\System32\choice.exe /C YN /N /M "Are you sure [Y/N]? "
if errorlevel 2 goto :EOF
:Continue
echo So your are sure. Okay, let's go ...
Remarque: Ce fichier de commandes utilise des extensions de commande qui ne sont pas disponibles sous Windows 95/98/ME en utilisant command.com
au lieu de cmd.exe
en tant qu'interpréteur de commandes.
La ligne de commande set "UserChoice=!UserChoice: =!"
est ajoutée pour permettre d’appeler ce fichier de commandes avec echo Y | call PromptExample.bat
sous Windows NT4/2000/XP et ne nécessite pas l’utilisation de echo Y| call PromptExample.bat
. Il supprime tous les espaces de la chaîne lue à partir de STDIN avant l'exécution des deux comparaisons de chaînes.
echo Y | call PromptExample.bat
résulte en YSPACE affecté à la variable d'environnement UserChoice
name__. Cela aurait pour résultat de traiter l'invite deux fois, car "Y "
n'est pas sensible à la casse ni "N"
ni "Y"
sans supprimer tous les espaces. Donc UserChoice
avec YSPACE En tant que valeur, l'invite sera exécutée une seconde fois avec l'option N
définie par défaut dans le fichier de commandes lors de la deuxième exécution de l'invite, ce qui entraînera une sortie inattendue du traitement du fichier de commandes. Oui, l'utilisation sécurisée de SET/P est vraiment délicate, n'est-ce pas?
Pour plus de détails sur l’utilisation de SET/P et CHOICE pour inviter l’utilisateur à choisir parmi une liste d’options, voir réponse sur Comment empêcher l'interpréteur de commandes Windows de quitter l'exécution d'un fichier de traitement par lots sur une entrée utilisateur incorrecte?
Quelques astuces supplémentaires:
UserChoice
avec N
et Y
name__, mais la valeur de UserChoice
entourée de "
avec "N"
et "Y"
.EQU
et NEQ
sont conçus de manière primaire pour comparer deux entiers compris entre -2147483648 et 2147483647 et non pour comparer deux chaînes. EQU
et NEQ
fonctionnent également pour les comparaisons de chaînes, mais aboutissent à la comparaison de chaînes entre guillemets lors d'une tentative inutile de convertir la chaîne de gauche en entier. EQU
et NEQ
peuvent uniquement être utilisés avec des extensions de commande activées. Les opérateurs de comparaison pour les comparaisons de chaînes sont ==
et not ... ==
qui fonctionnent même avec les extensions de commande désactivées, même si command.com
de MS-DOS et Windows 95/98/ME les prenaient déjà en charge. Pour plus de détails sur les opérateurs de comparaison IF, voir symbole équivalent à NEQ, LSS, GTR, etc. dans les fichiers de traitement par lots de Windows .goto :EOF
nécessite des extensions de commande activées pour réellement quitter le traitement de fichier de commandes. Pour plus de détails, voir Où GOTO: EOF retourne-t-il?Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez-y les commandes suivantes et lisez très attentivement toutes les pages d'aide affichées pour chaque commande.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
Voir également:
set "variable=value"
lors de l’attribution d’une chaîne à une variable d’environnement.if errorlevel X
et l'opérateur &
.|
et le descripteur STDIN.SystemRoot
name__.Voici un peu plus facile:
@echo off
set /p var=Are You Sure?[Y/N]:
if %var%== Y goto ...
if not %var%== Y exit
ou
@echo off
echo Are You Sure?[Y/N]
choice /c YN
if %errorlevel%== Y goto ...
if %errorlevel%== N exit
Voici un exemple simple que j’utilise dans un script de sauvegarde (.bat/batch) sous Windows 10, qui me permet d’avoir différentes options lors de la sauvegarde.
...
:choice
set /P c=Do you want to rsync the archives to someHost[Y/N]?
if /I "%c%" EQU "Y" goto :syncthefiles
if /I "%c%" EQU "N" goto :doonotsyncthefiles
goto :choice
:syncthefiles
echo rsync files to somewhere ...
bash -c "rsync -vaz /mnt/d/Archive/Backup/ user@Host:/home/user/Backup/blabla/"
echo done
:doonotsyncthefiles
echo Backup Complete!
...
Vous pouvez en avoir autant que vous en avez besoin.
Si vous souhaitez que le programme de traitement des commandes revienne à l'invite sans fermer l'invite (A.K.A cmd.exe), vous pouvez utiliser "exit/b".
Cela peut aider.
set /p _sure="Are you sure?"
::The underscore is used to ensure that "sure" is not an enviroment
::varible
if /I NOT "_sure"=="y" (
::the /I makes it so you can
exit /b
) else (
::Any other modifications...
)
Ou si vous ne voulez pas utiliser autant de lignes ...
Set /p _sure="Are you sure?"
if /I NOT "_sure"=="y" exit /b
::Any other modifications and commands.
J'espère que cela t'aides...