Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: 0x0309 en 15 Marzo 2009, 11:09 AM

Título: [Batch] Técnica: Realizar doble expansión retardada
Publicado por: 0x0309 en 15 Marzo 2009, 11:09 AM
Puede que casi nunca se use esto, pero yo actualizando mi juego worm hecho en batch, tuve la necesidad de hacer una doble expansión retardada, ya que estaba dentro de un if, y lo hice usando for.

Ejemplo (no del código del juego, simplemente para explicar esto):

@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:


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
)
)

Este código lo que hace es intentar 5 veces encontrar una variable BOARD[X][Y] aleatoria con contenido igual a "vacío" para asignar otro valor, en este caso: "comida"
Ah, y el goto es para quebrar el for.
Título: Re: [Batch] Técnica: Realizar doble expansión retardada
Publicado por: SmartGenius en 15 Marzo 2009, 19:45 PM
Muy bien mi querido amigo, gracias por el aporte...esta muy bueno  :D

Saludos.
Título: Re: [Batch] Técnica: Realizar doble expansión retardada
Publicado por: Littlehorse en 15 Marzo 2009, 20:10 PM
Estas a full 0x0309, muy bueno  :)