Проблема заключается в том, что в командной строке 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