set "_money=500"
set "_22pistolammo=500"
set /a "_22pistolammo-=3"
set "_gunstore=0"
set /p "_gunstore="
if %_gunstore% == 1 set /a "_22silencedpistol+=1"
if %_gunstore% == 1 set /a "_money-=450"
if %_gunstore% == 2 set /a "_22pistolammo+=10"
if %_gunstore% == 2 set /a "_money-=10
if %_money% lss 0 echo goto gunstoredeath
if %_gunstore% == 3 echo goto fargomarketstreet
echo goto gunstore
set _
Это похоже на код вопроса.Переменные начинаются со знака подчеркивания, чтобы избежать переменных, начинающихся с числа, которое может быть недопустимым, и его легко вывести с помощью set _
для этих примеров.
Проблема: это может привести к синтаксической ошибке, если вы введете пробел или другие специальныесимвол в строке ввода.
set "_money=500"
set "_22pistolammo=500"
set /a "_22pistolammo-=3"
choice /c 123 /N
if errorlevel 1 (set /a "_22silencedpistol+=1" & set /a "_money-=450")
if errorlevel 2 (set /a "_22pistolammo+=10" & set /a "_money-=10")
if %_money% lss 0 echo goto gunstoredeath
if errorlevel 3 echo goto fargomarketstreet
echo goto gunstore
set _
Используется if errorlevel
.Если в приглашении введено 3
, все условия будут запущены из-за того, что if errorlevel 1
равно 1 или больше, что верно, if errorlevel 2
равно 2 или больше, что верно, и if errorlevel 3
равно 3 или больше,что также верно.
Проблема: ошибка.
Чтобы проверить с помощью if errorlevel
, вам может потребоваться проверка от наивысшего к низшему.
Блок типаэто можно попробовать:
if errorlevel 3 (
echo goto fargomarketstreet
) else if errorlevel 2 (
set /a "_22pistolammo+=10"
set /a "_money-=10"
) else if errorlevel 1 (
set /a "_22silencedpistol+=1"
set /a "_money-=450"
)
Это может сработать, за исключением того, что первоначальная последовательность - это проверка 1, проверка 2, проверка денег, а затем проверка 3. Если вы вынуждены сначала проверить 3, то проверка денег должна бытьпроверено перед проверкой 3, что слишком рано для проверки 1 (которая корректирует деньги) и проверки 2 (которая корректирует деньги).
Проблема: ошибка.
Использование if %errorlevel%
вместо if errorlevel
дает поведение, аналогичное 1-му коду:
set "_money=500"
set "_22pistolammo=500"
set /a "_22pistolammo-=3"
choice /c 123 /N
if %errorlevel% equ 1 (
set /a "_22silencedpistol+=1"
set /a "_money-=450"
) else if %errorlevel% equ 2 (
set /a "_22pistolammo+=10"
set /a "_money-=10"
)
if %_money% lss 0 echo goto gunstoredeath
if %errorlevel% equ 3 echo goto fargomarketstreet
if %_money% lss 0 echo goto gunstoredeath
echo goto gunstore
set _
Проверяет 1, еще проверяет 2, проверяет деньги, затем проверяет 3.
Проблема: неизвестна.(за исключением choice
не существует в Windows XP).
Примечание :
Все приведенные выше коды отключены goto
с использованием ведущего echo
, так как в коде нет меток для goto
.
Проверка 3 может означать проверку значения со значением 3 и т. д. Я хотел бы избежать обобщения огромной суммы с длинными повторяющимися терминами.
Предложите использовать 1-й код (с использованием set /p
) или последний (с использованием choice
).
Переменные не могут начинаться с чисел, так как %22silencedpistol%
будет проанализирован как %2
, что2-й ( script | называется label ) аргумент, а затем анализирует 2silencedpistol%
, что может вызвать синтаксическую ошибку.Синтаксический анализатор не знает, что %22silencedpistol%
является одной переменной, и соглашается на ленивое совпадение %2
, которое он распознает 1-м.