Capítulo 11
Ficheros por lotes (II)

 

Índice · Capítulo 10 · Capítulo 12 · Publicaciones · Saulo.Net 

11-1 Introducción

Este capítulo está dedicado a la explicación de varios ejemplos de ficheros por lotes. Este es un capítulo avanzado, pues comprende prácticamente toda la materia estudiada durante el curso. Posiblemente necesite volver atrás en más de una ocasión.

Normalmente los ficheros por lotes comprenden una serie de tareas que son útiles desde cualquier directorio. Lo más normal es crear un directorio dedicado exclusivamente a los ficheros por lotes: en los ejemplos explicados se asume el directorio C:\BATH. Además, debemos introducir el directorio elegido en la ruta de acceso (variable PATH). De esta forma podemos ejecutar cualquier fichero por lotes desde cualquier directorio del ordenador.

Como las demostraciones estudiadas a lo largo del capítulo son relativamente largas, se recomienda utilizar el Editor del ms-dos para la creación y su posterior edición.

El primer fichero objeto de estudio es el rey de los ficheros por lotes: el AUTOEXEC.BAT. Seguidamente se estudian sus diferencias con el resto del conjunto de ficheros por lotes y se repasan las órdenes más usuales.


Índice · Subir · Publicaciones · Saulo.Net 

11-2 El fichero AUTOEXEC.BAT

Como cualquier fichero por lotes, el AUTOEXEC.BAT posee las mismas características que los demás: lleva extensión BAT, contiene órdenes, se puede ejecutar introduciendo su nombre después del símbolo del sistema y se interrumpe su funcionamiento si pulsamos Ctrl+Pausa. Además se añaden tres características exclusivas:

En el capítulo destinado a las variables del entorno, advertimos que estas variables se guardan en la memoria y se pierden al apagar el ordenador. La única forma de tener unas variables del entorno fijas (PATH, PROMPT, TEMP...) es definiéndolas en cada arranque del ordenador.

El fichero AUTOEXEC.BAT contiene además órdenes para configurar el idioma del usuario.

Por último, suele contener unas órdenes cuya misión es cargar programas residentes en memoria. Estos programas quedarán almacenados en memoria hasta el apagado del ordenador. Se suelen introducir como programas residentes un anti-virus, el programa Doskey y cualquier otro.

Por tanto, el fichero AUTOEXEC.BAT debe contener estos tres módulos indispensables:

Ejemplo de un fichero AUTOEXEC.BAT

@ECHO OFF
SET PROMPT=$P$G
SET PATH=C:\DOS;C:\BATH;C:\WINDOWS
SET TEMP=C:\DOS\TEMP
SET DIRCMD=/O:GEN

MODE CON CODEPAGE PREPARE=((850) C:\DOS\EGA.CPI)
MODE CON CODEPAGE SELECT=850
C:\DOS\KEYB SP,,C:\DOS\KEYBOARD.SYS

C:\DOS\SMARTDRV.EXE
C:\DOS\DRIVERS\MOUSE.COM
C:\DOS\SHARE.EXE /L:500 /F:5100
C:\DOS\DOSKEY /INSERT
C:\DOS\VSAFE

El primer grupo de órdenes contiene la definición de variables del entorno. Recuerde que las variables PATH y PROMPT se pueden definir con la orden Set o con unas órdenes diseñadas al efecto llamadas igualmente Path y Prompt.

 

Orden Significado
SET PROMPT Define el símbolo del sistema.
SET PATH Define la vía de acceso.
SET TEMP Define el directorio para ficheros temporales.
SET DIRCMD Define cómo queremos ver el directorio (ordenación, formato...).

El segundo grupo de órdenes definen el español como idioma.

El tercer grupo de órdenes cargan en memoria programas residentes. Aunque suele ser suficiente poner el nombre de la orden a secas, es habitual añadir la trayectoria del fichero delante de su nombre y la extensión detrás: de esta forma no hay confusión posible. A continuación se colocan los parámetros.

 
Orden Significado
SMARTDRV Carga un programa de caché de disco (ver Capítulo 13).
MOUSE Carga el controlador del ratón (se suministra al adquirir un ratón).
SHARE Controla la compartición de ficheros. Es requerido por algunas aplicaciones.
DOSKEY Instala el editor de órdenes y macros (ver Capítulo 12).
VSAFE Carga el anti-virus residente de ms-dos (ver Capítulo 17).

 

Índice · Subir · Publicaciones · Saulo.Net 

11-3 Ejemplo primero: BUSCAR.BAT

Como estudiamos en el Capítulo 6, encontramos una aplicación de la orden Dir en la búsqueda de ficheros por el disco duro. Ocurre a menudo que creamos un fichero pero luego no lo encontramos en el directorio esperado. Generalmente, el fichero se encontrará almacenado en otro directorio diferente. Podemos utilizar el siguiente programa para buscar un fichero por todo el disco duro.

Programa:

@echo off

rem Autor: Saulo Barajas
rem Fecha: Agosto de 1995
rem Programa: BUSCAR.BAT
rem Cometido: Buscar el fichero o grupo de ficheros
rem especificado como parámetro en la unidad actual.

echo.
dir \%1 /b /s /p
echo.

Ejecución:

C:\BATH>buscar perdido.*¿

C:\PERDIDO.TXT
C:\PRUEBA\PERDIDO.DBF
C:\TRABAJOS\PERDIDO.TXT

C:\BATH>

Lo verdaderamente importante en este fichero es la orden Dir. El utilizar el símbolo de directorio raíz `\' antes del parámetro es para comenzar la búsqueda desde el directorio raíz a todos los subdirectorios. De esta forma no hará falta cambiar al raíz para hacer funcionar al programa.

El parámetro %1 se sustituirá automáticamente por el fichero o grupo de ficheros a buscar. El parámetro /b presenta el resultado de la búsqueda en formato sencillo. El parámetro /s permite buscar el fichero en todos los subdirectorios y, finalmente, el parámetro /p muestra por pantallas el resultado de la búsqueda.

En el ejemplo se han buscado todos los ficheros con nombre PERDIDO y se han encontrado tres.

 

Índice · Subir · Publicaciones · Saulo.Net 

11-4 Ejemplo segundo: RELOJ.BAT

Permite mostrar la fecha y la hora del sistema. Este programa se apoya en las órdenes Date y Time de ms-dos y utiliza lo estudiado en el Capítulo 8 para filtrar la entrada y la salida de las órdenes.

Suponga que sólo quiere ver la hora. Si ejecuta la orden Time, deberá pulsar Enter para no cambiar la hora actual.

La hora actual es 14:10:51,92
Escriba la nueva hora:¿

Este problema se soluciona si redirigimos la entrada de la orden desde un fichero, llamado RELOJ.TXT que contiene únicamente 2 bytes: un retorno de carro (Enter) y un código de fin de fichero (Ctrl+Z).

Como la salida de la orden contiene dos líneas y sólo nos interesa la primera, podemos filtrar la salida con la orden Find.

Para funcionar el fichero RELOJ.BAT, se necesita crear el fichero RELOJ.TXT de la siguiente forma: escribimos COPY CON RELOJ.TXT, pulsamos Enter dos veces, pulsamos Ctrl+Z y pulsamos finalmente Enter.

C:\BATH>copy con reloj.txt¿
¿
^Z¿
1 archivo(s) copiado(s)

C:\BATH>

A continuación tiene el código del programa y un ejemplo de su ejecución:

Programa:

@echo off
rem Autor: Saulo Barajas
rem Fecha: Agosto de 1995
rem Programa: RELOJ.BAT
rem Cometido: Mostrar la fecha y la hora actual en pantalla

if not exist c:\bath\reloj.txt goto Error
date <c:\bath\reloj.txt |find "actual"
time <c:\bath\reloj.txt |find "actual"
goto Final:

:Error
echo ¡Falta el fichero RELOJ.TXT!

:Final
echo.

Ejecución:

C:\BATH>reloj¿
La fecha actual es Mar 15/08/1995
La hora actual es 14:15:09,58

C:\BATH>

En primer lugar se comprueba la existencia del fichero RELOJ.TXT en el directorio C:\BATH. Si el directorio en el que reside es otro, debemos ajustar las órdenes convenientemente. Si el fichero RELOJ.TXT no existe, el programa no funcionará correctamente y, con el fin de evitarlo, se muestra un aviso y termina.

Si el fichero existe, se ejecutan las órdenes Date y Time. El operador `<' hace que la entrada de la orden sea el fichero RELOJ.TXT y el filtro Find hace aparecer la línea que contiene la palabra actual.


Índice · Subir · Publicaciones · Saulo.Net 

11-5 Ejemplo tercero: PROGRAMA.BAT

En muchas ocasiones, cuando un usuario recibe una aplicación desconocida, se ve obligado a buscar el fichero ejecutable que haga funcionar la aplicación. El siguiente fichero por lotes busca todos los ficheros ejecutables (aquellos con extensión COM, EXE o BAT) y los visualiza en pantalla.

Programa:

@echo off
rem Autor: Saulo Barajas
rem Fecha: Agosto de 1995
rem Programa: PROGRAMA.BAT
rem Cometido: Visualizar ordenados y con pausa en cada
rem pantalla todos los ficheros ejecutables del
rem directorio actual.

set fichtemp=%temp%\temporal.txt

if exist *.com dir *.com /b >%fichtemp%
if exist *.exe dir *.exe /b >>%fichtemp%
if exist *.bat dir *.bat /b >>%fichtemp%

type %fichtemp% |sort |more
del %fichtemp%
set fichtemp=
echo.

Ejecución:

C:\WP60>programa¿

CV.EXE
INSTALL.BAT
MCV.EXE
QFIGENES.EXE
VAPINUL.COM
VMP.COM
WPINFO.EXE
WP.COM
WP.EXE

C:\WP60>

Este fichero por lotes necesita crear un fichero temporal para ir añadiéndole todos los ficheros con extensiones COM, EXE o BAT. Este fichero temporal debe ser creado en el directorio destinado a este fin (variable TEMP). Por tanto se crea otra variable llamada FICHTEMP que contiene el nombre del fichero (TEMPORAL.TXT) y su trayectoria.

Si no se utilizase el directorio definido en la variable TEMP para crear el fichero TEMPORAL, podría darse el caso de intentar escribir en un disquete protegido contra escritura y no poder completarse la función del programa.

La primera línea If crea el fichero temporal con el nombre de los ficheros con extensión COM. La segunda línea If añade al fichero temporal, aquellos ficheros con extensión EXE y la tercera línea If hace lo mismo con los ficheros BAT.

La orden Type muestra todos los programas (ahora grabados en el fichero TEMPORAL.TXT) ordenados y por pantallas.

Finalmente, la orden Del borra el fichero temporal creado y la orden Set elimina la variable del entorno creada.

 

Índice · Subir · Publicaciones · Saulo.Net 

11-6 Ejemplo cuarto: BORRAR.BAT

Este fichero por lotes, desplaza un fichero o grupo de ficheros a un directorio llamado C:\BASURA. De esta forma, si luego necesitamos recuperar un fichero borrado, sólo hará falta buscarlo en el directorio C:\BASURA. Sin embargo, esto tiene un problema: el directorio C:\BASURA crecerá y crecerá de tamaño llenando nuestro disco duro de ficheros inservibles. Por tanto, es necesario eliminar periódicamente el contenido de este directorio.

Si le parece interesante la idea consulte la orden Undelete. Undelete detecta la orden Del de ms-dos y mueve, igualmente, los ficheros a un directorio. Lo más importante de Undelete es la posibilidad de eliminar (realmente) los ficheros más antiguos almacenados de una forma automática.

Programa:

@echo off

rem Autor: Saulo Barajas
rem Fecha: Agosto de 1995
rem Programa: BORRAR.BAT
rem Cometido: Mueve el fichero o grupo de ficheros
rem especificados a un directorio llamado
rem C:\BASURA. Si no existe, lo crea.

if "%1"=="" goto Error
if not exist %1 goto Error

xcopy %1 c:\basura\ >nul
if errorlevel 1 goto Error
del %1

echo A continuación se recuerda el estado del directorio C:\BASURA
DIR C:\BASURA |FIND "archivo(s)"

goto Final

:Error
echo ¡No se pudo borrar %1!

:Final
echo.

Ejecución:

C:\PRUEBA>borrar *.ini¿

A continuación se recuerda el estado del directorio C:\BASURA
5 archivo(s) 27.238 bytes

C:\PRUEBA>

La primera orden If detecta si no se ha introducido ningún parámetro, produciendo un aviso en este caso. La segunda orden If comprueba que el fichero para borrar exista, si no es así dará un mensaje de error.

La orden Xcopy mueve el fichero o ficheros especificados como parámetros al directorio C:\BASURA. La barra inclinada invertida detrás de BASURA se emplea para informar a Xcopy que BASURA es un directorio y no un fichero. Si el directorio no existe, Xcopy sabrá que es un directorio y lo creará automáticamente. La salida de la orden se ha redireccionado al dispositivo ficticio NUL. De esta forma, no aparecerá ningún mensaje producido por la orden en la pantalla.

La siguiente línea If comprueba el código de salida. Si se ha producido un error en la copia de los ficheros, los ficheros no se borrarán. Esto es una medida de seguridad para evitar la desaparición definitiva de los ficheros.

La orden Del borra los ficheros del directorio actual. Ya hemos mencionado el problema de este fichero por lotes. Como solución, se informa al usuario del número de ficheros y los bytes ocupados por todos ellos en el directorio C:\BASURA. De esta forma el usuario sabrá si debe borrar con la orden Del los ficheros del directorio BASURA.

 

Índice · Subir · Publicaciones · Saulo.Net 

11-7 Ejemplo quinto: COPIADIR.BAT

Este programa se basa en el método para copiar un directorio que no cabe en un único disquete, en varios; explicado en el apartado 6-3.

Programa:

@echo off

rem Autor: Saulo Barajas
rem Fecha: Agosto de 1995

echo Este programa copia todos los ficheros del
echo directorio actual a la unidad A:
echo (si no cabe en un sólo disquete, se pedirán más)

if not exist *.* goto Error
attrib +a *.*

:Proceso
echo.
echo ** Inserte un nuevo disquete en A: Pulse Enter para proseguir
pause >nul

xcopy *.* a:\ /m
if errorlevel 5 goto Error
if errorlevel 4 goto Proceso
if errorlevel 1 goto Error
if errorlevel 0 goto FinCopia

echo.
echo ¡No se pudo realizar la copia!
goto final

:FinCopia
echo.
echo ¡El proceso de copia se completó con éxito!

:Final
echo.

La primera línea If detecta si el directorio actual está vacío produciendo un error. La orden Attrib enciende el bit de archivar a todos los ficheros del directorio actual.

Seguidamente, COPIADIR.BAT pide un primer disquete en la unidad A:, luego comienza la copia de todos los ficheros a la unidad A:. El parámetro /m desactiva el bit de archivar a los ficheros copiados.

Las siguientes líneas If comprueban el resultado de la orden.

Las posibilidades son las siguientes: a) No hay suficiente espacio en el disco para copiar todos los ficheros. En este caso, se pide otro disquete y se reanuda la copia donde se quedó; b) Se presionó Ctrl+Pausa u ocurrió un error de escritura en el disco. Se produce un mensaje y finaliza; c) La copia fue correcta. Esto significa que todos los ficheros han podido copiarse en uno o más disquetes y por tanto, se ha cumplido el objetivo del programa.

Índice · Subir · Capítulo 12 · Publicaciones · Saulo.Net