Ejemplo (no del código del juego, simplemente para explicar esto):
Código:
@echo off
setlocal enabledelayedexpansion
set tabla[0]=Multics
set tabla[1]=Unix
set tabla[2]=BSD
set tabla[3]=Linux
set tabla[4]=Windows9x
set tabla[5]=WindowsNT
set tabla[6]=SanOS
set tabla[7]=JOs
set tabla[8]=OpenSuse
set tabla[9]=Windows7
for /l %%a in (0,1,4) do call :test numero %%a
pause
goto :eof
:test
if %1==numero (
set nombreTabla=tabla[%2]
rem if !%nombreTabla%!
rem no se puede hacer esto dentro del if
rem porque la variable nombreTabla
rem la declaramos o actualizamos dentro del if
rem por lo tanto la expansión simple no funcionaría (%)
rem y necesitamos expansión retarada (!) doble
rem Como? con el for
rem dentro del for /f en in hacemos una expansion retardada y en el do hacemos la siguiente, también retardada del contenido de la expansión anterior.
for /f "tokens=* eol=" %%v in ("!nombreTabla!") do if !%%v!==Windows9x (
set %%v=WindowsNT
rem o set !nombreTabla!=WindowsNT
)
)
echo.............
set nombreTabla
set tabla[4]
set tabla[5]
echo.............
goto :eof
El truco está: en !%%v!
Esto es un solo un ejemplo solo para demostrar como realizar una doble expansión retardada dentro de un if usando el for /f. Alguien podría decir que la solución al problema es:
if !tabla[%2]!==Windows9x (set tabla[%2]=WindowsNt)
pero el código es solo un ejemplo, y el problema es que estaba dentro de un if.
Esto es solo para casos especiales. El código del juego realmente no estaba dentro de un if sino dentro de un for, pero ambos, tanto if como for expanden de manera simple en la entrada y no en la ejecución:
Código:
FOR /L %%A IN (0,1,5) DO (
SET "_CANDIDATE=BOARD[!RANDOM:~-1!][!RANDOM:~-1!]"
FOR /F "TOKENS=1 DELIMS==" %%B IN ("!_CANDIDATE!") DO IF ^!%%B! EQU ^° (
SET "!_CANDIDATE!=Ï"
GOTO :PLAY
)
)
Ah, y el goto es para quebrar el for.