Come posso creare un prompt "sei sicuro" in un file batch di Windows?


94

Ho un file batch che automatizza la copia di un gruppo di file da un posto all'altro e viceversa. L'unica cosa è che mi aiuta a continuare a selezionare accidentalmente quel comando dal mio buffer dei comandi e sovrascrivere in massa le modifiche non autorizzate.

Di quale codice avrei bisogno per il mio file .bat per far sì che dica "sei sicuro" e mi costringa a digitare "y" prima di eseguire il resto del file? Se viene digitato qualcosa tranne "y", l'esecuzione dovrebbe terminare su quella riga.

Modifica 27 novembre Ok, ho contrassegnato di nuovo questo messaggio senza risposta perché ancora non riesco a capirlo. Quando chiamo "esci"; chiude cmd.exe che non è quello che voglio. Tutto questo perché Windows ha implementato il buffer dei comandi in modo sbagliato [in modo diverso da quello a cui sono abituato almeno]

Risposte:


168

Vuoi qualcosa come:

@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
L'unica cosa che aggiungerei è un'ulteriore SET AREYOUSURE=Nprima del prompt per cancellare la scelta se hai già eseguito lo script prima in quella finestra di comando. Senza di essa il valore predefinito rimarrà la scelta precedentemente selezionata.
isapir

4
@Igal Sono abbastanza sicuro che il setlocale il endlocaldovrebbero occuparsene. %AREYOUSURE%non esisterà più dopo il endlocal.

1
@dudeprgm probabilmente hai ragione. Penso di aver perso quelli nel mio codice.
isapir

2
... sarebbe più prezioso con alcune parole esplicative sulle due linee importanti .
Wolf

@ Joe Forse non può perché (come me) non li capisce (ancora). Quindi, se lo fai, sarebbe fantastico se potessi espandere la tua risposta o collegarti a risorse che lo spiegano :)
Marcus Mangelsdorf


15

Il choicecomando non è disponibile ovunque. Con le versioni più recenti di Windows, il setcomando ha la /ppossibilità di ottenere l'input dell'utente

SET /P variable=[promptString]

vedere set /?per maggiori informazioni


... molto più perspicace di quello accettato, ma ovviamente viviamo in tempi urgenti.
Wolf

8

Sono disponibili due comandi per i prompt utente sulla riga di comando di Windows:

  • impostato con l'opzione /Pdisponibile su tutte le versioni di Windows NT con estensioni di comando abilitate e
  • choice.exe disponibile per impostazione predefinita su Windows Vista e versioni successive di Windows per utenti PC e su Windows Server 2003 e versioni successive di Windows per server.

set è un comando interno del processore dei comandi di Windows cmd.exe. L'opzione /Pper richiedere una stringa a un utente è disponibile solo con estensioni di comando abilitate che sono abilitate per impostazione predefinita, altrimenti quasi nessun file batch funzionerebbe più al giorno d'oggi.

choice.exe è un'applicazione console separata (comando esterno) situata in %SystemRoot%\System32. choice.exedi Windows Server 2003 può essere copiato nella directory %SystemRoot%\System32su una macchina Windows XP per l'utilizzo su Windows XP come molti altri comandi non disponibili per impostazione predefinita su Windows XP, ma disponibili per impostazione predefinita su Windows Server 2003.

È buona norma favorire l'utilizzo di CHOICE rispetto all'utilizzo di SET / P per i seguenti motivi:

  1. CHOICE accetta solo chiavi (rispettivamente caratteri letti da STDIN ) specificate dopo l'opzione /C(eCtrl+C ) ed emette un segnale acustico di errore se l'utente preme un tasto sbagliato.
  2. SCELTA non richiede la pressione di un tasto diverso da uno di quelli accettabili. SCELTA esce immediatamente quando viene premuto un tasto accettabile mentre SET / P richiede che l'utente termini l'inserimento con RETURNo ENTER.
  3. È possibile con SCELTA definire un'opzione predefinita e un timeout per continuare automaticamente con l'opzione predefinita dopo alcuni secondi senza attendere l'utente.
  4. L'output è migliore se si risponde automaticamente al prompt da un altro file batch che chiama il file batch con il prompt usando qualcosa di simile echo Y | call PromptExample.batall'uso di SCELTA .
  5. La valutazione della scelta dell'utente è molto più semplice con CHOICE in quanto CHOICE esce con un valore in base al tasto premuto (carattere) che viene assegnato ad ERRORLEVEL che può essere facilmente valutato successivamente.
  6. La variabile d'ambiente utilizzata su SET / P non è definita se l'utente preme solo il tasto RETURNo ENTERe non è stata definita prima di chiedere all'utente. La variabile di ambiente utilizzata sulla riga di comando SET / P mantiene il suo valore corrente se definito prima e l'utente preme solo RETURNo ENTER.
  7. L'utente ha la libertà di inserire qualsiasi cosa quando gli viene richiesto con SET / P inclusa una stringa che si traduce in seguito in un'uscita dall'esecuzione del file batch a cmdcausa di un errore di sintassi, o nell'esecuzione di comandi non inclusi affatto nel file batch o no buon file batch codificato. Ha bisogno di alcuni sforzi per ottenere SET / P sicuro contro l'input dell'utente intenzionalmente sbagliato o errato.

Di seguito è riportato un esempio di prompt che utilizza SCELTA preferita e in alternativa SET / P su choice.exenon disponibile sul computer utilizzato con 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 ...

Nota: questo file batch utilizza estensioni dei comandi che non sono disponibili su Windows 95/98 / ME utilizzando command.cominvece che cmd.execome interprete dei comandi.

La riga di comando set "UserChoice=!UserChoice: =!"viene aggiunta per rendere possibile chiamare questo file batch con echo Y | call PromptExample.batsu Windows NT4 / 2000 / XP e non richiede l'utilizzo di echo Y| call PromptExample.bat. Elimina tutti gli spazi dalla stringa letta da STDIN prima di eseguire i due confronti di stringhe.

echo Y | call PromptExample.batfa SPACE che Y venga assegnato alla variabile d'ambiente UserChoice. Ciò risulterebbe elaborando il prompt due volte perché "Y "non fa distinzione tra maiuscole e minuscole "N"e "Y"non elimina prima tutti gli spazi. Quindi UserChoicecon YSPACE come valore si otterrebbe l'esecuzione del prompt una seconda volta con l'opzione Ndefinita come predefinita nel file batch alla seconda esecuzione del prompt che successivamente si tradurrà in un'uscita imprevista dell'elaborazione del file batch. Sì, l'uso sicuro di SET / P è davvero complicato, non è vero?

Per ulteriori dettagli sull'utilizzo di SET / P e CHOICE per richiedere all'utente una scelta da un elenco di opzioni, vedere la risposta su Come impedire all'interprete dei comandi di Windows di interrompere l'esecuzione del file batch su un input utente errato?

Alcuni suggerimenti in più:

  1. IF confronta le due stringhe sinistra e destra dell'operatore di confronto includendo le virgolette doppie. Quindi case-insensitive rispetto non è il valore di UserChoicecon Ne Y, ma il valore di UserChoicecircondato da ", con "N"e "Y".
  2. Gli operatori di confronto IFEQU e NEQsono progettati come primari per confrontare due numeri interi nell'intervallo da -2147483648 a 2147483647 e non per confrontare due stringhe. EQUe NEQfunziona anche per i confronti di stringhe, ma si ottiene confrontando le stringhe tra virgolette su un inutile tentativo di convertire la stringa di sinistra in un intero. EQUe NEQpuò essere utilizzato solo con estensioni di comando abilitate. Gli operatori di confronto per i confronti di stringhe sono ==e not ... ==che funzionano anche con estensioni di comando disabilitate in quanto anche command.comMS-DOS e Windows 95/98 / ME li supportavano già. Per ulteriori dettagli sugli operatori di confronto IF , vedere Simbolo equivalente a NEQ, LSS, GTR, ecc. Nei file batch di Windows .
  3. Il comando goto :EOFrichiede estensioni di comando abilitate per uscire realmente dall'elaborazione del file batch. Per maggiori dettagli vedi Dove torna GOTO: EOF?

Per comprendere i comandi utilizzati e come funzionano, apri una finestra del prompt dei comandi, esegui i seguenti comandi e leggi attentamente tutte le pagine della guida visualizzate per ciascun comando.

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

Guarda anche:


1
Questa è una risposta incredibile. D'ora in poi sto usando solo Choice.exe.
Bas

choice.exe era in giro anche in DOS dalla 6.0
Brian Minton il

@BrianMinton Questo non è giusto. Per CHOICE.COMimpostazione predefinita, l' applicazione a 16 bit era disponibile su MS-DOS 6.0, MS-DOS 7.0, Windows 95 e Windows 98. Ma non era choice.exeinstallata di default su Windows NT4, Windows 2000 e Windows XP. CHOICE.COMpotrebbe essere utilizzato anche su NT4, Windows 2000 e Windows XP, ma sarebbe meglio utilizzare 32 bit choice.exedal kit di risorse appropriato. Vedi la pagina di Rob van der Woude su CHOICE . Le opzioni sono in parte diverse tra CHOICE.COMe choice.exe. Tuttavia, la domanda non riguarda il DOS.
Mofi

5

Qui un po 'più facile:

@echo off
set /p var=Are You Sure?[Y/N]: 
if %var%== Y goto ...
if not %var%== Y exit

o

@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

dopo la Y metti il ​​comando che vuoi che avvenga. Ecco a cosa servono i ... :)
Bob Smith

Volevo dire: %errorlevel%è sempre un valore intero. Vedi qui per la documentazione che include un esempio.
Stephan

1

Ecco il mio metodo per una risposta sì / no .

È anche case-insensitive.

Questo controlla solo gli errori dati dall'input e imposta la choicevariabile su qualsiasi cosa tu richieda in modo che possa essere utilizzata di seguito nel codice.

@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

Se vuoi che il programma batch esca nuovamente dal prompt e non chiuda il prompt (AKA cmd.exe) puoi usare "exit / b".

Questo può aiutare.

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

O se non vuoi usare tante righe ...

Set /p _sure="Are you sure?"
if /I NOT "_sure"=="y" exit /b
::Any other modifications and commands.

Spero che questo ti aiuti...


0

Ecco un semplice esempio che utilizzo in uno script di backup (.bat / batch) su Windows 10, che mi consente di avere diverse opzioni durante i backup.

...

: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!

...

Puoi averne quanti ti servono di questi blocchi.


0

Innanzitutto, apri il terminale.

Quindi, digita

cd ~
touch .sure
chmod 700 .sure

Quindi, apri .sure e incolla questo all'interno.

#!/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 ''

Dopodiché, chiudi il file.

~/.sure ; ENTER COMMAND HERE

Questo ti darà un messaggio di conferma prima di continuare il comando.


Forse in bash, ma certamente non in batch.
Stephan

Oh. Non credo. Funziona solo per i comandi del terminale, non per i comandi batch. Ci scusiamo per la falsa informazione.
user13636521

-1

Apri terminale. Digita quanto segue

echo>sure.sh
chmod 700 sure.sh

Incolla questo all'interno di sure.sh

#!\bin\bash

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

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

exit 0

Chiudi sure.sh e digita questo nel terminale.

alias sure='~/sure&&'

Ora, se si digita sicuro prima di digitare il comando, verrà visualizzato un messaggio di conferma prima di continuare il comando.

Spero che questo sia utile!


Forse in bash, ma certamente non in batch.
Stephan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.