Пакетный файл. Операторы if в операторах if

Пакетный файл. Операторы if в операторах if

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

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

Связанный контент