Mostrando entradas con la etiqueta ms-dos. Mostrar todas las entradas
Mostrando entradas con la etiqueta ms-dos. Mostrar todas las entradas

jueves, 7 de julio de 2011

Proyecto biblioteca (en MS-DOS)


En las últimas clases hemos tenido que crear un pequeño proyecto para poner en práctica el primer módulo del curso. Para ello hemos hecho un programa para la consola de comandos de MS-DOS que gestione una biblioteca.
El primer paso fue realizar un diagrama con la funcionalidad del programa para facilitar posteriormente la etapa de codificación. Para realizar esta tarea descubrí una herramienta online muy interesante (http://www.gliffy.com/). A continuación muestro los diagramas más genéricos realizados sobre la aplicación.


Una vez finalizada la etapa de planificación, era el momento de empezar a programar.
El primer paso es comprobar si existe la estructura de directorios, y si no es así crearla:

COMPROBAR EXISTENCIA DE DIRECTORIOS
@echo off
REM Comprobar la existencia de los directorios LIBROS, PRESTAMOS y LISTADOS
REM y, en caso de no existir, crearlos
echo ComprobarDirs 1
if not exist LIBROS md LIBROS
if not exist PRESTAMOS md PRESTAMOS
if not exist LISTADOS md LISTADOS
echo ComprobarDirs 2

Después se crea el menú principal mostrando las opciones que ofrece el programa y esperando por la elección del usuario:

MENÚ
@echo off
:inicio
call ComprobarDirs.bat
cls
echo 1) Anadir libro
echo 2) Prestar libro
echo 3) Listar todos (ordenados por signatura)
echo 4) Listar todos (ordenados alfabeticamente)
echo 5) Listar prestados
echo 6) Listar amigos con prestamos
echo 7) Devolver libros
echo 8) Buscar libro
echo 9) Salir

set /p opcion=Elija una opcion:
echo.

REM Opcion 1 (añadir libro)
if %opcion%==1 call AnadirLibro.bat
REM Opcion 2 (prestar libro)
if %opcion%==2 call PrestarLibro.bat
REM Opcion 3 (listar libros por signatura)
if %opcion%==3 call ListarLibSig.bat
REM Opcion 4 (listar libros alfabeticamente)
if %opcion%==4 call ListarLibAlf.bat
REM Opcion 5 (listar libros prestados)
if %opcion%==5 call ListarLibPrest.bat
REM Opcion 6 (listar amigos con prestados)
if %opcion%==6 call ListarAmigosPrest.bat
REM Opcion 7 (devolver libros)
if %opcion%==7 call DevolverLibros.bat
REM Opcion 8 (buscar libro)
if %opcion%==8 call BuscarLibro.bat
REM Opcion 9 (salir del programa)
if %opcion%==9 goto salir

goto inicio
:salir
echo Saliendo del programa...

A continuación se crean cada uno de los archivos .bat para realizar cada una de las tareas:

AÑADIR LIBROS
@echo off
REM Obtener signatura, título y autor del libro
set /p signatura=Introduzca la signatura del libro:
set /p titulo=Introduzca el titulo:
set /p autor=Introduzca el nombre del autor:

REM Crear un fichero "signatura.lib" y guardar en el
REM título - nombre autor
echo %titulo% - %autor% > .\LIBROS\%signatura%.lib
echo El libro ha sido incluido en la biblioteca
pause

PRESTAR LIBROS
@echo off
REM Obtenemos los parámetros titulo, nombreAmigo y fecha actual
set /p titulo=Introduzca titulo del libro:
set /p nombreAutor=Introducir nombreAutor:
set /p nombreAmigo=Introduzca el nombre de su amigo:
for %%A in (%Date%) do set fecha=%%A

REM Creamos el fichero "NombreAmigo.pre" y guardamos en el los
REM valores Título, nombreAmigo y fecha
echo %titulo% - %nombreAutor% - %fecha% > .\PRESTAMOS\%nombreAmigo%.pre
echo El prestamo ha sido guardado
pause

LISTAR LIBROS POR SIGNATURA
@echo off
REM Obtenemos todos los archivos de la carpeta libros
if exist .\LISTADOS\listadoLibrosAlf.txt del .\LISTADOS\listadoLibrosAlf.txt

SETLOCAL EnableDelayedExpansion
cd
for /f "tokens=1" %%G in ('dir /b LIBROS\*.lib') do (
set k=LIBROS/%%G
for /f "tokens=1 delims=-" %%A in (!k!) do echo a: %%A
echo %%H >> .\LISTADOS\listadoLibrosAlf.txt
)
echo.
echo El listado solicitado ha sido realizado y guardado en disco
echo.
pause

LISTAR LIBROS ALFABÉTICAMENTE

@echo off
REM Obtenemos todos los archivos de la carpeta libros
if exist .\LISTADOS\listadoLibrosAlf.txt del .\LISTADOS\listadoLibrosAlf.txt
for %%G in (.\LIBROS\*.lib) do (
for /f "tokens=1 delims=-" %%H in (%%G) do echo %%H >> .\LISTADOS\listadoLibrosAlf.txt
)
sort .\LISTADOS\listadoLibrosAlf.txt > temp.txt
move temp.txt .\LISTADOS\listadoLibrosAlf.txt
type .\LISTADOS\listadoLibrosAlf.txt
echo.
echo El listado solicitado ha sido realizado y guardado en disco
echo.
pause

LISTAR AMIGOS CON PRESTAMOS
@echo off
REM Obtener archivos de la carpeta prestamos y mostrar el nombre del archivo sin
REM extensión
if exist .\LISTADOS\listadoAmigosPrest.txt del .\LISTADOS\listadoAmigosPrest.txt
for /f "tokens=1 delims=." %%G in ('dir /b PRESTAMOS\*.pre') do echo %%G >> .\LISTADOS\listadoAmigosPrest.txt
type .\LISTADOS\listadoAmigosPrest.txt
pause

DEVOLVER LIBROS
@echo off
REM Obtener el nombre del amigo que devuelve los libros
set /p amigo=Introduzca el nombre del amigo:
REM Eliminar de la carpeta PRESTAMOS el archivo correspondiente al amigo indicado
del .\PRESTAMOS\%amigo%.pre 2> nul
echo Los prestamos indicados han sido eliminados
pause

BUSCAR LIBROS

@echo off
REM Buscar en el directorio LIBROS si alguno de los ficheros contiene el título seleccionado
REM Obtenemos el título a consultar
set /p titulo=Introduzca el titulo a buscar:
for /f %%G in ('dir /b .\LIBROS\*.lib') do (
for /f "tokens=2 delims=:" %%H in ('find /c ^"%titulo%^" .\LIBROS\%%G') do (
if %%H gtr 0 (
goto hayLibros
)
)
)
goto noHayLibros
:hayLibros
echo.
echo En la biblioteca existe algun libro con ese titulo
echo.
goto salir
:noHayLibros
echo En la biblioteca no existe ningun libro con ese titulo
:salir
pause

miércoles, 29 de junio de 2011

Archivos por lotes (batch files) II

Ahora que ya hemos visto como crear un archivo .bat y como mostrar información por pantalla vamos a ver otras posibilidades que nos ofrece el procesamiento por lotes en MS-DOS.
En primer lugar, podemos poner comentarios dentro del archivo, es decir, escribir cosas que no sean ejecutadas si no simplemente que sirvan como notas aclaratorias sobre lo que hace el programa. Para hacer esto disponemos de dos opciones: poner : al inicio de la línea en la que vamos a poner el comentario o poner REM. En los dos casos el texto que se ponga en esa línea será ignorado a la hora de procesar el fichero.
Por otro lado, podemos realizar las tareas típicas que realizamos en la línea de comando como crear y eliminar directorios, listar, renombrar, copiar o borrar ficheros, ejecutar programas, etc. Todas estas opciones las vemos en la imagen siguiente:


Al ejecutar el archivo anterior obtenemos el resultado siguiente:

Archivos por lotes (batch files)

En MS-DOS se puede ejecutar un conjunto de comandos de forma secuencial sin tener que introducirlos manualmente en la línea de comandos. El modo de hacer esto es creando un archivo de procesamiento por lotes, es decir, un archivo de texto con extensión .bat donde guardaremos los comandos que queremos ejecutar.
Esta opción ofrece ciertas ventajas como comprobar condiciones, realizar bucles, etc. De todos modos, es una herramienta bastante limitada en comparación con las posibilidades que tenemos en la actualidad (Powershell de Microsoft o bash en Linux, por ejemplo).
Para empezar a trabajar con los batch, primero abrimos el editor:
     C:>edit
     C:>edit nombreFichero.bat
cualquiera de las dos opciones anteriores es válida, aunque en el primer caso habrá que darle un nombre al fichero al guardarlo, mientras que en el segundo caso sólo necesitaremos el contenido que escribamos en el editor.
En primer lugar voy a mostrar el comando echo que permite mostrar mensajes en pantalla, es decir, nos permite comunicar los resultados de las tareas realizadas o el estado de los procesos llevados a cabo. El uso de echo en la primera línea del fichero es un caso especial que permite que no se muestre todos los comandos que se escriben en el fichero, sólamente se mostrarán los datos indicados por los comandos echo posteriores. También hay que señalar que cuando el comando echo va seguido de un punto indica que se mostrará una línea en blanco.


También podemos ver las opciones del menú del editor. Podemos usar la opción del menú Archivo->Guardar cuando ya hayamos introducido el nombre del archivo al ejecutar el editor (edit nombreFichero.bat). En caso contrario deberíamos utilizar Archivo->Guardar como..., aunque si no lo hacemos nos pedirá un nombre para el fichero a guardar.


En caso de guardar el contenido anterior en un fichero llamado kk.bat y ejecutarlo pasándole un parámetro con valor parametro1 obtendríamos el resultado siguiente: