web-dev-qa-db-fra.com

Comment puis-je créer une invite "Êtes-vous sûr" dans un fichier batch Windows?

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é]

67
Josh Ribakoff

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
127
Joe

essayez la commande CHOICE , par exemple.

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
24
Steven A. Lowe

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

11
ghostdog74

Deux commandes sont disponibles pour les invites de l'utilisateur sur la ligne de commande Windows:

  • set avec l'option /P disponible sur toutes les versions de Windows NT avec extensions de commande activées et
  • choice.exe disponible par défaut sous Windows Vista et versions ultérieures de Windows pour les utilisateurs de PC et sous Windows Server 2003 et versions ultérieures de Windows.

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:

  1. CHOICE n'accepte que les clés (respectivement les caractères lus dans STDIN) spécifiés après l'option /C (et Ctrl+C) et émet un bip d’erreur si l’utilisateur appuie sur une mauvaise touche.
  2. CHOIX ne nécessite pas d'appuyer sur une touche autre que celle qui est acceptable. CHOICE se ferme immédiatement une fois qu'une touche acceptable est enfoncée, tandis que SET/P nécessite que l'utilisateur termine la saisie avec RETURN ou ENTER.
  3. Il est possible avec CHOICE de définir une option par défaut et un délai d'attente pour continuer automatiquement avec l'option par défaut après quelques secondes sans attendre l'utilisateur.
  4. La sortie est meilleure lorsque vous répondez automatiquement à l'invite à partir d'un autre fichier de commandes qui appelle le fichier de commandes avec l'invite en utilisant quelque chose comme echo Y | call PromptExample.bat à l'aide de CHOICE.
  5. L'évaluation du choix de l'utilisateur est beaucoup plus facile avec CHOIX car CHOIX se termine avec une valeur correspondant à la touche enfoncée (caractère) auquel est attribué ERRORLEVEL, qui peut être facilement évalué par la suite.
  6. La variable d'environnement utilisée sur SET/P n'est pas définie si l'utilisateur appuie uniquement sur la touche. RETURN ou ENTER et il n'a pas été défini avant d'inviter l'utilisateur. La variable d’environnement utilisée sur la ligne de commande SET/P conserve sa valeur actuelle si elle est définie avant et l’utilisateur appuie simplement sur RETURN ou ENTER.
  7. L'utilisateur a la liberté d'entrer n'importe quoi s'il est invité avec SET/P , y compris une chaîne qui aboutit ultérieurement à une sortie de l'exécution du fichier de commandes par cmden 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 UserChoicename__. 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 UserChoiceavec YSPACE En tant que valeur, l'invite sera exécutée une seconde fois avec l'option Ndé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:

  1. IF compare les deux chaînes gauche et droite de l'opérateur de comparaison avec , y compris les guillemets doubles. Ainsi, la comparaison insensible à la casse n'est pas la valeur de UserChoiceavec Net Yname__, mais la valeur de UserChoiceentourée de " avec "N" et "Y".
  2. Les opérateurs de comparaison IFEQUet NEQsont conçus de manière primaire pour comparer deux entiers compris entre -2147483648 et 2147483647 et non pour comparer deux chaînes. EQUet NEQfonctionnent é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. EQUet NEQpeuvent 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 .
  3. La commande 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:

4
Mofi

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
2
Bob Smith

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.

0
GWS One

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...

0
Z. Mickaels