
Я пытаюсь написать этот код:
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%" не работает, а "if %drop% LEQ %potiondrop%" работает. Что делать?
решение1
Проблема в том, что командная строка Windows / интерпретатор командной строки (CLI), известный как CMD.EXE, имеет ошибку (ну, я уверен, Microsoft думает, что это функция), при которой при считывании блочной конструкции, например, IF … ( … )
или FOR
цикла, он интерпретирует все переменные%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