Programacion en lenguaje batch de DOS
INTRODUCCION
Muchos piensan que los ficheros batch no sirven mas que para indicar al DOS que programas debe cargar al arrancar. Un vistazo al manual del DOS, o a la ayuda del DOS nos muestra un lenguaje muy limitado, sin variables numéricas, ni tratamiento de cadenas, ni ningún tipo de estructuración. El manual no da mas que unas mínimas explicaciones para que el usuario pueda modificar, si es necesario su AUTOEXEC.BAT, y poca cosa mas.
Yo me quedé muy sorprendido de encontrar en el grupo de noticias alt.msdos.batch expertos capaces de hacer cosas inverosímiles. Incluso hay quien tiene una página web en que se explica paso a paso el desarrollo de un "maligno" virus en lenguaje batch, capaz de infectar a todos los batch de un PC (a nivel de creación artística, por supuesto, como él mismo dice).
Algunos trucos son realmente útiles, como el que permite salvar el directorio actual(Push_pop), y después volver a él. O el que, puesto en el autoexec.bat, permite ejecutar un programa sólo si es -por ejemplo- Viernes.
Todo ello es posible apurando las instrucciones del DOS hasta el límite, y gracias a la experiencia compartida en la red por miles de usuarios. Esta página es un palido reflejo de las de los autenticos gurus de la programación batch. Sólo intenta acercar estos trucos a aquellos para los que la lengua inglesa constituye un problema.
Algunos dirán para qué tanta complicación, si existen soluciones alternativas:
Sustitutos del command.com como el NDOS o el 4DOS: Son muy útiles, pero recordad que más de un programa DOS (¡¡y Windows!!) ejecuta de cuando en cuando una orden de DOS en un SHELL. Al tener algunas órdenes de estos sustitutos el formato de salida y las opciones distintas, el programa puede fallar. Es indispensable probar todos los programas cuando se instale uno de estos substitutos.
Programas externos extensores del DOS. Ok, solo es necesario encontrar el programa necesario. Solo hay que irse a Simtel o similar y empezar a buscar. Hay miles de ellos, cada uno cubre una necesidad puntual. Es necesario no abusar, pues podemos terminar con un sistema DOS tan recargado de ficheros como el W95
Programar en QBasic, que viene gratuito con el Windows. El Qbasic tiene mas de 250 ordenes, es un lenguaje que tiene su aprendizaje. Una vez completado éste, podemos encontrarnos sorpresas como que para copiar un fichero, o para cambiar de disco lo mas facil es hacer un SHELL y ejecutar una orden DOS. Eso si, tenemos tratamiento de cadenas y operaciones matemáticas.
En Windows tenemos el Visual Basic para Aplicaciones, para ejecutarlo solo debemos tener abierta de las aplicaciones de Microsoft Office y aprendernos un lenguaje extensísimo, con una jererquía de objetos enorme.
Java, VBScript, etc son lenguajes que se ejecutan en el navegador de Internet, pero que por necesidades de seguridad no contienen ninguna instrucción que pueda afectar al sistema de ficheros de nuestro ordenador, es decir no son capaces de instalar programas, copiar ficheros, modificar registros, etc.
Bien, lo que sigue es un cajon de sastre con trucos,etc. Recomiendo a todos leerse antes el manual del DOS, para repasar los rudimentos del invento
INDICE
Trucos para Depuración
Documentacion
Secuencia de Ejecucion
Entradas de Usuario
Cadenas Alfanumericas
Consideraciones para Windows
Discos y Directorios
Fecha, Hora, Temporizado
Contaje, Numeros
Ordenes del DOS
TRUCOS PARA DEPURACION
-Echo selectivo: Iniciar el programa con @echo %debug% off .Antes de ejecutar en debug, hacer set debug=ON
-Ejecutar paso a paso command /y /c bat_a_probar parametros. Command pide confirmacionantes de cada paso
-poner %breakp% cada un cierto trozo. Al probar programa SET breakp=pause
Davis utiliza unos ficheros para debug
DOCUMENTACION
Para conseguir que un batch haga cosas útiles hay que complicarse mucho la vida, a pesar de que un batch raramente pasará de las 30 lineas, es facil olvidar que en que demonios estábamos pensando cuando programamos aquello. Solucion: Documentar bien cada trozo del batch!
Comentario Oficial: Iniciar la línea con REM. Es lento, porque el interprete de comandos procesa toda la linea. Por ejemplo, si la línea contiene un simbolo de redirección, ésta se ejecutará, ¡ a pesar de ser una línea de comentarios!
Comentario no oficial : iniciar la línea con un ::, el interprete lo considera como una etiqueta errónea y no lee mas alla del 2º caracter
pueden introducirse comentarios de linea: % rodear comentario con porciento+ espacio %
Ayuda a usuario: Poner como primera linea después de @echo off:
if [%1==[ for %%i in (echo pause goto:end) do %%i Funcion del programa SINTAXIS %0 Descripcion de los parametros
Si no hay parámetros en la llamada al programa se visualizará una ayuda y se terminará la ejecución.
CONTROL DE SECUENCIA DE EJECUCION
-Subrutinas contenidas en el propio programa. Para ello se utiliza un parámetro de llamada mas que el maximo de parámetros necesarios para el programa y las subrutinas. Por ejemplo si el programa requiere 3 parámetros:
@echo %debug% off
%4 if [%1==[ for %%i in (echo pause goto:end) do %%i SINTAXIS %0 par_1 par_2 par_3
::programa principal
call %0 par_1 par_2 falso goto:rutina1 % como la llamada tiene menos de 3 param, se intercala parametro falso %
::programa principal
call %0 par_1 par_2 par_3 goto:rutina2
::programa principal
goto end
:rutina1
::rutina1
goto end
:rutina2
goto end
:end
cls
Cuando se desea ejecutar una subrutina el programa se llama a si mismo (call %0) con un gosub:subrutina como 4º parametro. Si éste no existe se ejecuta el programa principal. Si éste existe, se ejecuta (%4) el salto a la subrutina correspondiente.
Minisubrutinas : La instrucción FOR permite asignar asu variable ordenes del DOS que se ejecutan una detrás de otra, lo que permite crear rutinas en una sola linea
-Ayuda_Usuario
for %%i in (echo pause goto:end) do %%i SINTAXIS %0 par_1 par_2 par_3
Tratamiento de errores:
if condicion for %%i in (echo pause goto:end) do %%i Mensaje
-Llamada y borrado de un bat temporal
for %%i in (call del) do %%i temp.bat
-Bucle contador
set
PROCESAR ENTRADAS DEL USUARIO
Esperar una tecla
PAUSE
Seleccionar entre varias opciones pulsando una tecla
CHOICE
:: ASK.bat
:: acepta entrada de usuario. Este programa esta escrito para una version local de DOS
@ECHO OFF
IF [%1==[ FOR %%I IN (ECHO PAUSE GOTO:END) DO %%I Guarda entrada usuario en Variable USO: %0 Variable Prompt
echo %2 %3 %4 %5 %6 %7 %8 %9:
echo shift>escriba.bat
echo shift>>escriba.bat
echo shift>>escriba.bat
echo shift>>escriba.bat
echo shift>>escriba.bat
echo set %1=%%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9>>escriba.bat
fc con nul /lb1 /n | date | find " 1: " > }{.bat
call }{.bat
del }{.bat>nul
del escriba.bat>nul
:END
Evitar interrupciones por parte del usuario
Rodear la parte importante con
Ctty nul
.
.
ctty con
Todas las salidas a pantalla dentro de la parte no interrumpible se harán con redirección a >con
Las entradas de teclado dentro de la parte no interrumpible requieren redireccion de <con
TRATAMIENTO de CADENAS ALFANUMÉRICAS
-Obtener nombre fichero sin extension rename permite ren *.* *. con lo que eliminamos ext
-Procesar palabras de una cadena
Pasarlos a DATE y usar palabras como parametros de bat auxiliar
-Procesar una a una letras de una palabra
Pre W95 usar for
W95/98 usar choice
-Procesar los ficheros con una extensión
-Procesar las lineas de texto de una lista como parametros de un batch
Ver procesa_listas
TRUCOS PARA WINDOWS
-Si creamos acceso directo a un batch en el escritorio y arrastramos algunos ficheros hasta él,ejecutamos el batch con los nombres de los archivos como parámetros
-El truco para separar carcacteres con for %i in (/palabra) no funciona
LFNFOR conmuta on-off los LFN antes y despues de un FOR. Tiene bug: si la variable for incluye path y LFNFOR on, solo 1er bucle recibe path-dir /b lista en LFN
dir /z/b saca nombres en formato 8.3
-Para cerrar ventana dos al terminar bat, simplemente ejecutar un cls
-start /w orden_windows espera para continuar bat a terminar la orden. Si no se pone /w el bat se sigue ejecutando, lo que permite ejecutar a la vez varios programas, por ejemplo, ejecutar una intro musical cada vez que arranquemos un programa determinado.
-start /m arranca minimizado
-Cuando se cierra la ventana DOS en que ejecutamos un bat, las vars creadas dentro de esta desaparecen, ya que se trata de una shell secundaria. Por ello las variables que creemos en una ventana no las tendremos disponibles en otra ventana DOS.
DISCOS, DIRECTORIOS
Ver si directorio existe en disco removible (CD)
:: chkdir.bat dir (no LFN)
:: pone la variable exists a si o no
@echo off
set exists=si
%comspec% /f /c dir /-p %1 | find /i "%1" > nul
if errorlevel 1 set exists=no
Ver si un directorio existe en disco duro. Este truco está incluso en la ayuda del dos
set exists=no if exist c:dirnul.* set exists=si
El disco existe, si es extraible esta preparado?
@echo %debug% off
if [%1]==[] for %%v in (echo pause goto:End) do %%v SINTAXIS: %0 Letra_Unidad
ctty nul
%comspec% /f/c vol %1: | find /c /I "Vol" | choice /n/c210 > nul
if errorlevel 3 goto End
%comspec% /f/c dir %1:!dummy!.@@@ | find "Dir" /c | choice/n/c10x
:End
ctty con
::Lo que sigue no forma parte de la rutina, está para visualizar el resultado
if errorlevel 4 echo Ha pasado algo raro
if not errorlevel 4 if errorlevel 3 echo Unidad %1: no existe
if not errorlevel 3 if errorlevel 2 echo Unidad %1: existe, no está lista
if not errorlevel 2 if errorlevel 1 echo Unidad %1: preparada
Ejecutar orden en subdirectorios:
En cada directorio crear un listado de subdirectorios con
dir /b /ad>fichero
a continuación utilizar tratamiento de listas
Guardar (push) en variablle de entorno directorio actual para recuperarlo al final del programa (pop)
Push:
@echo off
echo @prompt set _Here=$p$_ > _temp_A.bat
%comspec% /e:2048 /c _temp_A.bat > _temp_B.bat
call _temp_B.bat
del _temp_?.bat
Pop:
@echo off
"%_Here%
cd "%_Here%
Devolver nombre de fichero sin extension
::%1 es nombre fichero, devuelve el nombre sin extension en noext
md _temp_
cd _temp_
rem>%1
ren *.* *. % aqui está el truco!! %
for %%i in (*.) do set noext=%%i
cd..
deltree /y _temp_
Devolver la extension de un fichero
@echo off
if %1==:: goto test
echo = |choice /c=%1= %0 :: >}{temp.bat
call }{temp.bat
echo La extension de %1 es %}ext{%
set }ext{=
del }{*.bat
goto end
:test
if '%2'==']?' goto end
set }ext{=%}ext{%%2
if %2==. set }ext{=
shift
goto test
:end
Contar numero de ficheros en directorio
@echo off
attrib /s c:*.* | find /c ""
Comprobar si un path dado contiene comodines
@echo off
for %%f in (%1) do if "%%f"=="%1" goto _nowilds
echo Parameter %1 contains wildcards (or is missing)
:_nowilds
CREACION DE FICHEROS AUXILIARES
Una técnica muy común en la programación de batch es la creación, llamada y posterior borrado de ficheros batch auxiliares para ejecutar ordenes
que las limitaciones del batch impiden crear:
Envio de redirecciones y pipes al fichero secundario
Por ejemplo si intentamos editar un conjunto de ficheros con SED (editor de textos mandado desde línea de órdenes proveniente del entorno UNIX) dejando los ficheros editados
en otro directorio con
for %%i in (*.txt) do sed -e"s/Pepe/Juan/" %%i > c:temp%%i
no funcionará, ya que la orden de redirección se interpreta antes que el for, y en ese momento %%i aún no tiene valor!. Debemos utilizar un fichero auxiliar!
echo sed -e"s/Pepe/Juan" %%1>c:temp%%1 >bat2.bat
for %%i in (*.txt) do call bat2.bat %%i
Esto no funcionará ya que los caracteres de redirección se interpretan primero y el primer caracter de redirección de la primera linea se ejecuta en vez de ser enviado como caracter a bat2.bat.
echo " sed -e"s/Pepe/Juan" %1>c:temp%1 " >bat2.bat
for %%i in (*.txt) do call bat2.bat %%i
Solucion Windows 95
El rodear una parte con "" nos protegerá los caracteres de redirección pero obtendremos una cadena rodeada de " en el fichero secundario, no ejecutable
echo %%"%% sed -e"s/Pepe/Juan" %1>c:temp%1 %%"%% >bat2.bat
for %%i in (*.txt) do call bat2.bat %%i
el truco consiste en rodear la linea entera que queremos mandar al fichero secundario con %%"%%. El DOS lo interpreta como %"% y lo escribe en el fichero secundario. Al ejecutar el secundario, %"% se intentará sustituir por el valor de la variable de entorno ", que (normalmente) no existirá, o sea que se ignorará.
Solución DOS hasta 6.2
En DOS 6.2 el truco de las comillas no funciona
Hacemos que las lineas a enviar a secundario sean únicas, las saltamos , filtramos a través de FIND el propio fichero para que su salida sea el secundario. En el ejemplo las lineas a enviar tienen 3 espacios delante. Se utiliza una doble búsqueda, la primera busca las lineas con 3 espacios, con lo que el find se encuentra a si, mismo. La 2 busqueda elimina las líneas que tengan 4 espacios, con lo que la linea del FIND se elimina a sí misma.
goto process
chkdsk | find "65535" > nul
if errorlevel 1 echo You have a virus!
:process
type MAIN.BAT | find " "| find /v " " > TEMP.BAT
call temp.bat
del temp.bat
Si hay que crear varios ficheros auxiliares, no podemos contar con los espacios, deberemos utilizar variables de sistema inexistentes.
goto process
%"1% chkdsk | find "65535" > nul
%"1% if errorlevel 1 echo You have a virus!
:process
type MAIN.BAT | find "%%""1%%" > TEMP.BAT
call temp.bat
del temp.bat
FECHA,HORA,TEMPORIZADO
Temporizado:
CHOICE permite un parmetro de nº segundos de espera, hasta 99 segundos
Permite interrumpirlo pulsando tecla
choice /c:. /t:.,5 /n Pausing for five seconds
Esta version no admite interrupciones
type nul | choice /c:. /t:.,5 /n Pausing for five seconds
Poner fecha/hora en variable sistema:
Usar prompt:Ver apartado 10
registrar hora de arranque y paro de progama
Hacer batch wrapper que al entrar y salir llame a
::LOG.BAT iMPRIME DIA Y HORA ACTUAL EN UN LOG CADA VEZ QUE SE EJECUTA
@echo off
if [%1==[ for %%i in (echo pause goto:end) do %%i Registra eventos USO: %0 Texto Fichero_reg
echo %1>>%2
echo.|date|find "actual">>%2
echo.|time|find "actual">>%2
:end
cls
registrar arranque y paro de windows 95
Para el arranque, llamar a log.bat desde in bat en la carpeta inicio
Para el paro :
Evitar que arranque GUI editando msdos.sys BootGUI=0
Añadir en autoexec bat la linea win, que arrancará windows
Añadir a continuación la llamada a log.bat
Correr un programa un dia de la semana:
Ojo depende de la version local de DOS!
@echo off
echo.| date | find "actual" > tmp$$$.bat
echo set weekday_=%%4> la.bat
call tmp$$$
echo %weekday_%
if "%weekday_%"=="Dom" echo Thank God it's Friday
if exist tmp$$$.bat del tmp$$$.bat
if exist current.bat del la.bat
set weekday_=
CONTAJE, VALORES NUMERICOS
Limitar nº veces que se ejecuta un bucle
for %%i in (1 2 3 4 5 6 7 8 9 10) do echo %%i
Contar de 0 a 999
@echo %dbgc% off
%5 %4 %3 %2 if [%1]==[] for %%v in (echo goto:End) do %%v Syntax: %0 Number
%5 %4 %3 %2 for %%v in (%comspec% goto:End) do %%v /e:2048 /c %0 %1 ::
%5 for %%v in (0 1 2 3 4 5 6 7 8 9) do call %0 %1 %%v %2 %3 %4
%5 goto End
echo %4%3%2
for %%v in (%2 %3%2 %4%3%2) do if %1==%%v exit
:End
LAS ORDENES DEL DOS
COMMAND Ejecutar un nuevo procesador de ordenes.
COMMAND [[unidad:]ruta] [dispositivo] [/E:nnnnn] [/L:nnnn] [/U:nnn] [/P] [/MSG]
[/LOW] [/Y [/[C|K] comando]]
Inicia una copia nueva del intérprete de comandos de Windows.
[unidad:]ruta Especifica el directorio que contiene el archivo COMMAND.COM.
dispositivo Especifica el dispositivo que se utilizará para entrada ysalida de comandos.
/E:nnnnn Establece el tamaño inicial del entorno en nnnnn bytes.(nnnnn debe estar entre 256 y 32.768)
/L:nnnn Especifica la longitud de los búferes internos (requiere /P).(nnnn debe estar entre 128 y 1.024)
/U:nnn Especifica la longitud del búfer de entrada (requiere /P).(nnn debe estar entre 128 y 255)
/P Hace que el nuevo intérprete de comandos sea permanente(no se puede salir)
/MSG Almacena los mensajes de error en memoria (requiere /P).
/LOW Hace que COMMAND mantenga información residente enmemoria baja.
/Y Ejecuta linea a linea el programa por lotes especificado por /C o /K.
/C comando Ejecuta el comando especificado y vuelve.
/K comando Ejecuta el comando especificado y sigue ejecutándose
No documentadas:
/F Responde automaticamente Fail al mensaje de error de E/S Abort,Retry,Fail?. Permite superar errores sin intervención del usuario
/D Si /F activo, abre nuevo shell en que /F está desactivado
/Z Visualiza ERRORLEVEL generado por cada orden
/T Quién sabe?
LOADFIX.COM Es necesario recuperarlo de un DOS 5 o 6. No viene con W95. Usado en el procesado de listas
Ejecuta cualquier exe, com, bat que se le pase como parámetro. Tiene la ventaja respecto a call que al ser un comando externo puede renombrarse a Escriba.com
1 Crear la lista
2 Se envia a date|Find "Escriba" cada linea de la lista y se redirige a una nueva lista que incluirá cada linea de la lista original prefijada con el texto "Escriba la fecha actual <dd-mmm-yyy>:"
3 Creamos un batch llamado la.bat que simplemente llame a la orden despues de 3 SHIFTS habremos logrado pasar cada entrada de la lista a la orden.
:: procesa lista para proceso bat. Este programa utiliza caracteristicas de una versión local de DOS
:: loadfix.com debe estar en %windir%command
:: %1 es lista a procesar
@echo %debug% off
::ayuda
if .%1==. for %%i in (echo goto:end) do %%i prepara listas para bat USO %0 lista bat_a_ejecutar
::errores
if .%2==. for %%i in (echo goto:end) do %%i falta parametro bat_a _ejecutar
if not exist %windir%commandloadfix.com for %%i in (echo goto:end) do %%i LOADFIX.COM no encontrado
if not exist %1 for %%i in (echo goto:end) do %%i Tabla %1 no encontrada
:: ojo!:no comprobamos si existe batch: podria ser un comando interno de dos
::convierte tabla en batch
type %1|date|find "Escriba" >> }{.BAT % creamos bat aux con Escriba.. en cada línea" %
echo.>>}{.bat %
::prepara loadfix
copy %windir%commandloadfix.com .escriba.com
::crea batch auxiliar llamado paor cada linea de tabla que llamara a la orden %2
echo @echo %%debug%% off>la.bat
ECHO SHIFT >>LA.BAT % eliminamos fecha %
ECHO SHIFT >>LA.BAT % eliminamos actual %
ECHO SHIFT >>LA.BAT % eliminamos <dd-mm-yy> %
echo if %%1.==. goto:end >>la.bat % paramos si linea en blanco %
ECHO ECHO Ejecutando %2 %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9>>LA.BAT
ECHO CALL %2 %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9>>LA.BAT
echo :end >>la.bat
:: lanzamos el invento
call }{
:: borramos ficheros auxiliares
del }{.BAT
DEL LA.BAT
del escriba.com
:END
PROMPT Cambia informacion visualizada en la petición de instrucciones.
Su valor se guarda en variable de sistema PROMPT
Valores obtenibles mediante prompt
$Q = (signo igual)
$$ $ (símbolo de dolar)
$T Hora actual
$D Fecha actual
$P Unidad de disco y ruta actuales
$V Número de versión de MS-DOS
$N Unidad actual
$G > (signo mayor que)
$L < (signo menor que)
$B | (símbolo de canalización)
$_ ENTRAR-AVANCE DE LINEA
$E Código de escape ASCII (código 27)
$H Retroceso (para borrar un carácter escrito en la línea del símbolo del sistema)
_
Cualquier texto fuera de los anteriores se reproducirá tal como es
Usos:
-enviar valores del sistema a variables de entorno (fecha,hora, dir actual)
@echo off
ctty nul
set oldprompt=%prompt%
prompt set Nombre_Variable$Q$P % creamos un prompt que dice SET Nombre_Veriable= %
echo on
if exist nul>temp.bat % si se pone redireccion sin acción el prompt y%
hello % toda la linea siguiente se redirigen a fichero%
echo off
prompt %oldprompt%
ctty con
-enviar a ficheros auxiliares textos con ccaracteres de redireccion,
-ejecutar ordenes ANSI.SYS sin tener que introducir el caracter de escape que en un prompt es $[
CHOICE Acepta tecla de usuario en respuesta a prompt _
CHOICE [/C[:]teclas] [/N] [/S] [/T[:]c,nn] [texto] _
texto a presentar. Sólo se requieren comillas si incluye _
/C[:]teclas Especifica las teclas permitidas en el símbolo del sistema.CHOICE usara SN como la opción predeterminada.
/N Evita que CHOICE presente el símbolo del sistema y las teclas permitidas
/S Distingue entre mayúsculas y minúsculas.
/T[:]c,nn Espera entrada por nn segundos, si se sobrepasan simula pulscion tecla c
Si la c no está en [sn] o en lista de teclas dada,da error
Salida: errorlevel 0=ctrlC //1,2,3,.. pulsada tecla 1,2,3... //255 error
Se usa para todo excepto para lo que se creó :
-Seleccion usuario (Utilización standard)
-Pitar
echo a_ | choice /c_ /n
OJO: El subrayado no es tal sino un caracter 255 (ALT+255 en editor DOS, ALT+0255 en Notepad)
-Temporizado: sin prompt ni chequear errorlevel:
choice /n /ts,10>nul
-Separar cadena en letras (en dos pre-W95 se usaba for %%i in (/cadena))
::USO Syntax: PARSE EnvName=String
@echo %dbgp% off
if [%1]==[] goto End
if '%1'=='[?' goto Loop
> {p}.bat echo;;|choice/c?%1; %0;
{p}
:Loop
::
:: Use the letters. For example, ...
::
echo. %2
::
if not '%3'==']?' for %%v in (shift goto:Loop) do %%v
del {p}.bat
:End
-Poner el errorlevel en funcion de la saliida de una orden
type "C:autoexec.bat"|find /i/c "REM"!choice /n/c0123456789
Si no hay errorlevel se pone a 0,1,2 segun el numero de veces que se encuenra REM en el fichero
FOR: Ejecuta una orden para distintos valores de una lista
for %%i in ( lista) do orden_dos (puede usarse %%i como parametro de la orden dos)
No anidable
Ojo, no poner nunca %%i después de un simbolo de redirección, ya que la redireccion se interpreta antes de ejecutar el for
Usos:
-Lista puede ser lista de valores (sin comodines), lista de ficheros (admite comodines)
- Puede ser lista de ordenes (minisubrutinas):
- Pasar errorlevel a variable del sistema
for %%i in (0 1 2 3 4 5 6 7 8 9 ) do if errorlevel==%%i set _errorlevel=%%i
- En dos pre W95 for %%i in(cadena) ddo comando %%i pasa a comando sucesivamente cada letra de cadena
- Limitar nº veces que se ejecuta un bucle
for %%i in (1 2 3 4 5 6 7 8 9 10) do echo %%i
CTTY Cambia el dispositivo de E/S standard (habitualmente es CON)
ctty [con|nul|com1|com2...]
Usos
- Impedir que usuario interrumpa un programa
ctty nul
programa
ctty con
OJO! Es necesario hacer un CTTY CON antes de cualquier punto en que se requiera pulsar una tecla, si no el programa se bloqueará en ese punto
- Impedir la salida de mensajes de error aa la pantalla. La redirección solo reenvia los mensajes "normales" de un programa, los erroes siguen saliendo a pantalla
@echo off
ctty nul
Orden >nul
ctty con
Con esto Orden se ejecutará sin dar señales de vida
-Controlar nuestro ordenador desde otro, a traves del puerto serie.
En el controlador necesitamos un programa terminal
Conectar ambos ordenadores mediante un cable serie modem nulo
En el ordenador a controlar, teclear ctty com1
Para terminar el control a distancia enviar desde el ordenador controlador un ctty con
FIND
SET
DATE
FC
Compara dos archivos o conjuntos de archivos y muestra las
diferencias que hay entre ellos.
FC [/A] [/C] [/L] [/LBn] [/N] [/T] [/W] [/nnnn] [unidad1:][ruta1]archivo1
[unidad2:][ruta2]archivo2
FC /B [unidad1:][ruta1]archivo1 [unidad2:][ruta2]archivo2
/A Muestra s¢lo la primera y £ltimas l¡neas para cada grupo de
diferencias.
/B Realiza una comparaci¢n binaria.
/C Ignora may£sculas y min£sculas.
/L Compara archivos como texto ASCII.
/LBn Establece las diferencias consecutivas m ximas al n£mero
especificado de l¡neas.
/N Muestra el n£mero respectivo de l¡nea durante una comparaci¢n ASCII.
/T No reemplaza las tabulaciones por espacios.
/W Comprime espacios en blanco (tabs y espacios) al comparar.
/nnnn Especifica el n£mero de l¡neas consecutivas que deben coincidir
despu‚s de las diferencias.
Uso:
Comparar ficheros
Obtener una cadena de texto del usuario y ponerlo en una variable del sistema:
echo set name=%%5>escriba.bat
fc con nul /lb1 /n | date | find " 1: " > temp.bat
call temp.bat
del temp.bat>nul
del escriba.bat>nul
Numerar las lineas de un fichero:
FC /N nul file.txt > file2.txt
ATTRIB
SORT
COPY
prompt
Cambia el s¡mbolo del sistema de Windows.
PROMPT [texto]
texto Especifica un nuevo s¡mbolo del sistema.
El s¡mbolo puede estar compuesto por caracteres normales y los siguientes
c¢digos especiales:
$Q = (signo igual)
$$ $ (signo de d¢lar)
$T Hora actual
$D Fecha actual
$P Unidad y ruta actual
$V N£mero de versi¢n de Windows
$N Unidad actual
$G > (signo mayor que)
$L < (signo menor que)
$B | (Barra vertical)
$H Retroceso (borra el car cter anterior)
$E C¢digo de escape (c¢digo ASCII 27)
$_ Retorno de carro y salto de l¡nea
Escriba PROMPT sin par metros para restablecer
el s¡mbolo a la configuraci¢n predeterminada.
Se utiliza para
guardar datos del sistema en variables
@echo off
echo @prompt set _Here=$p$_ > _temp_A.bat
%comspec% /e:2048 /c _temp_A.bat > _temp_B.bat
call _temp_B.bat
del _temp_?.bat
o para enviar caracteres de redirección a fichero, sin que sean interpretados
IF
Ejecuta hasta fin de linea si se cumple condición
Tres sintaxis
Path existe?
if exist %1 echo Path %1 existe
Igualdad de cadenas
if %1=AEIOU echo la variable es AEIOU
Errorlevel es igual o superior
if errorlevel 1 echo errorlevel mayor o igual que 1
OJO! En comparación de cadenas no se admite simbolo ? ni *!
ANSI.SYS
VARIABLES
%0 A %9
SHIFT
%VAR%
%%I
% BLA BLA % comentario
NOTAS VARIAS
Ficheros auxiliares: usar cache, si se está en dos
REDIRECCION
< > >> |
La redireccion se interpreta antes. No puede hacerse echo de caracteres de redireccion, ni a fichero
Puede colocarse al principio
redirigir orden que no da salida da fichero vacio
if algo -redireccion pone prompt +linea siguiente en fichero redirigido
OTROS LENGUAJES
Cuando llegamos al limite de las posiblidades del DOS, debemos orientarnos a otros lenguajes complementarios
Junto con el DOS vienen dos aplicaciones poco utilizadas, que permiten extender las posibilidades, cuando se llega a un punto de complicación poco práctico.
QBASIC es un compacto y práctico interprete de basic DOS. Aunque algunos "locos" crean ficheros basic desde batch para pasarlos a qbasic, creo que es mucho mejor crear el programa entero desde el IDE del Qbasic, que permite una depuración mucho mas facil y rápida.
DEBUG (no viene con W95/98, hay que recuperarlo de DOS 6) .Es un editor hexadecimal con alguna capacidad de ensamblador que permite ser comandado desde la entrada standard, es decir puede recibir ordenes redirigidas desde un batch.
Del entorno UNIX nos vienen algunas aplicaciones muy potentes, que permiten extender
SED Es un editor de texto en batch. Es capaz de modificar automáticamente un conjunto de ficheros de texto, segun las ordenes de un conjunto de macros. Cuando se necesita un formateo especial
AWK Lee ficheros de texto formateados y procesa las entradas como campos y registros
En Windows tenemos aplicaciones capaces de ser mandadas desde un batch
La aplicación TELNET de windows está mandada por scripts, que pueden proceder de un fichero bat
Ficheros INF . Estos ficheros de texto permiten automatizar las modificaciones de registro de Windows en los programas de instalación. El estudio del registro de Windows sobrepasa los limites de esta página