Я пытаюсь написать этот код:

If %dropmode%==on (
If %drop% LEQ %potiondrop% (
set /a potion=%potion%+1
)
If %drop2% LEQ %potiondrop% (
set /a potion=%potion%+1
)
)

Итак, условие «if% drop2% LEQ% potiondrop%» не работает, но «если% drop% LEQ% potiondrop%» работает. Что делать?

1 ответ1

1

Проблема заключается в том, что в командной строке Windows / интерпретаторе командной строки (CLI), известном как CMD.EXE, есть ошибка (ну, я уверен, что Microsoft считает, что это особенность), когда она читает блок-конструкцию, такую как IF … ( … ) Или цикл FOR , он интерпретирует все %variable_name% variable_name % непосредственно перед выполнением цикла или блока.  В вашем примере, если potion равно 0, когда вы входите в If %dropmode%==on ( … ) , тогда все вхождения %potion% внутри этого блока оцениваются в 0, и поэтому оба ваших оператора set обрабатываются как set /a potion=0+1 , даже если вы меняете potion внутри блока.  Это видно из вывода на экран вашего сообщения.

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

setlocal enabledelayedexpansion

где-то рядом с началом вашего пакетного файла, и изменение кода подсчета, чтобы выглядеть так

    set /a potion=!potion!+1

используя !variable_name! Форма для активации отложенного расширения. Смотрите SET /? и SETLOCAL /? для дополнительной информации.


PS Другое решение - просто удалить символы % из set операторов и сказать

set /a potion=potion+1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .