
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 FOR
loop, ele interpreta todas as variáveis%variable_name%
imediatamente, antes que o loop ou bloco seja executado. No seu exemplo, se potion
for 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 set
instruções serão processadas como set /a potion=0+1
, mesmo se você alterar potion
dentro 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 set
declarações e dizer
set /a potion=potion+1