2016-02-22 1 views
0

Ниже приведена моя простая калькуляторная партия, которую я пытаюсь сделать, однако на задании/не удается выполнить задание. В чем проблема и моя ошибка?set/a in Если условие оператора не работает

@echo off 
Title Calculator 
:start 
echo Press 1 for "+" 
echo Press 2 for Exit 
echo. 
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 start 
) 
if %input%==2 (
echo. 
echo Thanks! 
pause 
exit 
) else echo Invalid input! 
pause 
goto start 

Когда я впервые запускаю партию, я вернусь к отсутствующему операнду. Когда я продолжаю снова, ошибка исчезает, не давая мне ответа, когда в третий раз я продолжаю, он возвращает мне ответ числа, который я хотел бы добавить.

Например: 1. 10 + 10 результат отсутствует операнд 2. 1 + 1 результат пуст 3. 2 + 2 результат 20 (который является 2 номер я ввести в первый раз)

Пожалуйста, помогите, что моя ошибка. Благодарю.

+1

отступа строки в пределах вводных блоков кода. Вам не нужно оставлять-оправдывать все в пакетных сценариях. В любом случае вам нужно отложить расширение при извлечении переменной в том же цикле или блоке кода, в котором он был установлен. – rojo

ответ

1

Вот ваш пакетный код с использованием отсроченной расширения и отступы, как мудро предложенный 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" как это делает большой разницы, увидеть ответы на

Смежные вопросы