
Estoy intentando escribir este código:
If %dropmode%==on (
If %drop% LEQ %potiondrop% (
set /a potion=%potion%+1
)
If %drop2% LEQ %potiondrop% (
set /a potion=%potion%+1
)
)
Entonces, la condición "if %drop2% LEQ %potiondrop%" no funciona, pero "si %drop% LEQ %potiondrop%" sí funciona. ¿Qué hacer?
Respuesta1
El problema es que el símbolo del sistema/intérprete de línea de comandos (CLI) de Windows, conocido como CMD.EXE, tiene un error (bueno, estoy seguro de que Microsoft piensa que es una característica) en el que, cuando lee una construcción de bloque como IF … ( … )
o un FOR
bucle, interpreta todas las variables%variable_name%
inmediatamente, antes de que se ejecute el bucle o bloque. En su ejemplo, si potion
es 0 cuando ingresa al If %dropmode%==on ( … )
bloque, entonces todas las apariciones de %potion%
dentro de ese bloque se evalúan como 0, por lo que ambas declaraciones set
se procesan como set /a potion=0+1
, incluso si cambia potion
dentro del bloque. Esto se desprende de la salida de pantalla que informó.
La solución es decirle a CMD que permita expandir las variables en el momento adecuado, cuando se ejecutan las declaraciones que hacen referencia a ellas. Esto lo haces agregando
setlocal enabledelayedexpansion
en algún lugar cerca del comienzo de su archivo por lotes y cambiando su código de conteo para que se vea como
set /a potion=!potion!+1
usando el formulario para activar la expansión retrasada. Ver y para más información.!variable_name!
SET /?
SETLOCAL /?
PD: Otra solución es simplemente eliminar los %
caracteres de las set
declaraciones y decir
set /a potion=potion+1