Vous êtes sur la page 1sur 37

c 


  

   
  

Este documento es de dominio público y se redacta bajo la licencia de Software Libre


Prohibida la reproducción total o parcial de este texto sin poner la fuente
('http://www.elhacker.net') o sin respetar la licencia de 'Software Libre'
Prohibida la modificación o eliminación de enlaces e imágenes en este documento.
Redactado por Soplo el 31 de Agosto de 2005

Para consultas pinchar aquí

1. Introducción
2. Qué se puede hacer con un programa.BAT?
3. Crear un programa.BAT
4. Redirección de entrada/salida
5. Filtros
6. Máscaras y comodines
7. Trayectos (paths)
8. Unidades Lógicas
9. Comandos MSDOS
9.1 Comandos básicos de consola
9.2 Comandos de manejo de archivos
9.3 Comandos de disco
9.4 Comandos de red
9.5 Comandos de programación
10. Variables de entorno
11. Etiquetas
12. Parámetros reemplazables
13 Acceso al registro
14. Enviar por ftp de forma automática

   
Las siglas BAT características de los guiones en entorno MSDOS provienen del hecho
de que son procesos BATCH. En Msdos los nombres de los archivos podían tener hasta
8 letras para el nombre y tres letras para la extensión. Dado que solo se disponía de tres
letras para identificar la clase de archivo se optó por poner BAT (aunque a partir de
Windows 2000 también se puede usar CMD).

Los proceso batch son nativos de MVS/DOS y VSE/DOS que suelen funcionar con
JCL. RPG es un lenguaje basado íntegramente en la metodología batch.

Desde entonces cada sistema operativo que ha salido ha incluído un sistema de


scripting. Los grandes sistemas se quedaron con JCL/JOBS mientras que la aparición de
UNIX, MINIX y demás empezaron a utilizar una shell diferente y mas interactiva con
un espacio de consola para los usuarios y un lenguaje apropiado para administrar la
estación (esto no era necesario en MVS o VSE porque el usuario actuaba sobre pantallas
tontas 3270) Se llamó shell y se conoce habitualmente como sh. Posteriormente salieron
otras entre las cuales está bourne shell again conocida como bash.

Microsoft hizo una para su sistema operativo que copió descaradamente de bash.
Invirtió la barra para identificar el path correcto a un archivo y adaptó el lenguaje a un
sistema operativo monousuario e incapaz de trabajar en red. Este es el lenguaje BAT.
Con los años microsoft se ha visto obligado a modificarlo considerablemente (sobre
todo los comandos de entorno de red) dadas las muchas limitaciones que tenía. Aún hoy
es increíblemente pobre en comparación con las de otros sistemas operativos. El
lenguaje bat es un complemento en windows y no una parte fundamental como en los
demás.

Volver al menú

þ    


Pues se puede hacer de forma automatizada todo aquello que se pueda hacer en la
consola de msdos. Se pueden ejecutar programas, enviar y recibir parámetros y
automatizar tareas

Volver al menú

     


Pues son texto plano. Quiere eso decir que se pueden escribir en el block de notas,
utilidad Edit de msdos o algún editor ascii.

Al guardarlos deben tener la notación de nombres propia de msdos. Esto es un nombre


con máximo 8 letras (espacios y \ no permitidos), luego un punto y la extensión que en
este caso es obligatoriamente BAT (para compatibilidad con todas las versiones
windows) o CMD (a partir de Windows 2000).

Para crearlos desde la misma consola puedo utilizar varios sistemas

Mediante la orden COPY

Orden de creación de archivo con el nombre


copy con: nombre_de_archivo.bat
'nombre_de_archivo.bat'
...
...
comandos órdenes a ejecutar
...
...
Fin y grabación del archivo en el directorio
Ctrl + Z
actual

Método 2 mediante la redirección


echo 1º línea a insertar Se graba el fichero 'nombre_de_archivo.bat con
>nombre_de_archivo.bat la primera orden a ejecutar
echo restantes líneas
Se añade la segunda orden
>>nombre_de_archivo.bat
echo restantes líneas
Se añade la tercera orden ...
>>nombre_de_archivo.bat

En cualquier caso para modificarlos podemos utilizar la utilidad Edit de msdos


(abriendo el archivo concreto y luego grabando los cambios) o el block de notas.

Volver al menú

'       

Pues al igual que en unix se puede hacer que la salida de un comando sirva como
entrada de otro. Cada proceso tiene ya predeterminados sus dispositivos de entrada y
salida. Mediante la redirección podemos cambiar eso.

DISPOSITIVO SALIDA
CON Salida por la pantalla
PRN Salida por la impresora por defecto
LPT1 Salida por la 1º impresora en paralelo
COM1 Salida por el primer puerto serie
COM2 Salida por el segundo puerto serie

Así, si ejecuto la orden 'dir' la orden saldrá en su dispositivo por defecto (CON) y veré
el resultado por pantalla

Para redireccionar se utilizan los operadores < y > que sirven para indicar que salida
debe ir a que lugar

Por ejemplo si yo quiero redireccionar la salida estandar de dir para que en vez de ir a la
pantalla vaya a la impresora haré

dir >prn

Con lo que la salida natural del comando DIR en vez de ir a su sitio natural (la pantalla)
irá a la impresora por defecto.

Volver al menú

! " 

Los filtros son órdenes que sirven para formatear la salida del comando de acuerdo a
nuestros intereses. Se utilizan mediante la barra vertical (Alt 124).

El filtro SORT sirve para ordenar la salida

DIR | SORT
El filtro MORE sirve para pausar la salida cada pantalla para que pueda ver todos los
datos de salida con tranquilidad. Pasa de pantalla a pantalla al pulsar una tecla.

DIR | MORE

È #$ %
 
Para seleccionar varios archivos a la hora de realizar una determinada operación existe
la posibilidad de utilizar máscaras. Estas máscaras utilizan los caracteres comodines
para describir que archivos deben verse afectados. Para ello y teniendo en cuenta que
los nombres de los archivos deben cumplir la notación de msdos (8 letras sin espacios
como máximo, luego un punto y tres letras como máximo de extensión) se pueden
utilizar los llamados comodines.

* Equivale a varios caracteres


? equivale a un solo caracter.

Ejemplos

*.cfg seleccionar todos los archivos que tengan la extensión cfg


a*.cfg seleccionar todos los archivos que comienzen por a y tengan la extensión cfg
seleccionar todos los archivos que comienzen por a, acaben por b y tengan la
a*b.cfg
extensión cfg
*asa*.cfgseleccionar todos los archivos que contengan 'asa' y tengan la extensión cfg
seleccionar todos los archivos que contengan una C, luego un caracter
c?asa.cfg
cualquiera y luego 'asa'. Debe tener también la extensión cfg
seleccionar todos los archivos que empiezen por c, tengan un caracter
c?b*.*
cualquiera, luego una b y cualquier extensión
seleccionar todos los archivos que tengan una extensión que empieze por b,
*.b?t
luego un caracter cualquiera y luego una t.

Volver al menú

&  %' (

La trayectoria es el nombre completo de un archivo e indica la situación exacta de un


archivo y su nombre.

el archivo se llama indico su nombre, pero nada mas. Se da por supuesto que
leeme.txt
se encuentra en el directorio actual.
el archivo que me interesa se llama leeme.txt y se encuentra en el directorio
c:\leeme.txt
raíz de C.

Dado que en msdos no se admiten nombres largos (mas de 8 letras) ni espacios, cuando
quiero utilizar un nombre de windows en msdos debo saber que este será reconvertido a
su nombre corto. Este se obtiene añadiendo los seis primeros carácteres válidos del
nombre, luego el signo ~ (alt 126) y luego un número.

De esta forma un archivo que se encuentre en Mis documentos en win98 tendrá el path

c:\misdoc~1\leeme.txt
Y en Windows 2000/XP

c:\Docume~1\Usuario\misdoc~1\leeme.txt

También se pueden utilizar (mientras las comillas para delimitar el nombre

"c:\Mis Documentos\leeme.txt"

Esta sería la trayectoria de mimusica.mp3 (en Mis Documentos en Win 98)

c:\misdoc~1\mi~1\mimusica.mp3
Qué equivale a
"c:\Mis Documentos\Mi Música\mimusica.mp3"

Volver al menú

] ) c 
Siempre es una letra seguida del signo dos puntos.
A: = disquetera
B: = reservada para segunda disquetera
C: = primera partición (normalmente es la que arranca)
D: = segunda partición (generalmente el cdrom)
Por eso si se crea una unidad lógica mediante netbios en windows, esta puede tener un
nombre msdos para poder acceder a ella desde la consola. La letra que se asigne no
puede corresponder a una unidad lógica existente.

Volver al menú

* 
 #+,-+

Los comandos en msdos tienen las siguientes características:

a) el formato general es COMANDO [OPCIONES] [ARGUMENTOS]

b) Da igual que se usen mayúsculas o minúsculas

c) Los argumentos y opciones se separan por espacios

Volver al menú

* 
 $ 

*  c+

Borra la pantalla

*  þ. [parámetros]

Tiene varias posibilidades:


i ECHO sin parámetros saca el estado en que se encuentra la variable echo (on u
off)
i ECHO ON activa el echo (como en un terminal TTY) por lo que los comandos
se verán en pantalla y luego su resultado
i ECHO OFF desactiva el comando echo y ya se verán los resultados de la
ejecución del comando, pero no el comando en sí mismo
i ECHO LITERAL saca por pantalla el literal. Por eso al hacer echo literal
>fichero.bat estamos redirigiendo la salida de echo literal (que tendría que salir
por la pantalla) al archivo fichero.bat.

*  /  [mensaje]

Sirve para sacar un mensaje y parar la ejecución hasta que se pulse una tecla

*  '/ 
 [parámetros]

Sirve para cambiar el prompt de msdos.

$p Mostrar el trayecto actual


$g Mostrar el separador >
$l Mostrar el separador <
$b Mostrar el separador |
$q Mostrar el separador =
$$ Mostrar el separador $
$t Mostrar la hora
$d Mostrar la fecha
$v Mostrar la versión del sistema
$n Mostrar la unidad actual
$h Retroceso. Borra el caracter previo
$e Escape. Muestra el caracter \
$_ Retorno de carro y salto de línea (equivale a chr 10 y chr 13 ascii

Por eso si ponemos prompt $p$g el cursor muestra la trayectoria donde estamos y luego
el separador

Es posible añadir texto (por ejemplo prompt Mi_nombre $p$g

*  !,  [fecha]

Ver/poner la fecha del sistema

*  È
 [hora]

Ver/poner hora del sistema

*  &0

Versión del sistema

*  ]01) 2
Volumen de la unidad especificada.

*  */ 1 %2

Indica un trayecto por defecto si se produce una petición de un archivo que no está en el
directorio actual.
Por eso en windows 98 suele haber una línea en autoexec.bat que es

que indica que si se solicita un ejecutable que no esté en el


path c:\windows;
directorio actual, lo busque primero en la carpeta windows y
c:\windows\command
luego en la subcarpeta command.

En Windows 2000 y XP no se utiliza autoexec.bat pero se existe una variable del


sistema llamada PATH.

*  34.5 6 786 6  7 96 6 7

El código de país de españa es el 'sp'


El juego de caracteres aplicable a españa es el 850 ó 437
El archivo de definición de teclado es keyboard.sys
Para configurar un teclado en español

keyb sp,,c:\windows\command\keyboard.sys

*  +5+1 2

Transfiere el sistema operativo msdos a la unidad especificada.

*  þ,-+4.5

Muestra los comando utiliados anteriormente al pulsar la tecla arriba del teclado.

*  #.#1 $
 2

Muestra la memoria usada y libre en el sistema

/p Muestra por programas


/d por programas y controladores
/c por tamaño

Volver al menú

* þ
  
8  :

* þ -/5121 21 2

Sirve para copiar archivos de un lugar a otro. el origen debe ser un trayecto completo de
donde están los archivos a copiar. Si se omite se entiende que en el directorio actual.
El destino debe ser una trayectoria completa de donde dejar el/los archivo(s)
copy miarchivo.txt
copiarlo al directorio raíz de C
c:\
copy miarchivo.txt
copiarlo y además cambiarle el nombre a miarch.tx
c:\miarch.txt
copy *.txt a:\ copiar todos los archivos que tengan la extensión txt a la unidad A
copy *.txt copiar todos los archivos que tengan la extensión txt al directorio
c:\misdoc~1 Mis documentos (cuyo nombre corto es misdoc~1).

También se pueden concatenar archivos

copy archivo1.txt+archivo2.txt Unir archivo1.txt y archivo2.txt y dejarlo en


c:\archivo3.txt archivo3.txt en C:\

Las opciones son

/ATratar el archivo como un archivo ASCII


/B Tratar el archivo como un archivo binario
/D Permite que el archivo destino se grabe descifrado
/VVerifica la copia
/N Al copiar usa el nombre corto en vez del nombre largo
/YSuprime la pregunta de confirmación si se va a sobreescribir algún archivo
/Z Copia archivos de red en modo reiniciable
/S Copia subdirectorios
/E Crea subdirectorios en el destino aunque los subdirectorios originales estén vacíos.

Se pueden guardar estos valores por omisión en la variable de entorno COPYCMD


(solo a partir de Windows 2000).

* þ þ,.c121 :2

Borra archivos

/P Pide confirmación en cada caso


/F Modo force. Borra incluso los archivos de solo lectura
/S Borra también los subdirectorios.
/Q Modo silencioso. No pide confirmación en ningún caso

* þ #4, #,1   2

Crear directorio

* þ ' #,  ,1   2

Borra un directorio. El directorio debe estar vacío

* þ !;, ,1 2

Cambia al directorio indicado.

CD "c:\archivos de programa" Trasladarse al directorio Archivos de programa


CD .. Trasladarse al directorio superior
CD \ Trasladarse al raíz

* þ È, 121 %2

Saca una lista del contenido del directorio especificado en el trayecto. Si no se


especifica nada, se entiende el actual.
Si se pone como parámetro /W saca un listado resumido.
Si se pone como parámetro /P saca un listado utilizando el filtro more.

* þ & 1 +21 :2

Muestra los atributos de los archivos indicados y en su caso permite cambiarlos.

Con el parámetro /S busca también en subdirectorios.

Los atributos son:


H -> oculto. Se activa con +h y desactiva con -h
R -> Lectura. Solo lectura con +r, normal con -r
S -> Sistema. Se activa con +s y desactiva con -s
A -> Modificado. Para copias de seguridad incrementales. +a indica modificado y -a
indica no modificado.

ATTRIB archivo.txt Muestra los atributos de ese archivo


ATTRIB -r
Pone el atributo solo lectura a archivo.txt
archivo.txt

Attrib miarchivo.txt (mostrar los atributos de miarchivo.txt)


attrib *.exe +r +r +s (pone a todos los archivos con extensión exe como ocultos, del
sistema y read only)

* þ ] .<#. .<1<
 6 21<
 6:2

Renombra un archivo.

Si se ponen múltiples archivos todos se renombran mediante la misma regla

REN *.txt *.bak Renombra todos los archivos TXT a BAK

* þ *5/.9 

Muestra el fichero. Se suele utilizar con el filtro MORE si se desea que se vea paginado

type archivo.txt | more

o bien con redirección a la impresora para imprimirlo

type archivo >prn


Volver al menú

* 
   

*  ,=%1 21 2

Copia un disquete completo de origen a destino

diskcopy a: a: copia un disquete de unidad A a la unidad A


diskcopy a: b: copia un disquete de unidad A a la unidad B

*  þ" =1
 2

Utilidad para gestionar las particiones de un disco.

Con el parámetro /mbr se puede borrar el mbr (Master Boot Record) de un disco

*  "
1 21 2

Formatear disquetes.

Con el parámetro /s se transfiere además el sistema operativo (válido para win98 y


anteriores)

Con el parámetro /a se realiza un formateo rápido.

*  ' 1 21> 2

Poner etiqueta a un volumen

label a: copia Poner etiqueta copia en el disquete


label c: DiscoDuro Poner etiqueta DiscoDuro al disco duro

*  !# ?1 @
 82

Monta un cdrom o dvd ya configurado mediante un driver de dispositivo. El punto de


montaje es el especificado en config.sys en el driver de dispositivo.

Válido en Win98 y anteriores

*  È+  =1 21 9?21  %21  9 2

Comprueba la integridad de un disco en Windows 98 y anteriores.

Con el parámetro autofix repara automáticamente los errores encontrados.

Con el parámetro scanonly solo comprueba el disco y muestra estadísticas

Con el parámetro Surface realiza una comprobación de superficio del disco


Volver al menú

* '
    

* '  /12

Ver/Modificar la tabla de ARP.

arp -a Muestra la tabla de arp


apr -s IP mac Agrega una entrada a la tabla de arp

* ' þ"/

Cliente ftp de windows

* ' /-<"A1/ $
 2

Mostrar los parámetros de conexión tcp/ip

ipconfig /all muestra toda la información de configuración


/release adaptador libera la ip del adaptador especificado
/renew adaptador renueva la ip para el adaptador especificado
/flushdns purga la caché de resolución de dns
/registerdns actualiza las conexiones dhcp y vuelve a registrar los nombres dns
/displaydns muestra el contenido de la cache de resolución dns

* ' '<+12

Hace un estado de la red por netbios

nbtstat -a Lista la tabla de nombres por nombre


nbtstat -A Lista la tabla de nombres por IP
Lista la caché nbt mostrando nombres y
nbtstat -c
direcciones IP
nbtstat -n Lista los nombres netbios locales
nbtstat -r Lista de nombres resueltos por difusión y WINS
nbtstat -R Purgar y recargar la cache nbt
nbtstat -S Lista las sesiones con las IP de los destinos
nbtstat -s Lista las sesiones con los nombres de los destinos

* ' !<12

Conmando para acceder a dominios, crear/quitar sesiones netbios, montar unidades


netbios, ...

Algunos comandos también funcionan en win9X, pero a partir de Win2k se añadieron


muchos parámetros nuevos.

Tiene muchas posibilidades y se usa siempre con parámetros. Los parámetros son:
Servicios
net start X Inicia el servicio X
net stop X Termna el servicio X
net config
Muestra/modifica servicios.
server
/hidden=yes/no indica si el servidor debe mostrarse en la lista de
ordenadores. Se corresponde con el comando Samba 'browseable'
/autodisconnect:X minutos antes de que se desconecte un usuario del
servidor
net pause X Detiene el servicio X
net continue X Reanuda el servicio X

Recursos
net view X
mostrar dominios enteros o recursos en un equipo
/domain: Y
/Domain: y -> muestra equipos en el dominio
X es el servidor que se desea ver (\\X)
net print
Permite ver/modificar la cola de impresión
impresora
/hold:x -> no imprimir el trabajo X
/release:x -> reanudar trabajo X
net share Mostrar/modificar recursos compartidos
net use nombre
Crear una conexión de red
\\recurso

Usuarios
net group x Añadir/ver/modificar grupos de usuarios en un dominio
/Domain:x -> nombre del dominio
/add x -> añadir un grupo nuevo
net user usuario
Añadir/ver/modificar usuarios en un dominio
clave
/domain:nombre -> nombre del dominio
/add x -> agregar usuario al dominio
Si en clave se pone * se indica ue hay que preguntar cada vez
/delete -> borrar usuario
net accounts Muestra/modifica la cuenta de un usuario
/minpwlen:x -> longitud mínima de password
uniquepw:x -> solo se puede usar la clave x veces. Luego hay que
cambiar
/domain: nombre -> nombre del dominio
/sync -> sincronizar los cambios en los servidores BDC

Comunicaciones
net send x y Enviar mensaye Y a usuario/ordenador X
Si nombre es * se envía a todos los miembros del grupo/dominio
/domain: nombre -> nombre del dominio

* ' È< 12

Comando para comprobar el estado actual de la red


netstat -a Mostrar todos los puetos y conexiones
netstat -n Mostrar número de puerto y direcciones
netstat -r Mostrar la tabla de rutas
netstat -s Mostar estadísticas por protocolo
netstat -p tcp/udp Mostrar las conexiones activas TCP o UDP

* ' &<=12

Utilidad para interrogar dns

* ' ]/12

Enviar paquetes icmp a un determinado destino.

ping -t ping al host hasta que se pare


ping -a resolver direcciones en nombres de host
ping -n numero Número de peticiones a enviar
ping -l tamaño tamaño del buffer

* ' *121 2

Inicia una sesión telnet al host especificado en el puerto especificado. Si el puerto se


omite se usa el 23.

* ' 3  1 2

Tracear el destino hasta llegar a la ruta indicada.

Volver al menú

* !
   


* ! . 1 :2

Editor de textos (equivalente al bloc de notas)

* ! þ,1 :212

Inicia el desensamblador con el programa indicado.

* ! 1?212

Se utiliza en programas bat para dar a elegir a un usuario entre un conjunto de opciones
La respuesta se devuelve mediante la variable errorlevel
Mostrar el literal "elija una opción y dar a elegir s (sí), n (no) o C (continuar). las tres
siguientes líneas especifican a donde debe saltar el flujo del programa según la tecla
pulsada.

choice Elija una opción snc Mostrar el texto y las opciones (S, N, C)
if errorlevel 1 goto ... si se ha pulsado S
if errorlevel 2 goto ... si se ha pulsado N
if errorlevel 3 goto ... si se ha pulsado C

* ! '91 21
 2

Sirve para hacer bifurcaciones en el código.


Admite 6 sintaxis distintas:

if exist fichero orden si existe 'fichero' ejecutar la orden


if not exist fichero si no existe fichero ejecuar la orden
if cadena1==cadena2 orden comparar cadena1 y cadena2
if not cadena1 == cadena2 orden si son distintos
si el comando anterior acabó con un errorlevel
if errorlevel numero orden
igual o superior a numero ejecutar orden
si el comando anterior acabó con un errorlevel
if not errorleven numero orden
inferior a numero ejecutar orden

* ! '9 

El formato general es

for %%variable in lista do ( orden 1


orden 2
orden 3
)

La variable siempre lleva dos veces el signo %

Ejemplo

FOR %%x IN (texto1.txt texto2.txt texto3.txt) do delete %%i

Esta orden haría lo siguiente: repetiría 3 veces la orden delete. En cada vez %%i valdría
cada valor de la lista de manera que la primera vez sería texto1.txt, la segunda vez
texto2.txt y la tercera vez texto3.txt.

Así esta orden haría:


DELETE TEXTO1.TXT
DELETE TEXTO2.TXT
DELETE TEXTO3.TXT

Volver al menú

30    

set variable=valor Declarar una variable de tipo string y le da un valor


SET /n variable = valor1 + valor2 Declara una variable de tipo numérico cuyo valor es
+ valor3 la suma de valor1+valor2+valor3
También hay algunas variables que ya vienen declaradas como la variable PATH, OS,
por ejemplo. Estas variables que ya vienen declaradas puedes verlas en propiedades de
mi pc, avanzado, variables de entorno y están a tu disposición en ficheros por lotes (bat)

Para referirte a cualquiera de estas variables las pones entre los signos %
Así para saber saber si tu sistema operativo es win98 haces

IF %os% == WINDOWS98 ECHO ES WINDOWS 98

Volver al menú

 .> 

Se pueden definir etiquetas que se utilizarán para saltar a ellas cuando se cumpla una
condición. Para definir una etiqueta pones una línea que empiece por : y luego el
nombre de la etiqueta
Por ejemplo:

ORDEN 1
ORDEN 2
if %os% == Winnt goto
Si el sistema operativo es NT ir a etiqueta winnt
winnt
ORDEN 3 esta línea se ejecuta si no es winnt
goto fin
:winnt etiqueta
ORDEN 4 esta línea se ejecuta si es NT
:fin etiqueta

Volver al menú

þ / $
  
 B 
A menudo en este tipo de archivos tu quieres poder pasarle parámetros. Estos
parámetros sirven para que el script haga una cosa u otra en función del parámetro que
le pasas. Por ejemplo si tienes un archivo bat cuyo nombre es
AVERIGUARSISTEMAOPERATIVO.BAT tu puedes hacer lo siguiente:
AVERIGUARSISTEMAOPERATIVO windows98
AVERIGUARSISTEMAOPERATIVO win2000
AVERIGUARSISTEMAOPERATIVO winxp

En los tres casos llamas al mismo script AVERIGUARSISTEMAOPERATIVO, pero


en cada caso le pasas un parámetro diferente. En el primero le pasas windows98, en el
segundo le pasas win2000 y en el tercero le pasas winxp.

Para referirte al parámetro en el código debes saber que el sistema les asigna nombre de
forma automática. Ál primero le llama %1, al segundo %2, al tercero %3, ..., al mil
%1000

Así yo podría tener un archivo bat llamado


AVERIGUARSISTEMAOPERATIVO.BAT que me confirma si mi sistema operativo
es el que yo creo.
Su código sería:

if %os%==%1 goto si el sistema operativo (%os%) es igual al primer parámetro


correcto (%1) ir a etiqueta correcto
echo el sistema operativo
poner el mensaje de que no es
NO es %1
goto fin
:correcto etiqueta
echo el sistema operativo
poner el mensaje de que si es
SI es %1
:fin

Volver al menú

    

  1 21
 2

Operacion puede ser

REG QUERY clave [/v nvalor | /ve] [/s] #Consultar una clave o subclave
Clave = \equipo\lclave #si se omite equipo se usa el equipo local. En
equipos remotos solo disponibles HKLM y HKU
/v = consulta para una clave de registro específica
/ve = consulta el valor predeterminado
/s = consultar todos los valores/subclaves
SAVE SAVE clave archivo #guarda en un archivo un arbol del registro.
ClaveRaiz=HKLM, HKCU, HKCR, HKU,
Clave=ClaveRaiz\SubClave
HKCC
SubClave=nombre completo
de la subclave
Archivo = Nombre del
archivo para guardar
COMPARE clave1 clave2 [/v valor | /ve] [salida] [/s] #compara dos subclaves o árboles
de registro
Clave = ClaveRaiz=HKLM, HKCU, HKCR, HKU,
\\equipo\ClaveRaiz\SubClave HKCC
Valor = nombre del valor para comparar en la clave seleccionada (si se
omite se comparan todos)
/ve = Comparar el nombre de valor vacío
/s = comparar todas las subclaves y valores
salida [/oa | od | os | on] #oa=devuelve todas las coincidencias y diferencias,
od=solo diferencias, os=solo coincidencias, on=nada
ADD Clave [/v nvalor | /ve] [/t tipo] [/s separador] [/d datos] [/f] #agregar una subclave
al registro
Clave = ClaveRaiz=HKLM, HKCU, HKCR, HKU,
\\equipo\ClaveRaiz\SubClave HKCC
/v = Nombre del valor a
agregar
/ve = agrega el valor vacío
(sin nombre)
/t = REG_SZ, REG_MULTI_SZ, REG_DWORD_BIG_ENDIAN,
REG_DWORD, REG_BINARY, REG_DWORD_LITTLE_ENDIAN,
REG_NONE, REG_EXPAND_SZ (si se omite se asume REG_SZ)
/s = caracter. (si se omite se
asume \0)
/d = datos que se agregan al
valor a insertar
/f = fuerza la sobreescritura
sin avisar
LOAD clave archivo #carga un archivo en un árbol
ClaveRaiz=HKLM, HKCU (solo para equipo
Clave =ClaveRaiz\SubClave
local)
Archivo: creado con reg save
EXPORT clave archivo # exportar subclaves y valores
ClaveRaiz=HKLM, HKCU, HKCR, HKU,
Clave =ClaveRaiz\SubClave
HKCC
Archivo: archivo donde exportar
DELETE clave [/v nvalor | ve] [/va] [/f] #borrar un arbol del registro
ClaveRaiz=HKLM, HKCU, HKCR, HKU,
Clave =ClaveRaiz\SubClave
HKCC
nvalor: nombre de valor a borrar. Si se omite se borrarán todas las
subclaves y valores
/ve elimina el valor de un nombre de valor vacío
/va elimina todos los valores en la clave actual
/f fuerza la eliminación sin avisar
UNLOAD
#descargar un arbol del registro
clave
ClaveRaiz=HKLM, HKCU (solo para equipo
Clave =ClaveRaiz\SubClave
local)
IMPORT
Importa un arbol al registro. El archivo debe haber sido creado con export
archivo
archivo = archivo.reg (solo equipo local)
COPY clave1 clave2 [/s] [/f] #copia una clave en el registro
ClaveRaiz=HKLM, HKCU, HKCR, HKU,
Clave =ClaveRaiz\SubClave
HKCC
/s = copia todas las subclaves
y valores
/f = fuerza la copia sin avisar
RESTORE clave archivo
ClaveRaiz=HKLM, HKCU, HKCR, HKU,
Clave =ClaveRaiz\SubClave
HKCC
Archivo: Nombre del archivo Este archivo debe haber sido creado con reg
a restaurar save

Ejemplos

Mostrar el valor de versión del registro


reg query HKLM\Software\Microsoft\Rest /v Version

Mostrar todas las subclaves y valores en la clave de registro Setup

reg query HKLM\Software\Microsoft\Rest\Setup /s

Guardar el subarbol MiAp en el archivo CopiAp.hiv en la carpeta actual

reg save hklm\Software\Mico\MiAp CopiaAp.hiv

Comparar los valores de MiAp con los de GuardaMiAp

reg compare khlm\softare\Mico\Miap HKLM\Software\Mico\GuardaMiAp

Agregar una clave Mico en el equipo remoto ABC

reg add \\abc\HKLM\Software\Mico

Agregar un valor 'datos' de tipo REG_BINARY y contenido 'fe340ead'

reg add HKLM\Software\Mico /v datos /t REG_BINARY /d fe340ead

Cargar el archivo CopiaAp.hiv en MiAp

reg load hklm\Software\Mico\MiAp CopiaAp.hiv

Exportar todas las subclaves de la clave MiAp a CopiaAp.REG

reg export HKLM\Software\Mico\MiAp CopiaAp.reg

Eliminar el contenido de TIMEOUT y todas sus subclaves y valores

reg delete hklm\Software\Mico\MiAlp\Timeout

Descargar el arbol MiAlp del registro

reg unload /hklm\software\Mico\MiAp

Importar el archivoCopiaAp.reg

reg import CopiaAp.reg

Copia todas las subclaves y valores de MiAp a GuardaMiAp

reg copy hklm\software\mico\MiAp hklm\Software\Mico1

Copiar todos los valores de la clave Mico en otro equipo al equipo actual

reg copy \\equipo\hklm\softwaer\Mico hklm\software\mico1


Restaurar el archivo CopiaAp.hiv sobreescribiendo la clave 'datos'

reg restore hklm\software\mico\MiAp\Datos CopiaAp.hiv

Volver al menú

'.:  9 9


 
$ (cortesía de rkk)
@echo off
rem Inicia sesion en el servidor FTP
ftp -s:Coman.txt 124.102.23.5

en la ultima linea estoy indicando con el -s:Coman.txt el nombre del archivo donde se
encuentran guardados los comandos que va a ejecutar el ftp seguido de la direccion ip a
la que me voy a conectar; dentro del archivo Coman.txt tengo el nombre del usuario, la
contraseña y los comandos que se van a ejecutar:

Ejemplo:
Marco
12345
binary
hash
bye
Programación BATCH Avanzada.

 
1.- Variables y Argumentos.
2.- Imprimir caracteres de comandos.
3.- Algunas otras variables de Entorno.
4.- IF
5.- FOR
6.- Funciones
7.- Includes
8.- Misc
9.- EOF


 

El manejo de variables en batch, es muy flexible., y este nos permite hacer desde operaciones
matemáticas, hasta seleccionar ciertas partes de una variable, asi como reemplazar cadenas
de texto, y obtener archivos.. y sus propiedades, la fecha, hora, generar numeros aleatorios,
entre otros.

Los argumentos que recibe un batch, son recibidos de la siguiente forma:

batch argumento1 dos tres

hara que:
%0 = batch
%1 = argumento1
%2 = dos
%3 = tres

en %0 se guardara, el nombre del archivo.

Podemos borrar el contenido de un parametro con el comando shift:

Código
ó|  
|     
 
|     

al llamar:

Código
C:\D
      \A   \ 
     
    
   

shift borro, el primer argumento.

Tambien contamos con los siguientes modificadores para los archivos:

Código
      
 !  "#  $
        
  $
        
 à|  "# $
         %   "# $
&        &  à|  "# $
        
'   ' 
 %   à|  "# $
      %
 à|  "#$
      " " à|  "# 
(      ) à|  "# $

por ejemplo:

en un directorio donde tenemos:

Código
C:\D
      \A   \ 
 à
* #
 
 C   +
$
* ,     à| #
: A -

D   C: \D


      \A   \ 


 : .DIR $


 : .DIR $$
 :   "#$&
  "#  %! 
  ''' %!  % 

este batch:

Código
ó|  
|  R
   "#: 
|  D : 
|    
: 
|  / % :  
|  *&  : &
|  R
 C: 
|  A%
: 
|  0 ": 
|  1 ): (

llamandolo analiza.bat, saca el siguiente resultado:

Código
C:\D
      \A   \ 
   (  "#$&
R
   "#: C: \D
  
  \A  \ 
\ "#$&
D : C:
  
: \D
      \A   \ 
\
/ % :  "#
*&  : $&
R
 C: C: \DOCUM*\ADMI/I\1*MPCU\ "#$&
A%
: 
0 ":  :
1 2: 

Tambien podemos usar varias propiedades, por ejemplo, este codigo:

Código

ó|  

|   &

saca este resultado:

Código
C:\D
      \A   \ 
   (  "#$&
  :  "#$&

Si lo que recibimos no es un archivo, sino una cadena de texto, que contiene mas de una
palabra, se debe poner entre comillas, algo asi:

astring "parametro de varias letras"

al obtenerlo, en %1, lo recibimos con comillas, pero si usamos:

Código
ó|  
| 
 C  : 
|   C  : 

saca este resultado:

Código
C:\D
      \A   \ 
   3 
 # 3

 C  : 3   #  3


 C  :    # 

Y por ejemplo, si queremos obtener todos los argumentos, se usa:

%*

es decir:

Código
ó|  

|  A
: 4

al ejecutar:

astring parametro de varias letras

nos regresa:

Código
C:\D
      \A   \ 
     
# 
A
:    # 

Para asignar a una variable, el valor de algo escrito por el usuario, puedes usar:

set /P variable=

por ejemplo:

Código

ó|  
|  5C    6
| P #7

|  1
    #

hara algo asi:

Código
C:\D
      \A   \ 
  
89:C    6
;

1
   ;

Ahora, si por ejemplo, queremos, hacer algo como, obtener las ultimas 3 letras del nombre:

Código
ó|  
|  * % 
/ %
| P /OM7
|  /OM:

Aqui lo que estamos haciendo en la ultima linea:

%NOM:~-3%
hara, obtener los ultimos 3 caracteres, como si se tratara de la funcion substring.

por ejemplo, esto:

%NOM:~1,3%

obtendra del segundo al cuarto caracter. (empiezas desde 0, recuerda)

Para reemplazar cadenas, dentro de otra variable, es la siguiente sintaxis:

Código

ó|  
|  * %
 
| P 0RA7
|  0RA: 7<<< 

esto reemplazara las letras "e" por "XXX".

Para hacer calculos matematicos, se usa el modificado /A, de esta forma:

Código
ó|  
| A &7
|  &
| A &7&4
|  &

tenemos las siguientes operaciones disponibles:

Código
ë  

4        = 
>       = 
..   !, ? 
8  A/D
@  <OR
A  OR
7 47 7 7 >7 7    ?
87 @7 A7 ..7 7
'     & ?

Con este podemos usar numeros hexadecimales de la siguiente forma:

Código
ó|  
| A &7
|  &
| A &7&4&
|  &

al colocar h estamos especificando, que a continuacion se pondra un valor hexadecimal.

  

 
 

Ahora, se preguntaran, en las variabes, siempre usamos los signos %


Como imprimes uno?

veamos:

Código
ó|  
| &7

| 
7BOLA

 
  


|  &

  
 
|  &

 
|  &

 
 



|  &


|  

|  

|  


En resumen, si quieren imprimir, el caracter %, deben colocarlo 2 veces.

Para otros caracteres, que ejecutan alguna accion en batch como:


&
|
<
x

debes colocar este caracter antes:^

por ejemplo:

Código
|  ." ."B ."."    &$"

no funcionara, pero:

Código
|  @." @@."@B @."@@." @   &$"

dara:

Código

C:\D
      \A   \ 
 !   &$"
." ."B ."." 




 

Tenemos otras variables de entorno que podrian servir, ademas de las comunes de
ALLUSERSPROFILE y HOMEPATH, por ejemplo:

Código
ó|  
|  D  A 
 : CD
|  0 ": DA1*
|  B: 1IM*
|  /
 A : RA/DOM

dara como resultado:

Código
C:\D
      \A   \ 
  
D  A 
 : C: \D
      \A   \ 

0 ": L

B: ::$
/
 A : 

C:\D
      \A   \ 
  
D  A 
 : C: \D
      \A   \ 

0 ": L

B: ::$
/
 A : 

Otras instrucciones muy utiles, serian POPD y PUSHD, que sirven para guardar y regresar al
directorio actual, por ejemplo:

Código
ó|  
|  CD
 \
|  CD
 
|  CD

PUSHD funciona de la siguiente manera:

Guarda el directorio actual., y va a la ruta especificada.

POPD regresa al directorio guardado por PUSHD

podemos usarlos uno dentro de otro, asi:

Código
ó|  
|  CD
 \
|  CD
 " "
|  CD
 
|  CD
 
|  CD



If, reconoce varias situaciones:

valores de error
comparar cadenas
existencia de archivos
comparaciones matematicas

como ya sabemos %ERRORLEVEL% almacena algunos valores de otras funciones.


al hacer

IF ERRORLEVEL 1 @echo ok ELSE @echo no

estariamos preguntando si ERRORLEVEL es 1, si lo es imprime OK, si no, imprime NO.

tambien podemos comparar cadenas, por ejemplo:

Código
ó|  
 33773" 3 |  " 

usamos %~1 para que aunque el usuario ponga comillas, no salga error

Código
ó|  
 I 33773" 3 |  " 

este codigo, solo responde si dices hola CON minusculas. /I es para hacer mas estricta la
comparacion.

ahora, podemos usar IF en varias lineas:

Código
ó|  
    & ë
|  *<I1*C
  ë
|  /O *<I1*

con parentesis ().

si vamos a usar comparaciones numericas, debemos usar los siguientes codigos de


comparación:

Código

  

   

   +

   +
 

  ! +

  ! +
 


por ejemplo:
Código
ó|  
|  C
  
6
 P 7
     ë
|  *R* MAYOR D* *DAD
  ë
|  /O *R* MAYOR D* *DAD

que regresa:

Código
C:\D
      \A   \ 
  
C
  
6

*R* MAYOR D* *DAD

C:\D
      \A   \ 
  
C
  
6

/O *R* MAYOR D* *DAD

Tambien podemos saber si una variable ya fue definida:

Código
  # ë
|  I
  ë
|  /O



FOR es una herramienta muy completa, nos permite analizar segmentos de la salida de
comandos, funciones y el contenido de archivos.

Tambien permite hacer bucles de la siguiente manera:

Código
 L #  ë  '  '  ë  

inicio, es el valor inicial, incremento es la cantidad a sumar, y fin es la cantidad a detenerse,


por ejemplo:

Código
 L   ë''  ë|  
imprimira 0 1 2 3 4 5 6 7 8 9 10

sinembargo, la forma mas sencilla de usar FOR, es para numerar archivos, y hacer algo con
ellos.. por ejemplo:

Código
 &  ë&4  |  &
mostrará todos los archivos que empiezan con x.

para SOLO mostrar directorios:

Código

 D &  ë 4  |  &


el modificador "/D", mostrará solo los directorios, que empiesen con m.

El comando se puede hacer "recursivo", es decir, que se ejecute dentro de cada directorio,
con el comando "/R", por ejemplo, en una estructura de directorios como la siguiente:

Código
89:89:89:89:
89: 89:89:89:89: 
89: 89:89:89:89:&&
89:89:89:89:" 

al ejecutar el comando:

Código

 R D &  ë4  |  &


C:\
C:\\ 

sinembargo, al ejecutar el comando..

Código

 R &  ë4&4  |  &


C:\&$&
C:\\&$&
C:\\ww&$&
C:\\ \kk&$&
C:\\ \&&\&&$&
C:\" \&$&
C:\" \&$&

nos mostrara todos los archivos que coinciden con la sequencia especificada, incluso
podriamos hacer un buscador en batch, con el uso de FINDSTR y FOR.

Tenemos otro modificador, /F que nos permite usar ciertas opciones para separar el resulado
de las acciones.. comandos, cadenas, o archivos. Su sintaxis es la siguiente:
Código
 0 D3  3E #  ë  F
  ë  

conjunto puede ser:


conjunto de archivos -x sin comillas
cadena de caracteres -x con comillas dobles (" ")
comando -x con comilla simple (' ')

las opciones son las siguientes:


eol -x todo lo que este despues de este caracter sera ignorado (para cada linea)
skip -x numero de lineas a saltarse al principio del archivo/comando.
delims -x esto sirve para separar las strings.. si no se coloca esta opcion, se usaran como
separadores "espacio" y "tab"
tokens -x esto es para especificar cuales segementos, delimitados por "delims", seran pasados
a las variables.. por ejemplo:
1,2,3
solo pasara los primeros 3 segmentos.
1,2*
pasara 2 segmentos, el primero y todo lo que este despues (el * regresa todo el resto de la
linea)
1,2-6,8,9*
regresara 4 segmentos, el primero, desde el segundo hasta el sexto, el octavo y el resto de la
linea, despues del noveno, el signo de menos (-) genera intervalos.

por ultimo, esta la opcion:


usebackq -x que cambia la forma de interpretar si es string o comando, de la siguiente manera:
'cadena'
`comando`

Nota: [`] es diferente al caracter de acento [´]

por ejemplo, el siguiente comando:

Código
 0 3k 7' ''4   7 3   ë3G     #'
 %  '       $3  |   F k 
 '       +

dara de resultado:

Código

G    #'   '         $




El uso de argumentos, de etiquetas y de filtros nos ayuda mucho al momento de escribir un


código.

Muchos creen que las etiquetas solo sirven para los goto.. sin embargo una etiqueta puede
servir de funcion y recibir parámetros.

miren, el siguiente programa:

Código

ó|  
:
   
:
 4
:*O0
: 
|  *! :  &@ 4

al ser llamado, por ejemplo en:

Código

C:\ F  
*! : F  $% :
   
*! : F  $% :

el primero muestra los parámetros enviados por el batch (1 2 3), y el segundo los parámetros
enviados al programa.
en este otro ejemplo:

Código

C:\ F   BOLA MU/DO


*! : F  $% :
   
*! : F  $% :
 BOLA MU/DO
la funcion obtiene también los argumentos del programa.

hasta ahora.. todo es igual a usar goto a excepción del uso de argumentos, sin embargo.. si
queremos hacer un.. "return", se hace usando:
:*O0
entonces, en situaciones como:

Código

ó|  8 :  8:*O0

:
| A  7 > 
|   
:*O0

: |
| A  7  
|   
:*O0

: 
| A  7 4 
|   
:*O0

:
| P 7* % 
   
 
|  
|  

 :
:
 

|  
  :
:  

|  

 :
:
   

:*O0

como podemos ver goto:EOF se usa para regresar al orden de comandos.

el resultado es algo asi:

Código
C:\   
* % 
   
   
 


 :


  :



 :


 

Para hacer un "include" oincluir un archivo, solo debes llamarlo asi:


archivo_a_incluir.bat funcion argumentos
y en el archivo a incluir, debe de estar al principio:    

queda algo asi:

Código

ó|  8 :48:*O0
: 
$$$
: !
$$$

por ejemplo:

--inclu.bat--

Código

ó|  8 :48:*O0

: "|#
|  999999999999999
|  9 B " : 9
|  9  k  9
|  999999999999999
:*O0

:
| 
:
|   & / %
:*O0

:" |
|  B  4
:*O0

--inicio.bat--

Código

ó|  
 337733 ë

$% % (

$%

|| ë

$%  % 

esto daria este resultado:

Código
C:\  
999999999999999
9 B " : 9
9  k  9
999999999999999

:

$% / %

C:\    k 
B   k 

C:\
ß

Algunos filtros y comandos interesantes:

i    A 

muestra el resultado del comando de forma paginada

i    A 

muestra el resultado del comando de forma ordenada

i 1I1L* 3 3

cambia el titulo de la ventana de CMD

i U-1 
 
   D H
E

asgina a letra_unidad la ruta de acceso

i 0I/D 3  3

busca cierta cadena en un archivo (se puede usar como filtro), con el modificador /v encuentra
solo las que NO tienen la linea especificada. (para mas info, escribe en CMD: FIND /?)

i 0I/D1R

extension de FIND, acepta expresiones regulares, y busqueda general (lo mas parecido que
DOS tiene a grep), descripción detallada:
Código

-
      "#$

0I/D1R D-E D*E DLE DRE DE DIE D<E DIE D/E DME DOE DPE
D0: "#E
DC:  E DG: "#E DD:    E DA:%
 
 E
D  E DD
:ED
E  %   "#D $$$EE

- B       J     


K $
* B       J      K $
L L  
 (    %,+
$
R U (    %,+
   &    
 $
 -
   "# +
      
 !

 
% $
I *   +
 %,+
   
!,
 
 ,
$
< I  K  +
   & 
$
I ?    K  +
  
    $
/ I  ,    K       K  +

  $
M ?     %   "#   "#  


   $
O I 
J      (        K 
+

  $
P O   "#      +
    % 
A: *   %
      K
" &   $ I 
3   63
0: "# L     "#    "#   
ë       $
C:   U (
       
 %,+
 
 
  $
G: "# CF  %,+
   "#    "#
  
ë       $
D:à -
 
   
 !         
 
  1 & +
  % %
 $
D
:ED
E  %   "#
*  
 "#   "# +
%
 $

U (      ,      %,+


    
+


 #
 F  C$ P F  ' L0I/D1R 3+
=  3
&$!L
%
  3+
=3  3 3  "# &$!$ L0I/D1R C:3+
=  3 &$!L
%
 
3+
=  3  "# &$!$

*& ?  
      J:
$ C K :
 +
  J  
4 R  :   J 
  
J    #  

@ P ?  K :   (   K 
M P ?  K :   K 
D  E C   J  :
 +
  J     
D@ E C   # :
 +
  J   +
 =   
D&!E I  # :
 +
  J   +
=   à|   # 
  
\& *  :
   
 J   &
\.&!( P ?   %:     %
&!(\ P ?   %:    %

P % 
    ? J    % &    
 

0I/D1R     C        C   K $

i  3
 #  
#3 DOPCIO/*E    

START tiene mas opciones de las que son usadas comunmente.
"titulo ventana nueva" especifica el titulo de la ventana que se generará.

las opciones entre otros contienen:


/Druta - el programa inicia en el directorio..
/B - la aplicación se inicia sin ventana
/I - se inicia la aplicacion con el entorno original, es decir las modificaciones al entrono hechas
en esta sesion, no afectaran el nuevo programa
/MIN - La nueva ventana se inicia minimisada
/MAX - La nueva ventana se inicia maximisada
/SEPARATE - El programa se inicia en una zona de memoria separada
/SHARED - El programa se inicia en una zona de memoria compartida

Iniciar en prioridades:

/LOW - baja
/NORMAL - normal
/HIGH - alta
/REALTIME - tiempo real
/ABOVENORMAL - sobre lo normal
/BELOWNORMAL - debajo de lo normal

/WAIT - Inicia el programa, y espera hasta que termine de ejecutarse

por ejemplo, si quieren abrir un programa sin generar una ventana, por ejemplo netcat,
podrian hacer algo asi:

 - *PARA1* B IGB I D NI/DIR L   A &

que lo inicia en una zona de memoria separada, con prioridad alta, en el contexto original, y en
%windir%


EOF es una etiqueta que define el fin del archivo, sirve para terminar funciones, y en este caso,
solo sirve para terminar el documento , espero les sirva

http://foro.elhacker.net/scripting/programacion_batch_avanzada_nuevo-
t132924.0.html#ixzz1FoNkFuNe