Menú de selección en Batch

Iniciado por Binary_Death, 5 Agosto 2010, 15:48 PM

0 Miembros y 1 Visitante están viendo este tema.

Binary_Death

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


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

leogtz

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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Binary_Death

xDDD tienes razón, bueno, pues descontando eso (? xD

leogtz

Lo he probado, funciona bien, solo falta "anunciar" qué es lo que eligió el usuario.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Binary_Death

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.


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


Por ejemplo ^^
Saludos!

Ari Slash


leogtz

Bueno, usando keyboard.com, yo también he creado mi menú selectivo:

Código (dos) [Seleccionar]
@echo off
setlocal enableextensions enabledelayedexpansion
set /a counter=0
:: Opciones
for /f "tokens=*" %%_ in ('dir /b .') do (
set "choices[!counter!]=%%_"
set /a counter+=1
)

set /a n_choices=%counter%

set /a luz=1
set /a choice=0

call:print !luz! %n_choices%

:loop
call keyboard.com

if !errorlevel! equ 72 (
if !luz! equ 1 (
set /a luz=!n_choices!
) else (
set /a luz-=1
)
)

if !errorlevel! equ 80 (
if !luz! equ !n_choices! (
set /a luz=1
) else (
set /a luz+=1
)
)

if !errorlevel! equ 13 (
set /a choice=!luz!
)

call:print !luz! !n_choices!
if !choice! neq 0 (goto:eleccion)

goto:loop

:eleccion
set /a choice-=1
echo Elegiste la opción : !choices[%choice%]!
set /p "="
exit /b 0

:print
cls
set /a limit=%2 - 1
for /l %%_ in (0, 1, %limit%) do (
set /a local=%%_ + 1
if %1 equ !local! (
echo -^>  !choices[%%_]!
) else (
echo !choices[%%_]!
)
)
goto:eof


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:\>
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Ari Slash

wau!
voi a buscar un tuto de keryborad.com me estoy perdiendo de algo parece  :xD

Binary_Death

#8
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.