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
-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
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 parametrosSi no hay parámetros en la llamada al programa se visualizará una ayuda y se terminará la ejecución.
@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 clsCuando 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
for %%i in (echo pause goto:end) do %%i SINTAXIS %0 par_1 par_2 par_3
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
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
Rodear la parte importante con
Ctty nul . . ctty conTodas 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
-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
-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.
:: 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
set exists=no if exist c:\dir\nul.* 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
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
@echo off "%_Here%\ cd "%_Here%
Devolver la extension de un fichero::%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_
@echo offContar numero de ficheros en directorio
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
Comprobar si un path dado contiene comodines@echo off attrib /s c:\*.* | find /c "\"
@echo off
for %%f in (%1) do if "%%f"=="%1" goto _nowilds
echo Parameter %1 contains wildcards (or is missing)
:_nowilds
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\%%ino 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 processSi hay que crear varios ficheros auxiliares, no podemos contar con los espacios, deberemos utilizar variables de sistema inexistentes.
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
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
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 clsregistrar 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_=
for %%i in (1 2 3 4 5 6 7 8 9 10) do echo %%i
@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
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?
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%\command\loadfix.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%\command\loadfix.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
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)
-enviar a ficheros auxiliares textos con ccaracteres de redireccion,@echo offctty 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
-ejecutar ordenes ANSI.SYS sin tener que introducir el caracter de escape
que en un prompt es $[
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:
-Separar cadena en letras (en dos pre-W95 se usaba for %%i in (/cadena))choice /n /ts,10>nul
-Poner el errorlevel en funcion de la saliida de una orden::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
type "C:\autoexec.bat"|find /i/c "REM"!choice /n/c0123456789Si no hay errorlevel se pone a 0,1,2 segun el numero de veces que se encuenra REM en el fichero
No anidablefor %%i in ( lista) do orden_dos (puede usarse %%i como parametro de la orden dos)
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 [con|nul|com1|com2...]
Usos
- Impedir que usuario interrumpa un programa
ctty nul- 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
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
@echo offCon esto Orden se ejecutará sin dar señales de vida
ctty nul
Orden >nul
ctty con
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 [/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.batNumerar las lineas de un fichero:
fc con nul /lb1 /n | date | find " 1: " > temp.bat
call temp.bat
del temp.bat>nul
del escriba.bat>nul
FC /N nul file.txt > file2.txt
SORT
COPY
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 offo para enviar caracteres de redirección a fichero, sin que sean interpretados
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
if exist %1 echo Path %1 existeIgualdad de cadenas
if %1=AEIOU echo la variable es AEIOUErrorlevel 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
*!
SHIFT
%VAR%
%%I
% BLA BLA % comentario
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
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
El siguiente personal frecuenta el grupo de noticias alt.comp.bat , sus páginas están en inglés
Collección de tips
and tricks de Timo Salmi:
ftp://garbo.uwasa.fi/pc/ts/tsbat57.zip
Libro Web sobre ficheros
batch Ted Davis: (puede descargarse en un fichero Zip
http://gearbox.maem.umr.edu/~batch/
. Site de Terry Newton :
http://www.nc5.infi.net/~wtnewton/batch/index.html
Dos textos de Dirk van Deun:
http://purl.oclc.org/net/dirk/batcoll.all
http://purl.oclc.org/net/dirk/batvirus.all
Temas escogidos, tratados
a alto nivel por Tom Lavedas:
http://www.pressroom.com/~tglbatch/
Eric Phelps:
http://www.calweb.com/~webspace/batch/index.htm