Archivo por lotes. Declaraciones if en declaraciones if

Archivo por lotes. Declaraciones if en declaraciones if

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 FORbucle, interpreta todas las variables%variable_name%inmediatamente, antes de que se ejecute el bucle o bloque. En su ejemplo, si potiones 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 setse procesan como set /a potion=0+1, incluso si cambia potiondentro 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 setdeclaraciones y decir

set /a potion=potion+1

información relacionada