Hay dos comandos disponibles para las indicaciones del usuario en la línea de comandos de Windows:
- establecer con la opción
/P
disponible en todas las versiones de Windows NT con extensiones de comando habilitados y
- choice.exe disponible de forma predeterminada en Windows Vista y versiones posteriores de Windows para usuarios de PC y en Windows Server 2003 y versiones posteriores de servidor de Windows.
set es un comando interno del procesador de comandos de Windows cmd.exe
. La opción /P
de pedirle a un usuario una cadena está disponible solo con las extensiones de comando habilitadas que están habilitadas de manera predeterminada, ya que de lo contrario casi ningún archivo por lotes funcionaría hoy en día.
choice.exe es una aplicación de consola separada (comando externo) ubicada en %SystemRoot%\System32
. choice.exe
de Windows Server 2003 se puede copiar en el directorio %SystemRoot%\System32
de una máquina con Windows XP para su uso en Windows XP, como muchos otros comandos no disponibles de forma predeterminada en Windows XP, pero disponibles de forma predeterminada en Windows Server 2003.
Es una buena práctica favorecer el uso de CHOICE sobre el uso de SET / P debido a las siguientes razones:
- CHOICE acepta solo las teclas (respectivamente caracteres leídos de STDIN ) especificadas después de la opción
/C
(y Ctrl+C) y emite un pitido de error si el usuario presiona una tecla incorrecta.
- CHOICE no requiere presionar ninguna otra tecla que no sea una de las aceptables. CHOICE sale inmediatamente una vez que se presiona una tecla aceptable, mientras que SET / P requiere que el usuario termine la entrada con RETURNo ENTER.
- Es posible con CHOICE definir una opción predeterminada y un tiempo de espera para continuar automáticamente con la opción predeterminada después de algunos segundos sin esperar al usuario.
- La salida es mejor al responder el mensaje automáticamente desde otro archivo por lotes que llama al archivo por lotes con el mensaje usando algo como
echo Y | call PromptExample.bat
el uso de CHOICE .
- La evaluación de la elección del usuario es mucho más fácil con CHOICE debido a que CHOICE sale con un valor de acuerdo con la tecla presionada (carácter) que se asigna a ERRORLEVEL que se puede evaluar fácilmente a continuación.
- La variable de entorno utilizada en SET / P no se define si el usuario presiona solo la tecla RETURNo ENTERy no se definió antes de preguntarle al usuario. La variable de entorno utilizada en la línea de comando SET / P mantiene su valor actual si se definió antes y el usuario presiona RETURNo ENTER.
- El usuario tiene la libertad de ingresar cualquier cosa cuando se le solicite SET / P, incluida una cadena que resulte más tarde en una salida de la ejecución del archivo por lotes
cmd
debido a un error de sintaxis, o en la ejecución de comandos no incluidos en absoluto en el archivo por lotes en buen archivo por lotes codificado. Se necesitan algunos esfuerzos para conseguir que SET / P esté seguro contra un error o una entrada intencionalmente incorrecta del usuario.
A continuación, se muestra un ejemplo rápido en el que se usa OPCIÓN preferida y, alternativamente, SET / P en choice.exe
no disponible en computadoras usadas 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: Este archivo por lotes utiliza extensiones de comando que no están disponibles en Windows 95/98 / ME en command.com
lugar de cmd.exe
como intérprete de comandos.
La línea de comando set "UserChoice=!UserChoice: =!"
se agrega para que sea posible llamar a este archivo por lotes echo Y | call PromptExample.bat
en Windows NT4 / 2000 / XP y no requiere el uso de echo Y| call PromptExample.bat
. Elimina todos los espacios de la cadena leída desde STDIN antes de ejecutar las dos comparaciones de cadenas.
echo Y | call PromptExample.bat
da como resultado que YSPACE se asigne a la variable de entorno UserChoice
. Eso resultaría en procesar el mensaje dos veces debido a "Y "
que no es igual a mayúsculas y minúsculas "N"
ni "Y"
sin eliminar primero todos los espacios. Entonces, UserChoice
con YSPACE como valor resultaría en ejecutar el mensaje por segunda vez con la opción N
definida como predeterminada en el archivo por lotes en la segunda ejecución del mensaje, lo que a continuación da como resultado una salida inesperada del procesamiento del archivo por lotes. Sí, el uso seguro de SET / P es realmente complicado, ¿no?
Para obtener aún más detalles sobre el uso de SET / P y CHOICE para solicitar al usuario una elección de una lista de opciones, consulte la respuesta sobre ¿Cómo evitar que el intérprete de comandos de Windows salga de la ejecución de archivos por lotes en una entrada de usuario incorrecta?
Algunas sugerencias más:
- IF compara las dos cadenas izquierda y derecha del operador de comparación con la inclusión de comillas dobles. Por lo tanto, la comparación que no distingue entre mayúsculas y minúsculas no es el valor de
UserChoice
con N
y Y
, sino el valor de UserChoice
rodeado por "
con "N"
y "Y"
.
- Los operadores de comparación IF
EQU
y NEQ
están diseñados principalmente para comparar dos enteros en el rango -2147483648 a 2147483647 y no para comparar dos cadenas. EQU
y NEQ
funciona también para las comparaciones de cadenas, pero resulta en comparar cadenas entre comillas dobles en un intento inútil de convertir la cadena izquierda en un entero. EQU
y solo NEQ
se puede usar con extensiones de comando habilitadas. Los operadores de comparación para las comparaciones de cadenas son ==
y not ... ==
que funcionan incluso con extensiones de comando deshabilitadas, ya que incluso command.com
MS-DOS y Windows 95/98 / ME ya las admitían. Para obtener más detalles sobre los operadores de comparación IF , consulte Símbolo equivalente a NEQ, LSS, GTR, etc. en archivos por lotes de Windows .
- El comando
goto :EOF
requiere extensiones de comando habilitadas para salir realmente del procesamiento de archivos por lotes. Para obtener más detalles, consulte ¿A dónde vuelve GOTO: EOF?
Para comprender los comandos utilizados y cómo funcionan, abra una ventana de símbolo del sistema, ejecute allí los siguientes comandos y lea todas las páginas de ayuda que se muestran para cada comando con mucho cuidado.
choice /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
Ver también:
SET AREYOUSURE=N
antes del indicador para borrar la opción si ya ejecutó el script antes en esa ventana de comando. Sin él, el valor predeterminado seguirá siendo la opción seleccionada anteriormente.