Arquivo em lote. Se declarações em declarações if

0

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?

    
por user339962 30.06.2014 / 17:25

1 resposta

1

O problema é que o Prompt de Comando do Windows / Interpretador de Linha de Comando (CLI), conhecido como CMD.EXE, tem um bug (bem, eu tenho certeza que a Microsoft acha que é um recurso) em que, quando lê uma construção de bloco como IF … ( … ) ou 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ê inserir o bloco If %dropmode%==on ( … ) , então todas as ocorrências de %potion% dentro desse bloco são avaliadas como 0, e, assim, ambas as suas instruções set são processadas como set /a potion=0+1 , mesmo se você alterar potion dentro do bloco. Isso é evidente na saída de tela que você relatou.

A correção é dizer ao CMD para permitir que as variáveis sejam expandidas no momento certo, quando as declarações referentes a eles são executadas. Você faz isso adicionando

setlocal enabledelayedexpansion

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

    set /a potion=!potion!+1

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

P.S. Outra solução é simplesmente remover os caracteres % das declarações set e diga

set /a potion=potion+1
    
por 30.06.2014 / 22:13