Удалите кавычки для выполнения числовых сравнений:
set /p option="Enter option (1-10): "
if %option% geq 1 if %option% leq 10 (
echo %option% is greater than or qual to 1, and is less than or equal to 10
) else (
echo Invalid option %option%
)
С помощью кавычек вы вынуждены сравнивать строки, поскольку на самом деле они также являются частью сравниваемых значений.Если какой-либо из них не является числовым (что имеет место, если один из них или оба содержат кавычки), используется сравнение строк или алфавитов, где 2
больше 10
, поскольку символ 2
получилкод выше 1
.
Этот подход не работает, если входное значение %option%
пусто;вы можете противодействовать, используя if defined
:
:LOOP
rem // Reset variable, so it is empty if user just presses {Enter}:
set "option="
set /P option="Enter option (1-10): "
rem // Jump back to prompt if user did not enter anything:
if not defined option goto :LOOP
if %option% geq 1 if %option% leq 10 (
echo %option% is greater than or qual to 1, and is less than or equal to 10
) else (
echo Invalid option %option%
)
Или вы можете заставить значение быть числовым, пытаясь преобразовать с помощью set /A
;это безопаснее, чем в предыдущем варианте, поскольку он работает даже в том случае, если запись пользователя содержит "
и другие специальные символы:
set "option="
set /P option="Enter option (1-10): "
rem // Convert user entry to numeric value:
set /A "comp=option"
if %comp% geq 1 if %comp% leq 10 (
echo %option% is greater than or qual to 1, and is less than or equal to 10
) else (
echo Invalid option %option%
)
Конечно Расширение с отложенной переменной можно использовать какхорошо, чтобы избежать проблем с пустыми значениями или специальными символами:
set "option="
set /P option="Enter option (1-10): "
rem // Delayed expansion even allows to compare empty values and even to safely echo all possible strings:
setlocal EnableDelayedExpansion
if !option! geq 1 if !option! leq 10 (
echo !option! is greater than or qual to 1, and is less than or equal to 10
) else (
echo Invalid option !option!
)
endlocal
Давайте теперь сосредоточимся на самом условии if
(с задержанным расширением здесь) и перепишем его немного:
if !option! geq 1 (
if !option! leq 10 (
echo !option! is greater than or qual to 1, and is less than or equal to 10
) else (
echo Invalid option !option!
)
)
Теперь вы можете четко видеть, что случай, когда !option!
меньше 1
, не обрабатывается;для этого вам понадобится еще одно else
предложение:
if !option! geq 1 (
if !option! leq 10 (
echo !option! is greater than or qual to 1, and is less than or equal to 10
) else (
echo Invalid option !option!
)
) else (
echo Invalid option !option!
)
Или вы просто используете goto
, чтобы выполнить то же самое:
if !option! geq 1 if !option! leq 10 goto :NEXT
echo Invalid option !option!
goto :EOF
:NEXT
echo !option! is greater than or qual to 1, and is less than or equal to 10