Arquivo em lote. Instruções if em instruções if

Arquivo em lote. Instruções if em instruções if

Estou tentando escrever este código:

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

Portanto, a condição "if %drop2% LEQ %potiondrop%" não funciona, mas "if %drop% LEQ %potiondrop%" está funcionando. O que fazer?

Responder1

O problema é que o Prompt de Comando / Interpretador de Linha de Comando (CLI) do Windows, conhecido como CMD.EXE, tem um bug (bem, tenho certeza que a Microsoft pensa que é um recurso) em que, quando lê uma construção de bloco como IF … ( … )ou um FORloop, ele interpreta todas as variáveis%variable_name%imediatamente, antes que o loop ou bloco seja executado. No seu exemplo, se potionfor 0 quando você entrar no If %dropmode%==on ( … )bloco, todas as ocorrências %potion%dentro desse bloco serão avaliadas como 0 e, portanto, ambas as setinstruções serão processadas como set /a potion=0+1, mesmo se você alterar potiondentro do bloco. Isso fica evidente na saída da tela relatada.

A solução é dizer ao CMD para permitir que as variáveis ​​sejam expandidas no momento certo, quando as instruções referentes a elas forem executadas. Você faz isso adicionando

setlocal enabledelayedexpansion

em algum lugar próximo ao início do seu arquivo em lote e alterando seu código de contagem para parecer

    set /a potion=!potion!+1

usando o formulário para ativar a expansão atrasada. Consulte e para mais informações.!variable_name!SET /?SETLOCAL /?


PS Outra solução é simplesmente remover os %caracteres das setdeclarações e dizer

set /a potion=potion+1

informação relacionada