Beruflich Dokumente
Kultur Dokumente
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 numricas, ni tratamiento de cadenas, ni ningn tipo de estructuracin. El manual no da mas que unas mnimas 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 inverosmiles. Incluso hay quien tiene una pgina 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 creacin artstica, por supuesto, como l mismo dice). Algunos trucos son realmente tiles, como el que permite salvar el directorio actual(Push_pop), y despus volver a l. O el que, puesto en el autoexec.bat, permite ejecutar un programa slo si es -por ejemplo- Viernes. Todo ello es posible apurando las instrucciones del DOS hasta el lmite, y gracias a la experiencia compartida en la red por miles de usuarios. Esta pgina es un palido reflejo de las de los autenticos gurus de la programacin batch. Slo intenta acercar estos trucos a aquellos para los que la lengua inglesa constituye un problema. Algunos dirn para qu tanta complicacin, si existen soluciones alternativas: Sustitutos del command.com como el NDOS o el 4DOS: Son muy tiles, pero recordad que ms 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 matemticas. En Windows tenemos el Visual Basic para Aplicaciones, para ejecutarlo solo debemos tener abierta de las aplicaciones de Microsoft Office y aprendernos un lenguaje extenssimo, con una jererqua 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 instruccin 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 Depuracin Documentacion Secuencia de Ejecucion Entradas de Usuario Cadenas Alfanumericas Consideraciones para Windows Discos y Directorios Fecha, Hora, Temporizado Contaje, Numeros Ordenes del DOS
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 estbamos pensando cuando programamos aquello. Solucion: Documentar bien cada trozo del batch!
Comentario Oficial: Iniciar la lnea con REM. Es lento, porque el interprete de comandos procesa toda la linea. Por ejemplo, si la lnea contiene un simbolo de redireccin, sta se ejecutar, a pesar de ser una lnea de comentarios! Comentario no oficial : iniciar la lnea con un ::, el interprete lo considera como una etiqueta errnea y no lee mas alla del 2 caracter
espacio %
pueden introducirse comentarios de linea: % rodear comentario con porciento+ Ayuda a usuario: Poner como primera linea despus de @echo off:
if [%1==[ for %%i in (echo pause goto:end) do %%i Funcion del programa SINTAXIS %0 Descripcion de los parametros
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 instruccin FOR permite asignar asu variable ordenes del DOS que se ejecutan una detrs 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
:: 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 harn con redireccin a >con Las entradas de teclado dentro de la parte no interrumpible requieren redireccion de <con
-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:\dir\nul.* set exists=si
a continuacin 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
Pop:
@echo off for %%f in (%1) do if "%%f"=="%1" goto _nowilds echo Parameter %1 contains wildcards (or is missing) :_nowilds
no funcionar, ya que la orden de redireccin se interpreta antes que el for, y en ese momento %%i an 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 redireccin se interpretan primero y el primer caracter de redireccin 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 redireccin 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.
Solucin 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 travs 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 bsqueda, la primera busca las lineas con 3 espacios, con lo que el find se encuentra a si, mismo. La 2 busqueda elimina las lneas 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
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 Aadir en autoexec bat la linea win, que arrancar windows Aadir a continuacin 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_=
@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
Inicia una copia nueva del intrprete 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 tamao inicial del entorno en nnnnn bytes.(nnnnn debe estar entre 256 y 32.768) /L:nnnn Especifica la longitud de los bferes internos (requiere /P).(nnnn debe estar entre 128 y 1.024) /U:nnn Especifica la longitud del bfer de entrada (requiere /P).(nnn debe estar entre 128 y 255) /P Hace que el nuevo intrprete de comandos sea permanente(no se puede salir) /MSG Almacena los mensajes de error en memoria (requiere /P). /LOW Hace que COMMAND mantenga informacin 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 ejecutndose No documentadas: /F Responde automaticamente Fail al mensaje de error de E/S Abort,Retry,Fail?. Permite superar errores sin intervencin del usuario /D Si /F activo, abre nuevo shell en que /F est desactivado
-ejecutar ordenes ANSI.SYS sin tener que introducir el caracter de escape que en un prompt es $[
texto a presentar. Slo se requieren comillas si incluye \ _ /C[:]teclas Especifica las teclas permitidas en el smbolo del sistema.CHOICE usara SN como la opcin predeterminada. /N Evita que CHOICE presente el smbolo del sistema y las teclas permitidas /S Distingue entre maysculas y minsculas. /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 (Utilizacin 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
Si no hay errorlevel se pone a 0,1,2 segun el numero de veces que se encuenra REM en el fichero
for %%i in ( lista) do orden_dos (puede usarse %%i como parametro de la orden dos)
No anidable Ojo, no poner nunca %%i despus de un simbolo de redireccin, 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
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 redireccin 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 seales 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 slo la primera y ltimas lneas para cada grupo de diferencias. /B Realiza una comparacin binaria. /C Ignora maysculas y minsculas. /L Compara archivos como texto ASCII. /LBn Establece las diferencias consecutivas m ximas al nmero especificado de lneas. /N Muestra el nmero respectivo de lnea durante una comparacin ASCII. /T No reemplaza las tabulaciones por espacios. /W Comprime espacios en blanco (tabs y espacios) al comparar. /nnnn Especifica el nmero de lneas consecutivas que deben coincidir despus 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
El smbolo puede estar compuesto por caracteres normales y los siguientes cdigos especiales: $Q $$ $T $D $P $V $N $G $L $B $H $E $_ = (signo igual) $ (signo de dlar) Hora actual Fecha actual Unidad y ruta actual Nmero de versin de Windows Unidad actual > (signo mayor que) < (signo menor que) | (Barra vertical) Retroceso (borra el car cter anterior) Cdigo de escape (cdigo ASCII 27) Retorno de carro y salto de lnea
Escriba PROMPT sin par metros para restablecer el smbolo a la configuracin 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 redireccin a fichero, sin que sean interpretados IF Ejecuta hasta fin de linea si se cumple condicin
Igualdad de cadenas
if %1=AEIOU echo la variable es AEIOU
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
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 complicacin poco prctico. QBASIC es un compacto y prctico 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 depuracin mucho mas facil y rpida. 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 automticamente 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 aplicacin 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 instalacin. El estudio del registro de Windows sobrepasa los limites de esta pgina