Вот ваш пакетный код с использованием отсроченной расширения и отступы, как мудро предложенный rojo:
@echo off
title Calculator
setlocal EnableDelayedExpansion
:Begin
echo Press 1 for "+"
echo Press 2 for Exit
echo.
set "input="
set /P "input=Please choose your option: "
if "!input!"=="1" (
echo.
set /P "num1=Please enter first number: "
set /P "num2=Please enter second number: "
set /A ans=num1+num2
echo Your answer is !ans!
pause
cls
goto Begin
)
if "!input!"=="2" (
echo.
echo Thanks!
pause
exit /B
)
echo Invalid input!
pause
goto Begin
Переменная input
всегда очищается перед пользователем спрашивается, потому что в противном случае пользователь может просто ударить ключа RETURN или ENTER, чтобы сохранить текущее значение переменной input
.
Задержка с расширением используется при проверке ввода пользователя на 1
или 2
в случае, если пользователь вводит символ, который приведет к синтаксической ошибке при выполнении с использованием нераспределенного расширения. Лучше всего было бы использовать команду choice
для первой подсказки пользователя.
Для выражения, оцененного во время выполнения с использованием set /A
, переменные окружения могут быть указаны напрямую, без расширения вообще. Таким образом, вместо того, чтобы использовать
set /A ans=%num1%+%num2%
или
set /A ans=!num1!+!num2!
достаточно написать
set /A ans=num1+num2
, потому что с помощью параметра /A
команды set
интерпретирует num1
и num2
автоматически в качестве имен переменных.
отложенное расширение, тем не менее необходимо, чтобы напечатать значение результата, хранящееся в переменной ans
, поскольку командный процессор расширяет иначе %ans%
ничем соответственно значением предыдущего запуска на разбор всего блока, начиная с (
и заканчивая )
. Это можно увидеть при запуске вашего пакетного файла из окна командной строки с первой строкой, измененной на @echo on
для отладки.
Для получения дополнительной информации запустите в окне командной строки set /?
или help set
и прочитайте страницы справки вывода.
начало - название команды. Поэтому нехорошо использовать это слово как имя метки, хотя это возможно.
Кстати: Всегда используйте set "variable=value"
и никогда set variable="value"
как это делает большой разницы, увидеть ответы на
отступа строки в пределах вводных блоков кода. Вам не нужно оставлять-оправдывать все в пакетных сценариях. В любом случае вам нужно отложить расширение при извлечении переменной в том же цикле или блоке кода, в котором он был установлен. – rojo