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


94

J'ai un fichier batch qui automatise la copie d'un tas de fichiers d'un endroit à l'autre et inversement pour moi. La seule chose qui m'aide, c'est que je continue à sélectionner accidentellement cette commande hors de ma mémoire tampon de commandes et à écraser en masse les modifications non validées.

De quel code aurais-je besoin pour mon fichier .bat pour qu'il dise «êtes-vous sûr» et me fasse taper «y» avant d'exécuter le reste du fichier? Si autre chose que "y" est tapé, il devrait quitter l'exécution sur cette ligne.

Edit 27 novembre Ok, j'ai à nouveau marqué ceci comme sans réponse parce que je n'arrive 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 à quoi je suis habitué au moins]

Réponses:


168

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

5
La seule chose que j'ajouterais est un élément supplémentaire SET AREYOUSURE=Navant l'invite afin d'effacer le choix si vous avez déjà exécuté le script auparavant dans cette fenêtre de commande. Sans lui, la valeur par défaut restera le choix précédemment sélectionné.
isapir

4
@Igal Je suis presque sûr que le setlocalet le endlocaldevraient s'en occuper. %AREYOUSURE%n'existera plus après le endlocal.

1
@dudeprgm vous avez probablement raison. Je pense que je les ai manquées dans mon code.
isapir le

2
... serait plus utile avec quelques mots explicatifs sur les deux lignes importantes .
Wolf

@Joe Peut-être qu'il ne peut pas parce que (comme moi) il ne les comprend pas (encore). Donc, si vous le faites, ce serait étonnant si vous pouviez développer votre réponse ou un lien vers des ressources l'expliquant :)
Marcus Mangelsdorf


15

La choicecommande n'est pas disponible partout. Avec les nouvelles versions de Windows, la setcommande a la /ppossibilité d'obtenir une entrée utilisateur

SET /P variable=[promptString]

voir set /?pour plus d'informations


... beaucoup plus perspicace que celle acceptée, mais nous vivons évidemment dans des temps urgents.
Wolf

10

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

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

set est une commande interne du processeur de commandes Windows cmd.exe. L'option /Pd'inviter un utilisateur à saisir une chaîne n'est disponible qu'avec les extensions de commande activées qui sont activées par défaut, sinon presque aucun fichier de commandes ne fonctionnerait plus de nos jours.

choice.exe est une application console distincte (commande externe) située dans %SystemRoot%\System32. choice.exede Windows Server 2003 peut être copié dans le répertoire %SystemRoot%\System32sur une machine Windows XP pour une utilisation sur Windows XP comme de nombreuses autres commandes non disponibles par défaut sur Windows XP, mais disponibles par défaut sur Windows Server 2003.

Il est recommandé de privilégier l'utilisation de CHOICE à l'utilisation de SET / P pour les raisons suivantes:

  1. CHOICE n'accepte que les clés (respectivement les caractères lus à partir de STDIN ) spécifiées 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 autre touche que l'une des touches acceptables. CHOICE se termine immédiatement une fois qu'une touche acceptable est enfoncée tandis que SET / P exige que l'utilisateur termine la saisie avec RETURNou 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 pour répondre automatiquement à l'invite à partir d'un autre fichier de commandes qui appelle le fichier de commandes avec l'invite en utilisant quelque chose comme l' echo Y | call PromptExample.batutilisation de CHOICE .
  5. L'évaluation du choix de l'utilisateur est beaucoup plus facile avec CHOICE car CHOICE sort avec une valeur en fonction de la touche enfoncée (caractère) qui est affectée à ERRORLEVEL qui peut être facilement évaluée ensuite.
  6. La variable d'environnement utilisée sur SET / P n'est pas définie si l'utilisateur appuie uniquement sur la touche RETURNou ENTERet qu'elle n'a pas été définie avant l'invitation de l'utilisateur. La variable d'environnement utilisée sur la ligne de commande SET / P conserve sa valeur actuelle si elle a été définie auparavant et l'utilisateur appuie simplement sur RETURNou ENTER.
  7. L'utilisateur a la liberté de saisir quoi que ce soit lorsqu'il est invité avec SET / P, y compris une chaîne qui entraîne plus tard une sortie de l'exécution du fichier batch en cmdraison d'une erreur de syntaxe, ou dans l'exécution de commandes non incluses du tout dans le fichier batch sur non bon fichier batch codé. Il faut quelques efforts pour sécuriser SET / P contre une entrée utilisateur erronée ou intentionnelle.

Voici un exemple d'invite utilisant le CHOIX préféré et alternativement SET / P sur choice.exenon disponible sur l'ordinateur utilisé exécutant 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 sur Windows 95/98 / ME en utilisant command.complutôt cmd.exeque comme interpréteur de commandes.

La ligne de commande set "UserChoice=!UserChoice: =!"est ajoutée pour permettre d'appeler ce fichier de commandes echo Y | call PromptExample.batsous 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 d'exécuter les deux comparaisons de chaînes.

echo Y | call PromptExample.batentraîne l' affectation de YSPACE à la variable d'environnement UserChoice. Cela entraînerait le traitement de l'invite deux fois car il "Y "n'est ni insensible à la casse "N"ni égal ni "Y"sans supprimer d'abord tous les espaces. Ainsi, UserChoiceavec YSPACE comme valeur, cela entraînerait l'exécution de l'invite une deuxième 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înerait ensuite 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 encore plus de détails sur l'utilisation de SET / P et CHOICE pour inviter l'utilisateur à choisir parmi une liste d'options, voir la réponse sur Comment empêcher l'interpréteur de commandes Windows de quitter l'exécution du fichier de commandes sur une entrée utilisateur incorrecte?

Quelques indices supplémentaires:

  1. IF compare les deux chaînes à gauche et à droite de l'opérateur de comparaison en incluant les guillemets doubles. Par conséquent, la comparaison insensible à la casse n'est pas la valeur de UserChoiceavec Net Y, mais la valeur de UserChoiceentouré de "avec "N"et "Y".
  2. Les opérateurs de comparaison IFEQU et NEQsont conçus pour comparer deux entiers compris entre -2147483648 et 2147483647 et non pour comparer deux chaînes. EQUet NEQfonctionne également pour les comparaisons de chaînes, mais résulte en la comparaison de chaînes entre guillemets doubles sur une tentative inutile de convertir la chaîne de gauche en entier. EQUet NEQne peut être utilisé qu'avec les extensions de commande activées. Les opérateurs de comparaison pour les comparaisons de chaînes sont ==et not ... ==qui fonctionnent même avec des extensions de commande désactivées, car même command.comMS-DOS et Windows 95/98 / ME les ont déjà pris en charge. Pour plus de détails sur les opérateurs de comparaison IF , voir Symbole équivalent à NEQ, LSS, GTR, etc. dans les fichiers batch Windows .
  3. La commande goto :EOFnécessite des extensions de commande activées pour vraiment quitter le traitement des fichiers de commandes. Pour plus de détails, voir Où retourne GOTO: EOF?

Pour comprendre les commandes utilisées et leur fonctionnement, ouvrez une fenêtre d'invite de commande, exécutez les commandes suivantes et lisez attentivement toutes les pages d'aide affichées pour chaque commande.

  • choice /?
  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

Voir également:


1
C'est une réponse incroyable. J'utilise uniquement Choice.exe à partir de maintenant.
Bas

choice.exe était également présent sous DOS depuis la version 6.0
Brian Minton le

@BrianMinton Ce n'est pas juste. L'application 16 bits était disponible CHOICE.COMpar défaut sur MS-DOS 6.0, MS-DOS 7.0, Windows 95 et Windows 98. Mais il n'y avait aucune choice.exeinstallation par défaut sur Windows NT4, Windows 2000 et Windows XP. CHOICE.COMpourrait également être utilisé sur NT4, Windows 2000 et Windows XP, mais il serait préférable d'utiliser 32 bits à choice.exepartir du kit de ressources approprié. Voir la page de Rob van der Woude sur le CHOIX . Les options sont en partie différentes entre CHOICE.COMet choice.exe. Cependant, la question ne concerne pas DOS.
Mofi le

5

Ici un peu plus simple:

@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%==1 goto yes
if %errorlevel%==2 goto no
:yes
echo yes
goto :EOF
:no
echo no

après le Y, mettez la commande que vous souhaitez exécuter. C'est à ça que ... sont pour :)
Bob Smith

Je voulais dire: %errorlevel%est toujours une valeur entière. Voir ici pour la documentation comprenant un exemple.
Stephan

1

Voici ma méthode de référence pour une réponse oui / non .

Il est également insensible à la casse.

Cela vérifie simplement les erreurs données par l'entrée et définit la choicevariable sur ce dont vous avez besoin afin qu'elle puisse être utilisée ci-dessous dans le code.

@echo off
choice /M "[Opt 1]  Do you want to continue [Yes/No]"
if errorlevel 255 (
  echo Error
  ) else if errorlevel 2 (
  set "YourChoice=will not"
  ) else if errorlevel 1 (
  set "YourChoice=will"
  ) else if errorlevel 0 (
  goto :EOF
  )
  echo %YourChoice%
  pause

0

Si vous voulez que le programme batch revienne à l'invite et ne ferme pas l'invite (AKA 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

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 réalisation de sauvegardes.

...

: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

Tout d'abord, ouvrez le terminal.

Ensuite, tapez

cd ~
touch .sure
chmod 700 .sure

Ensuite, ouvrez .sûr et collez-le à l'intérieur.

#!/bin/bash --init-file
PS1='> '
alias y='
    $1
    exit
'
alias n='Taskkill /IM %Terminal% /f'
echo ''
echo 'Are you sure? Answer y or n.'
echo ''

Après cela, fermez le fichier.

~/.sure ; ENTER COMMAND HERE

Cela vous donnera une invite de êtes-vous sûr avant de continuer la commande.


Peut-être en bash, mais certainement pas en batch.
Stephan

Oh. Je suppose que non. Cela ne fonctionne que pour les commandes de terminal et non les commandes par lots. Désolé pour les fausses informations.
user13636521

-1

Terminal ouvert. Tapez ce qui suit

echo>sure.sh
chmod 700 sure.sh

Collez ceci à l'intérieur de sure.sh

#!\bin\bash

echo -n 'Are you sure? [Y/n] '
read yn

if [ "$yn" = "n" ]; then
    exit 1
fi

exit 0

Fermez sure.sh et saisissez-le dans le terminal.

alias sure='~/sure&&'

Maintenant, si vous tapez sûr avant de taper la commande, il vous donnera une invite de confirmation avant de continuer la commande.

J'espère que cela vous sera utile!


Peut-être en bash, mais certainement pas en batch.
Stephan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.