Sono disponibili due comandi per i prompt utente sulla riga di comando di Windows:
- impostato con l'opzione
/P
disponibile 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 /P
per 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.exe
di Windows Server 2003 può essere copiato nella directory %SystemRoot%\System32
su 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:
- 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.
- 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.
- È possibile con SCELTA definire un'opzione predefinita e un timeout per continuare automaticamente con l'opzione predefinita dopo alcuni secondi senza attendere l'utente.
- 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.bat
all'uso di SCELTA .
- 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.
- 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.
- 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
cmd
causa 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.exe
non 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.com
invece che cmd.exe
come interprete dei comandi.
La riga di comando set "UserChoice=!UserChoice: =!"
viene aggiunta per rendere possibile chiamare questo file batch con echo Y | call PromptExample.bat
su 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.bat
fa sì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 UserChoice
con YSPACE come valore si otterrebbe l'esecuzione del prompt una seconda volta con l'opzione N
definita 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ù:
- IF confronta le due stringhe sinistra e destra dell'operatore di confronto includendo le virgolette doppie. Quindi case-insensitive rispetto non è il valore di
UserChoice
con N
e Y
, ma il valore di UserChoice
circondato da "
, con "N"
e "Y"
.
- Gli operatori di confronto IF
EQU
e NEQ
sono progettati come primari per confrontare due numeri interi nell'intervallo da -2147483648 a 2147483647 e non per confrontare due stringhe. EQU
e NEQ
funziona 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. EQU
e NEQ
può 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.com
MS-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 .
- Il comando
goto :EOF
richiede 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:
SET AREYOUSURE=N
prima 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.