Citar
Me he tomado la molestia d emodificar y organizar el Tutorial de Fakher, aparte de añadirle algo d einfo...espero no le importe
Técnicamente se definiría a la polimétrica como un código capaz de auto manipularse para lograr obtener valores reales de una variable e integrarlos en otras...
La polimétrica consiste en usar variables dentro de variables y obtener un código que puede ser recursivo y con aplicación al polimorfismo, puede hacerse uso de las expansiones de variables para obtener códigos optimizados de programas que normalmente llevarían muchas líneas de código.
Tomemos como ejemplo un código que nos Genera una Función llamada "Echo Dinámico" o "Efecto Maquina de Escribir".
Citar
Ej. set a=%a:~0,%f%%
El problema reside en que la Consola de Comandos (CMD) lee lo que se encuentre entre porcentajes como una variable, por lo que en el ejemplo anterior le pedimos al programa que defina una variable que sea igual al valor que tenga la variable %a:~0,%(cuyo valor es 0..."" nulo) que tenga una cadena con el contenido "f" y otra variable que se llame %% (cuyo valor también es "" nulo) por lo tanto el valor de la variable a seria "f".
Entonces la solución seria definir unas "subvariables" y luego juntarlas en la variable final, o haciendo uso de varias símbolos de porcentajes (%) recurriendo a la redirección a archivos externos temporales o uso de CALL. Tambien tenemos otras formas usando SETLOCAL ENABLEDELAYEDEXPANSION pero eso lo explicaremos mas
adelante...
Código:
@echo off
REM Echo Dinamico by Fhaker
copy %0 tempcode.txt
cls
set /p a=Echo Dinamico:
set b=""
goto start
:start
if %a%==%b% type tempcode.txt >%0 && goto control
set /a f=%f%+1
if %f%==1 echo "" >>%0
set h=%a:~0,
set l=%h%%f%%o%
echo :menu%f% >>%0
echo set b=%%%l%%% >>%0
echo goto start >>%0
goto menu%f%
:control
set k=%f%
set /a kk=%f%+2
set f=0
goto menu
:menu
set /a f=%f%+1
if %f%==%kk% pause && type tempcode.txt >%0 && goto fin
set h=%a:~0,
set l=%h%%f%%o%
echo :menu%f% >>%0
echo cls >>%0
echo set b=%%%l%%% >>%0
if not %f%==1 echo echo %b%_ >>%0
echo goto menu >>%0
ping -n 1,5 127.0.0.1 >nul
goto menu%f%
:fin
del /f /q tempcode.txt
exit
Lo que hace esto es definir una variable que contenga la cadena %a:~0, que como podrán ver tiene un porcentaje adelante y por lo cual al no cerrarse la supuesta variable el porcentaje queda en la cadena...
Después lo que se hace es unir en la variable %l% la variable %h% que es la recién creada, la variable %f% que es la que contiene el numero de bucle, de menú y de letra que el programa va a mostrar usando la expansión de la variable %a%, y la variable %o% que no tiene nada.
Entonces el Código realiza lo siguiente:
1. Se copia así mismo en un Archivo Temporal (Respaldo).
2. Se pide al Usuario que Introduzca una Dato.
3. Se hacen las comprobaciones para cuando el Dato ha sido mostrado en su totalidad.
4. Se definen las Variables antes mencionadas y luego se hace la expansión.
5. Se genera una nueva parte de código que es introducida al Final del archivo actual.
6. Se va mostrando el Dato carácter por carácter y una vez llegado al último finaliza el bucle y termina el código.
7. Se restablece el archivo original desde el Respaldo creado al Inicio.
Este Código puede optimizarse aun más:
Código:
@echo off
REM Echo Dinamico by Fhaker
REM Optimized by ::SmartGenius::
copy %0 tempcode.txt
cls
set /p a=Echo Dinamico:
set b=
goto start
:start
set /a f=%f%+1
if %f%==1 echo ::Inicio Code Generado >>%0
set h=%a:~0,
set l=%h%%f%%o%
echo :menu%f% >>%0
echo cls >>%0
echo set b=%%%l%%% >>%0
echo echo %b%_ >>%0
echo if "%b%"=="%a% " goto fin >>%0
echo goto start >>%0
ping -n 2 0.0.0.0 >nul
goto menu%f%
:fin
pause
exit
Este último realiza la misma acción pero se eliminaron unas estructuras de control innecesarias y mejora el código.
Haciendo la prueba al código, lo guardamos como DYNECHO.BAT, lo ejecutamos e introducimos como dato "Hola", se muestra el efecto de escritura carácter por carácter" o "Maquina de Escribir", una vez que finaliza el código se procede a mirar el código fuente de DYNECHO.BAT y veremos el cambio.
continua....