elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Batch] Técnica: Realizar doble expansión retardada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Batch] Técnica: Realizar doble expansión retardada  (Leído 4,025 veces)
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
[Batch] Técnica: Realizar doble expansión retardada
« 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):
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
)
)
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.


« Última modificación: 15 Marzo 2009, 11:14 am por 0x0309 » En línea

SmartGenius

Desconectado Desconectado

Mensajes: 181


:P


Ver Perfil WWW
Re: [Batch] Técnica: Realizar doble expansión retardada
« Respuesta #1 en: 15 Marzo 2009, 19:45 pm »

Muy bien mi querido amigo, gracias por el aporte...esta muy bueno  :D

Saludos.


« Última modificación: 22 Marzo 2009, 19:45 pm por :: SmartGenius :: » En línea


Littlehorse
All the world's a stage
Colaborador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [Batch] Técnica: Realizar doble expansión retardada
« Respuesta #2 en: 15 Marzo 2009, 20:10 pm »

Estas a full 0x0309, muy bueno  :)
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[BATCH] realizar búsquedas automáticas en web « 1 2 »
Scripting
alehopio 11 9,896 Último mensaje 15 Enero 2014, 12:39 pm
por alehopio
Batch Eliminar Doble Extensión (SOLUCIONADO) « 1 2 »
Scripting
kaisersouse2 18 11,998 Último mensaje 30 Septiembre 2015, 23:03 pm
por Eleкtro
[Ayuda] Arrastrar a icono batch y realizar conversion FFmpeg
Scripting
frenchiveruti 3 2,878 Último mensaje 16 Enero 2016, 07:46 am
por frenchiveruti
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines