Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Binary_Death en 5 Agosto 2010, 15:48 pm



Título: Menú de selección en Batch
Publicado por: Binary_Death en 5 Agosto 2010, 15:48 pm
Pues... esto pertenecía a un proyecto que quedó bastante en el aire... y bueh, aquí lo dejo, a ver que tal, porque me parece un método interesante  :P

Código:
@ECHO OFF
@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@MODE CON COLS=80 LINES=25
@COLOR 0F
@TITLE BOOT
@REM CODED BY BINARY_DEATH
@REM DATA: LAST LINE: 12
:BIOS
CALL:LOAD_KEYBOARD
CALL:LOAD_GRAPHIC
CALL:GRAPHIC_LOAD "!LOGO!"
SET/A INDEX=0,LIMIT=2
:MENU
SET/A COUNT=0
FOR %%I IN (CHANGE,START,SETTINGS) DO (
IF !INDEX! EQU !COUNT! (
SET VAR=!%%I:@=F!&&SET VAR=!VAR:#=F0!
CALL:GRAPHIC_LOAD "!VAR!"
) ELSE (
SET VAR=!%%I:@=0!&&SET VAR=!VAR:#=0F!
CALL:GRAPHIC_LOAD "!VAR!")
SET/A COUNT+=1
)
CALL KEYBOARD.COM
IF %ERRORLEVEL% EQU 80 (
IF %INDEX% LSS %LIMIT% (
SET/A INDEX+=1
) ELSE (SET/A INDEX=0))
IF %ERRORLEVEL% EQU 72 (
IF %INDEX% GTR 0 (
SET/A INDEX-=1
) ELSE (SET/A INDEX=%LIMIT%))
IF %ERRORLEVEL% EQU 13 (
EXIT/B %INDEX%
)
GOTO:MENU
:GRAPHIC_LOAD
FOR %%S IN (%~1) DO (
FOR /F "TOKENS=1,2,3 DELIMS=$" %%K IN ("%%S") DO (
ECHO.EB800:%%K "%%L"%%M 1>>CSHOW.TMP
))
(TYPE CSHOW.TMP&ECHO.Q)|DEBUG>NUL
DEL/Q CSHOW.TMP
GOTO:EOF
:LOAD_GRAPHIC
SET CHANGE=642$C$#,644$H$#,646$A$#,648$N$#,^
64A$G$#,64C$E$#,64E$Û$@,650$B$#,652$O$#,654$S$#
SET START=6E2$S$#,6E4$T$#,6E6$A$#,6E8$R$#,^
6EA$T$#,6EC$Û$@,6EE$B$#,6F0$O$#,6F2$S$#
SET SETTINGS=782$S$#,784$E$#,786$T$#,^
788$T$#,78A$I$#,78C$N$#,78E$G$#,790$S$#
SET LOGO=500$±$F,A2$±$F,142$±$F,1E2$±$F,282$±$F,322$±$F,^
3C2$±$F,502$±$F,A4$±$F,3C4$±$F,504$±$F,A6$±$F,^
3C6$±$F,506$±$F,A8$±$F,1E8$±$F,3C8$±$F,508$±$F,^
AA$±$F,1EA$±$F,3CA$±$F,50A$±$F,14C$±$F,28C$±$F,^
32C$±$F,3CC$±$F,50C$±$F,50E$±$F,510$±$F,B2$±$F,^
3D2$±$F,512$±$F,B4$±$F,3D4$±$F,514$±$F,B6$±$F,^
156$±$F,1F6$±$F,296$±$F,336$±$F,3D6$±$F,516$±$F,^
B8$±$F,158$±$F,1F8$±$F,298$±$F,338$±$F,3D8$±$F,^
518$±$F,BA$±$F,3DA$±$F,51A$±$F,BC$±$F,3DC$±$F,^
51C$±$F,51E$±$F,520$±$F,C2$±$F,162$±$F,202$±$F,^
2A2$±$F,342$±$F,3E2$±$F,522$±$F,C4$±$F,3E4$±$F,^
524$±$F,C6$±$F,3E6$±$F,526$±$F,C8$±$F,3E8$±$F,^
528$±$F,CA$±$F,3EA$±$F,52A$±$F,CC$±$F,16C$±$F,^
20C$±$F,2AC$±$F,34C$±$F,3EC$±$F,52C$±$F,52E$±$F,^
530$±$F,D2$±$F,172$±$F,212$±$F,2B2$±$F,3F2$±$F,^
532$±$F,D4$±$F,2B4$±$F,3F4$±$F,534$±$F,D6$±$F,^
2B6$±$F,3F6$±$F,536$±$F,D8$±$F,2B8$±$F,3F8$±$F,^
538$±$F,DA$±$F,2BA$±$F,3FA$±$F,53A$±$F,DC$±$F,^
2BC$±$F,35C$±$F,3FC$±$F,53C$±$F,53E$±$F
GOTO:EOF
:LOAD_KEYBOARD
IF NOT EXIST KEYBOARD.COM ((
ECHO.N KEYBOARD.COM
ECHO.E 0000 B4 08 CD 21 3C 00 75 02 CD 21 B4 4C CD 21
ECHO.R CX
ECHO.000E
ECHO.W0
ECHO.Q)|DEBUG 1>NUL 2>&1
)
GOTO:EOF

No usa ni WBAT ni programas externos que MS-DOS no incluya, sólo se usa debug para acceder a la memoria de video.

Saludos!


Título: Re: Menú de selección en Batch
Publicado por: leogtz en 5 Agosto 2010, 18:34 pm
Claro que sí usa programas externos, usa keyboard.com que no es nativo. Una cosa es crear los ejecutables y otra que sean comandos internos del intérprete.


Título: Re: Menú de selección en Batch
Publicado por: Binary_Death en 5 Agosto 2010, 18:55 pm
xDDD tienes razón, bueno, pues descontando eso (? xD


Título: Re: Menú de selección en Batch
Publicado por: leogtz en 5 Agosto 2010, 22:07 pm
Lo he probado, funciona bien, solo falta "anunciar" qué es lo que eligió el usuario.


Título: Re: Menú de selección en Batch
Publicado por: Binary_Death en 5 Agosto 2010, 22:54 pm
Sí... mira, en esta parte, que es la que comprueba que la tecla presionada sea ENTER, sólo es necesario redirigir hacia alguna parte del código.

Código:
IF %ERRORLEVEL% EQU 13 (
CALL:OPTION_%INDEX%
EXIT /B
)

Por ejemplo ^^
Saludos!


Título: Re: Menú de selección en Batch
Publicado por: Ari Slash en 5 Agosto 2010, 23:05 pm
muy bueno binary  ;)


Título: Re: Menú de selección en Batch
Publicado por: leogtz en 5 Agosto 2010, 23:24 pm
Bueno, usando keyboard.com, yo también he creado mi menú selectivo:

Código
  1. @echo off
  2. setlocal enableextensions enabledelayedexpansion
  3. set /a counter=0
  4. :: Opciones
  5. for /f "tokens=*" %%_ in ('dir /b .') do (
  6. set "choices[!counter!]=% style="color: #448888;">%_"
  7. set /a counter+=1
  8. )
  9.  
  10. set /a n_choices=%counter%
  11.  
  12. set /a luz=1
  13. set /a choice=0
  14.  
  15. call:print !luz! % style="color: #448888;">n_choices%
  16.  
  17. :loop
  18. call keyboard.com
  19.  
  20. if !errorlevel! equ 72 (
  21. if !luz! equ 1 (
  22. set /a luz=!n_choices!
  23. ) else (
  24. set /a luz-=1
  25. )
  26. )
  27.  
  28. if !errorlevel! equ 80 (
  29. if !luz! equ !n_choices! (
  30. set /a luz=1
  31. ) else (
  32. set /a luz+=1
  33. )
  34. )
  35.  
  36. if !errorlevel! equ 13 (
  37. set /a choice=!luz!
  38. )
  39.  
  40. call:print !luz! !n_choices!
  41. if !choice! neq 0 (goto:eleccion)
  42.  
  43. goto:loop
  44.  
  45. :eleccion
  46. set /a choice-=1
  47. echo Elegiste la opción : !choices[% style="color: #448888;">choice%]!
  48. set /p "="
  49. exit /b 0
  50.  
  51. :print
  52. cls
  53. set /a limit=%2 - 1
  54. for /l %%_ in (0, 1, %limit%) do (
  55. set /a local=%%_ + 1
  56. if %1 equ !local! (
  57. echo -^>  !choices[% style="color: #448888;">%_]!
  58. ) else (
  59. echo !choices[% style="color: #448888;">%_]!
  60. )
  61. )
  62. goto:eof

Código:
Archivos de programa
->  ares
code.bat
CONFIG.SYS
cplusplus
cpps
c_codes
Documents and Settings
dudas.bat
escuela.rar
file.txt
Intel
KEYBOARD.COM
log_1.txt
log_2.txt
log_3.txt
log_4.txt
log_5.txt
log_6.txt
MinGW
Perl
Program Files
Qt
reporte_porno.rar
revistas
test.bat
Usb
WINDOWS
_Corel
_foster.rar

Elegiste la opci¾n : ares


C:\>


Título: Re: Menú de selección en Batch
Publicado por: Ari Slash en 5 Agosto 2010, 23:27 pm
wau!
voi a buscar un tuto de keryborad.com me estoy perdiendo de algo parece  :xD


Título: Re: Menú de selección en Batch
Publicado por: Binary_Death en 5 Agosto 2010, 23:31 pm
Muy bueno leo! ^^
Trabajaré la forma de poder automatizar el estilo del mío... para no tener que diseñar las opciones manualmente. Igual, por el método empleado correría muy lento, así que no se si vale la pena =/ mejor que de ese tipo de menú sólo hayan cortitos  :xD

En fin, saludos =)

Por cierto, Ari-Slash... el menu selectivo podría hacerse igual con set junto con /p, pero habría que presionar una tecla y además no aceptaría laexas flechas de dirección... igualmente, en cuanto al funcionamiento, el keyboard es lo de menos, solo es como un set /p al cual le das una entrada de un solo caracter y almacena en errorlevel el número en ascii de la tecla pulsada... así que de ahí compruebas.