Existem dois comandos disponíveis para prompts do usuário na linha de comando do Windows:
- definido com opção
/P
disponível em todas as versões do Windows NT com extensões de comando habilitadas e
- choice.exe disponível por padrão no Windows Vista e versões posteriores do Windows para usuários de PC e no Windows Server 2003 e versões de servidor posteriores do Windows.
conjunto é um comando interno do processador de comandos do Windows cmd.exe
. A opção /P
de solicitar uma string ao usuário está disponível apenas com extensões de comando habilitadas que são habilitadas por padrão, caso contrário quase nenhum arquivo em lote funcionaria mais hoje em dia.
choice.exe é um aplicativo de console separado (comando externo) localizado em%SystemRoot%\System32
. choice.exe
do Windows Server 2003 pode ser copiado para o diretório %SystemRoot%\System32
em uma máquina com Windows XP para uso no Windows XP como muitos outros comandos não disponíveis por padrão no Windows XP, mas disponíveis por padrão no Windows Server 2003.
É uma prática recomendada favorecer o uso de CHOICE sobre o uso de SET / P pelos seguintes motivos:
- CHOICE aceita apenas chaves (respectivamente caracteres lidos de STDIN ) especificadas após a opção
/C
(e Ctrl+C) e emite um bipe de erro se o usuário pressionar uma tecla errada.
- CHOICE não requer o pressionamento de nenhuma outra tecla além das aceitáveis. CHOICE sai imediatamente uma vez que uma tecla aceitável é pressionada enquanto SET / P requer que o usuário termine a entrada comRETURN ou ENTER.
- É possível com CHOICE definir uma opção padrão e um tempo limite para continuar automaticamente com a opção padrão após alguns segundos sem esperar pelo usuário.
- A saída é melhor em responder a solicitação automaticamente a partir de outro arquivo batch que chama o arquivo de lote com o prompt usando algo como
echo Y | call PromptExample.bat
sobre o uso de ESCOLHA .
- A avaliação da escolha do usuário é muito mais fácil com CHOICE porque CHOICE sai com um valor de acordo com a tecla pressionada (caractere) que é atribuído a ERRORLEVEL que pode ser facilmente avaliado a seguir.
- A variável de ambiente usada em SET / P não é definida se o usuário pressiona apenas a tecla RETURNou ENTERe não foi definida antes de solicitar ao usuário. A variável de ambiente usada na linha de comando SET / P mantém seu valor atual se definido antes e o usuário pressiona apenas RETURNou ENTER.
- O usuário tem a liberdade de inserir qualquer coisa ao ser solicitado com SET / P, incluindo uma string que resulta posteriormente em uma saída da execução do arquivo em lote por
cmd
causa de um erro de sintaxe, ou na execução de comandos não incluídos no arquivo em lote ou não bom arquivo em lote codificado. É necessário algum esforço para proteger o SET / P contra entrada do usuário intencionalmente errada ou por engano.
Aqui está um exemplo aviso usando preferido CHOICE e, alternativamente SET / P em choice.exe
não disponível no computador usado com o 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: Este arquivo em lote usa extensões de comando que não estão disponíveis no Windows 95/98 / ME em command.com
vez de cmd.exe
como interpretador de comando.
A linha de comando set "UserChoice=!UserChoice: =!"
é adicionada para possibilitar a chamada desse arquivo em lote echo Y | call PromptExample.bat
no Windows NT4 / 2000 / XP e não requer o uso de echo Y| call PromptExample.bat
. Ele exclui todos os espaços da string lida de STDIN antes de executar as duas comparações de string.
echo Y | call PromptExample.bat
resulta em YSPACE sendo atribuído à variável de ambiente UserChoice
. Isso resultaria no processamento do prompt duas vezes porque de "Y "
não faz distinção entre maiúsculas e minúsculas "N"
nem "Y"
sem excluir primeiro todos os espaços. Portanto, UserChoice
com YSPACE como valor resultaria na execução do prompt uma segunda vez com a opção N
definida como padrão no arquivo em lote na segunda execução do prompt, que em seguida resulta em uma saída inesperada do processamento do arquivo em lote. Sim, uso seguro de SET / P é realmente complicado, não é?
Para obter ainda mais detalhes sobre o uso de SET / P e CHOICE para solicitar ao usuário uma escolha em uma lista de opções, consulte a resposta em Como impedir o interpretador de comandos do Windows de encerrar a execução do arquivo em lote com uma entrada incorreta do usuário?
Mais algumas dicas:
- IF compara as duas strings à esquerda e à direita do operador de comparação incluindo as aspas duplas. Então, case-insensitive comparação não é o valor de
UserChoice
com N
e Y
, mas o valor da UserChoice
cercado por "
com "N"
e "Y"
.
- As IF operadores de comparação
EQU
e NEQ
são projetados primário para comparação de dois números inteiros no intervalo de -2147483648 a 2147483647 e não para comparar duas cadeias. EQU
e NEQ
funcionam também para comparações de strings, mas resultam na comparação de strings entre aspas duplas em uma tentativa inútil de converter a string esquerda em um inteiro. EQU
e NEQ
pode ser usado apenas com extensões de comando habilitadas. Os operadores de comparação para comparações de strings são ==
e not ... ==
que funcionam mesmo com extensões de comando desabilitadas, já que o command.com
MS-DOS e o Windows 95/98 / ME já os suportam. Para obter mais detalhes sobre os operadores de comparação IF , consulte Símbolo equivalente a NEQ, LSS, GTR, etc. em arquivos em lote do Windows .
- O comando
goto :EOF
requer extensões de comando ativadas para realmente sair do processamento do arquivo em lote. Para obter mais detalhes, consulte Para onde GOTO: EOF retorna?
Para entender os comandos usados e como eles funcionam, abra uma janela de prompt de comando, execute lá os seguintes comandos e leia todas as páginas de ajuda exibidas para cada comando com muito cuidado.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
Veja também:
SET AREYOUSURE=N
antes do prompt para limpar a escolha se você já executou o script antes na janela de comando. Sem ele, o padrão permanecerá a escolha selecionada anteriormente.